Source code for dfimagetools.helpers.command_line

# -*- coding: utf-8 -*-
"""Command line argument helper functions."""

import codecs

from dfvfs.helpers import command_line as dfvfs_command_line
from dfvfs.helpers import volume_scanner as dfvfs_volume_scanner

from dfimagetools.helpers import backend as backend_helper


SUPPORTED_CREDENTIAL_TYPES = frozenset([
    'key_data', 'password', 'recovery_password', 'startup_key'])


[docs] def AddStorageMediaImageCLIArguments(argument_parser): """Adds storage media image command line arguments. Args: argument_parser (argparse.ArgumentParser): argument parser. """ argument_parser.add_argument( '--back_end', '--back-end', dest='back_end', action='store', metavar='NTFS', default=None, help='preferred dfVFS back-end.') credential_types = ', '.join(sorted(SUPPORTED_CREDENTIAL_TYPES)) argument_parser.add_argument( '--credential', action='append', default=[], type=str, dest='credentials', metavar='TYPE:DATA', help=( f'Define a credentials that can be used to unlock encrypted ' f'volumes e.g. BitLocker. A credential is defined as type:data ' f'e.g. "password:BDE-test". Supported credential types are: ' f'{credential_types:s}. Binary key data is expected to be passed ' f'in BASE-16 encoding (hexadecimal). WARNING credentials passed ' f'via command line arguments can end up in logs, so use this ' f'option with care.')) argument_parser.add_argument( '--partitions', '--partition', dest='partitions', action='store', type=str, default=None, help=( 'Define partitions to be processed. A range of partitions can be ' 'defined as: "3..5". Multiple partitions can be defined as: "1,3,5" ' '(a list of comma separated values). Ranges and lists can also be ' 'combined as: "1,3..5". The first partition is 1. All partitions ' 'can be specified with: "all".')) argument_parser.add_argument( '--snapshots', '--snapshot', dest='snapshots', action='store', type=str, default=None, help=( 'Define snapshots to be processed. A range of snapshots can be ' 'defined as: "3..5". Multiple snapshots can be defined as: "1,3,5" ' '(a list of comma separated values). Ranges and lists can also be ' 'combined as: "1,3..5". The first snapshot is 1. All snapshots can ' 'be specified with: "all".')) argument_parser.add_argument( '--volumes', '--volume', dest='volumes', action='store', type=str, default=None, help=( 'Define volumes to be processed. A range of volumes can be defined ' 'as: "3..5". Multiple volumes can be defined as: "1,3,5" (a list ' 'of comma separated values). Ranges and lists can also be combined ' 'as: "1,3..5". The first volume is 1. All volumes can be specified ' 'with: "all".'))
[docs] def ParseStorageMediaImageCLIArguments(options): """Parses storage media image command line arguments. Args: options (argparse.Namespace): command line arguments. Returns: tuple[dfvfs.CLIVolumeScannerMediator, dfvfs.VolumeScannerOptions]: dfVFS volume scanner mediator and options. Raises: RuntimeError: when the options are invalid. """ back_end = getattr(options, 'back_end', None) credentials = getattr(options, 'credentials', []) partitions = getattr(options, 'partitions', None) snapshots = getattr(options, 'snapshots', None) volumes = getattr(options, 'volumes', None) backend_helper.SetDFVFSBackEnd(back_end) mediator = dfvfs_command_line.CLIVolumeScannerMediator() volume_scanner_options = dfvfs_volume_scanner.VolumeScannerOptions() for credential_string in credentials: credential_type, _, credential_data = credential_string.partition(':') if not credential_type or not credential_data: raise RuntimeError(f'Unsupported credential: {credential_string:s}.') if credential_type not in SUPPORTED_CREDENTIAL_TYPES: raise RuntimeError( f'Unsupported credential type for: {credential_string:s}.') if credential_type == 'key_data': try: credential_data = codecs.decode(credential_data, 'hex') except TypeError: raise RuntimeError( f'Unsupported credential data for: {credential_string:s}.') credential_tuple = (credential_type, credential_data) volume_scanner_options.credentials.append(credential_tuple) volume_scanner_options.partitions = mediator.ParseVolumeIdentifiersString( partitions) if snapshots == 'none': volume_scanner_options.snapshots = ['none'] else: volume_scanner_options.snapshots = mediator.ParseVolumeIdentifiersString( snapshots) volume_scanner_options.volumes = mediator.ParseVolumeIdentifiersString( volumes) return mediator, volume_scanner_options