mirror of https://github.com/MISP/MISP
chg: [internal] Error handling when converting MISP2STIX
parent
a2fa480568
commit
d052caf60d
|
@ -11,7 +11,7 @@ class Stix1Export extends StixExport
|
|||
{
|
||||
return [
|
||||
ProcessTool::pythonBin(),
|
||||
$this->__framing_script,
|
||||
self::FRAMING_SCRIPT,
|
||||
'stix1',
|
||||
'-s', $this->__scope,
|
||||
'-v', $this->__version,
|
||||
|
@ -25,7 +25,7 @@ class Stix1Export extends StixExport
|
|||
{
|
||||
$command = [
|
||||
ProcessTool::pythonBin(),
|
||||
$this->__scripts_dir . 'misp2stix.py',
|
||||
self::SCRIPTS_DIR . 'misp2stix.py',
|
||||
'-s', $this->__scope,
|
||||
'-v', $this->__version,
|
||||
'-f', $this->__return_format,
|
||||
|
@ -33,6 +33,10 @@ class Stix1Export extends StixExport
|
|||
'-i',
|
||||
];
|
||||
$command = array_merge($command, $this->__filenames);
|
||||
return ProcessTool::execute($command, null, true);
|
||||
try {
|
||||
return ProcessTool::execute($command, null, true);
|
||||
} catch (ProcessException $e) {
|
||||
return $e->stdout();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,16 +11,20 @@ class Stix2Export extends StixExport
|
|||
{
|
||||
return [
|
||||
ProcessTool::pythonBin(),
|
||||
$this->__framing_script,
|
||||
self::FRAMING_SCRIPT,
|
||||
'stix2',
|
||||
'-v', $this->__version,
|
||||
'--uuid', CakeText::uuid(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function __parse_misp_data()
|
||||
{
|
||||
$scriptFile = $this->__scripts_dir . 'stix2/misp2stix2.py';
|
||||
$scriptFile = self::SCRIPTS_DIR . 'stix2/misp2stix2.py';
|
||||
$command = [
|
||||
ProcessTool::pythonBin(),
|
||||
$scriptFile,
|
||||
|
@ -28,7 +32,11 @@ class Stix2Export extends StixExport
|
|||
'-i',
|
||||
];
|
||||
$command = array_merge($command, $this->__filenames);
|
||||
$result = ProcessTool::execute($command, null, true);
|
||||
try {
|
||||
$result = ProcessTool::execute($command, null, true);
|
||||
} catch (ProcessException $e) {
|
||||
$result = $e->stdout();
|
||||
}
|
||||
$result = preg_split("/\r\n|\n|\r/", trim($result));
|
||||
return end($result);
|
||||
}
|
||||
|
|
|
@ -6,13 +6,14 @@ App::uses('ProcessTool', 'Tools');
|
|||
|
||||
abstract class StixExport
|
||||
{
|
||||
const SCRIPTS_DIR = APP . 'files/scripts/',
|
||||
FRAMING_SCRIPT = APP . 'files/scripts/misp_framing.py';
|
||||
|
||||
public $additional_params = array(
|
||||
'includeEventTags' => 1,
|
||||
'includeGalaxy' => 1
|
||||
);
|
||||
protected $__return_format = 'json';
|
||||
protected $__scripts_dir = APP . 'files/scripts/';
|
||||
protected $__framing_script = APP . 'files/scripts/misp_framing.py';
|
||||
protected $__return_type = null;
|
||||
|
||||
/** @var array Full paths to files to convert */
|
||||
|
|
|
@ -78,9 +78,13 @@ class StixExport:
|
|||
if self._parser.errors:
|
||||
self._handle_errors()
|
||||
print(json.dumps(results))
|
||||
|
||||
except Exception as e:
|
||||
print(json.dumps({'error': e.__str__()}))
|
||||
error = type(e).__name__ + ': ' + e.__str__()
|
||||
print(json.dumps({'error': error}))
|
||||
traceback.print_tb(e.__traceback__)
|
||||
print(error, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
class StixAttributesExport(StixExport):
|
||||
|
@ -157,19 +161,23 @@ class StixEventsExport(StixExport):
|
|||
|
||||
if __name__ == "__main__":
|
||||
argparser = argparse.ArgumentParser(description='Export MISP into STIX1.')
|
||||
argparser.add_argument('-s', '--scope', default='Event', choices=['Attribute', 'Event'], help='Scope: which kind of data is exported.')
|
||||
argparser.add_argument('-v', '--version', default='1.1.1', choices=['1.1.1', '1.2'], help='STIX version (1.1.1 or 1.2).')
|
||||
argparser.add_argument('-f', '--format', default='xml', choices=['json', 'xml'], help='Output format (xml or json).')
|
||||
argparser.add_argument('-s', '--scope', default='Event', choices=('Attribute', 'Event'), help='Scope: which kind of data is exported.')
|
||||
argparser.add_argument('-v', '--version', default='1.1.1', choices=('1.1.1', '1.2'), help='STIX version (1.1.1 or 1.2).')
|
||||
argparser.add_argument('-f', '--format', default='xml', choices=('json', 'xml'), help='Output format (xml or json).')
|
||||
argparser.add_argument('-i', '--input', nargs='+', help='Input file(s) containing MISP standard format.')
|
||||
argparser.add_argument('-o', '--orgname', default='MISP', help='Default Org name to use if no Orgc value is provided.')
|
||||
argparser.add_argument('-d', '--debug', action='store_true', help='Allow debug mode with warnings.')
|
||||
try:
|
||||
args = argparser.parse_args()
|
||||
if args.input is None:
|
||||
print(json.dumps({'error': 'No input file provided.'}))
|
||||
else:
|
||||
arguments = (args.orgname, args.format, args.version, args.debug)
|
||||
exporter = globals()[f'Stix{args.scope}sExport'](*arguments)
|
||||
exporter.parse_misp_files(args.input)
|
||||
except SystemExit:
|
||||
print(json.dumps({'error': 'Arguments error, please check you entered a valid version and provided input file names.'}))
|
||||
sys.exit(1)
|
||||
|
||||
if args.input is None:
|
||||
print(json.dumps({'error': 'No input file provided.'}))
|
||||
sys.exit(1)
|
||||
|
||||
arguments = (args.orgname, args.format, args.version, args.debug)
|
||||
exporter = globals()[f'Stix{args.scope}sExport'](*arguments)
|
||||
exporter.parse_misp_files(args.input)
|
||||
sys.exit(0)
|
||||
|
|
|
@ -49,14 +49,14 @@ def _process_misp_files(
|
|||
version: str, input_names: Union[list, None], debug: bool):
|
||||
if input_names is None:
|
||||
print(json.dumps({'error': 'No input file provided.'}))
|
||||
return
|
||||
sys.exit(1)
|
||||
try:
|
||||
parser = MISPtoSTIX20Parser() if version == '2.0' else MISPtoSTIX21Parser()
|
||||
for name in input_names:
|
||||
parser.parse_json_content(name)
|
||||
with open(f'{name}.out', 'wt', encoding='utf-8') as f:
|
||||
f.write(
|
||||
f'{json.dumps(parser.stix_objects, cls=STIXJSONEncoder)}'
|
||||
json.dumps(parser.stix_objects, cls=STIXJSONEncoder)
|
||||
)
|
||||
if parser.errors:
|
||||
_handle_messages('Errors', parser.errors)
|
||||
|
@ -64,8 +64,11 @@ def _process_misp_files(
|
|||
_handle_messages('Warnings', parser.warnings)
|
||||
print(json.dumps({'success': 1}))
|
||||
except Exception as e:
|
||||
print(json.dumps({'error': e.__str__()}))
|
||||
error = type(e).__name__ + ': ' + e.__str__()
|
||||
print(json.dumps({'error': error}))
|
||||
traceback.print_tb(e.__traceback__)
|
||||
print(error, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@ -84,7 +87,6 @@ if __name__ == "__main__":
|
|||
)
|
||||
try:
|
||||
args = argparser.parse_args()
|
||||
_process_misp_files(args.version, args.input, args.debug)
|
||||
except SystemExit:
|
||||
print(
|
||||
json.dumps(
|
||||
|
@ -94,3 +96,7 @@ if __name__ == "__main__":
|
|||
}
|
||||
)
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
_process_misp_files(args.version, args.input, args.debug)
|
||||
sys.exit(0)
|
||||
|
|
Loading…
Reference in New Issue