2525import argparse
2626import os
2727import sys
28+ import traceback
2829from dataclasses import asdict
2930from pathlib import Path
3031from typing import List
3132
3233import pypac
3334
3435from scanoss .cryptography import Cryptography , create_cryptography_config_from_args
36+ from scanoss .export .dependency_track import (
37+ DependencyTrackExporter ,
38+ create_dependency_track_exporter_config_from_args ,
39+ )
3540from scanoss .inspection .component_summary import ComponentSummary
3641from scanoss .inspection .license_summary import LicenseSummary
3742from scanoss .scanners .container_scanner import (
@@ -553,13 +558,17 @@ def setup_args() -> None: # noqa: PLR0912, PLR0915
553558 ####### INSPECT: License Summary ######
554559 # Inspect Sub-command: inspect license summary
555560 p_license_summary = p_inspect_sub .add_parser (
556- 'license-summary' , aliases = ['lic-summary' , 'licsum' ], description = 'Get license summary' ,
557- help = 'Get detected license summary from scan results'
561+ 'license-summary' ,
562+ aliases = ['lic-summary' , 'licsum' ],
563+ description = 'Get license summary' ,
564+ help = 'Get detected license summary from scan results' ,
558565 )
559566
560567 p_component_summary = p_inspect_sub .add_parser (
561- 'component-summary' , aliases = ['comp-summary' , 'compsum' ], description = 'Get component summary' ,
562- help = 'Get detected component summary from scan results'
568+ 'component-summary' ,
569+ aliases = ['comp-summary' , 'compsum' ],
570+ description = 'Get component summary' ,
571+ help = 'Get detected component summary from scan results' ,
563572 )
564573
565574 ####### INSPECT: Undeclared components ######
@@ -605,6 +614,36 @@ def setup_args() -> None: # noqa: PLR0912, PLR0915
605614
606615 ########################################### END INSPECT SUBCOMMAND ###########################################
607616
617+ # Sub-command: export
618+ p_export = subparsers .add_parser (
619+ 'export' ,
620+ aliases = ['exp' ],
621+ description = f'Export SBOM files to external platforms: { __version__ } ' ,
622+ help = 'Export SBOM files to external platforms' ,
623+ )
624+
625+ export_sub = p_export .add_subparsers (
626+ title = 'Export Commands' ,
627+ dest = 'subparsercmd' ,
628+ description = 'export sub-commands' ,
629+ help = 'export sub-commands' ,
630+ )
631+
632+ # Export Sub-command: export dt (Dependency Track)
633+ e_dt = export_sub .add_parser (
634+ 'dt' ,
635+ aliases = ['dependency-track' ],
636+ description = 'Export SBOM to Dependency Track' ,
637+ help = 'Upload SBOM files to Dependency Track' ,
638+ )
639+ e_dt .add_argument ('-i' , '--input' , type = str , required = True , help = 'Input SBOM file (CycloneDX JSON format)' )
640+ e_dt .add_argument ('--dt-url' , type = str , required = True , help = 'Dependency Track base URL' )
641+ e_dt .add_argument ('--dt-apikey' , type = str , required = True , help = 'Dependency Track API key' )
642+ e_dt .add_argument ('--dt-projectid' , type = str , help = 'Dependency Track project UUID' )
643+ e_dt .add_argument ('--dt-projectname' , type = str , help = 'Dependency Track project name' )
644+ e_dt .add_argument ('--dt-projectversion' , type = str , help = 'Dependency Track project version' )
645+ e_dt .set_defaults (func = export_dt )
646+
608647 # Sub-command: folder-scan
609648 p_folder_scan = subparsers .add_parser (
610649 'folder-scan' ,
@@ -858,6 +897,7 @@ def setup_args() -> None: # noqa: PLR0912, PLR0915
858897 p_crypto_algorithms ,
859898 p_crypto_hints ,
860899 p_crypto_versions_in_range ,
900+ e_dt ,
861901 ]:
862902 p .add_argument ('--debug' , '-d' , action = 'store_true' , help = 'Enable debug messages' )
863903 p .add_argument ('--trace' , '-t' , action = 'store_true' , help = 'Enable trace messages, including API posts' )
@@ -871,7 +911,8 @@ def setup_args() -> None: # noqa: PLR0912, PLR0915
871911 parser .print_help () # No sub command subcommand, print general help
872912 sys .exit (1 )
873913 elif (
874- args .subparser in ('utils' , 'ut' , 'component' , 'comp' , 'inspect' , 'insp' , 'ins' , 'crypto' , 'cr' )
914+ args .subparser
915+ in ('utils' , 'ut' , 'component' , 'comp' , 'inspect' , 'insp' , 'ins' , 'crypto' , 'cr' , 'export' , 'exp' )
875916 ) and not args .subparsercmd :
876917 parser .parse_args ([args .subparser , '--help' ]) # Force utils helps to be displayed
877918 sys .exit (1 )
@@ -1304,6 +1345,7 @@ def convert(parser, args):
13041345 if not success :
13051346 sys .exit (1 )
13061347
1348+
13071349################################ INSPECT handlers ################################
13081350def inspect_copyleft (parser , args ):
13091351 """
@@ -1381,16 +1423,17 @@ def inspect_undeclared(parser, args):
13811423 status , _ = i_undeclared .run ()
13821424 sys .exit (status )
13831425
1426+
13841427def inspect_license_summary (parser , args ):
13851428 """
1386- Run the "inspect" sub-command
1387- Parameters
1388- ----------
1389- parser: ArgumentParser
1390- command line parser object
1391- args: Namespace
1392- Parsed arguments
1393- """
1429+ Run the "inspect" sub-command
1430+ Parameters
1431+ ----------
1432+ parser: ArgumentParser
1433+ command line parser object
1434+ args: Namespace
1435+ Parsed arguments
1436+ """
13941437 if args .input is None :
13951438 print_stderr ('Please specify an input file to inspect' )
13961439 parser .parse_args ([args .subparser , args .subparsercmd , '-h' ])
@@ -1412,16 +1455,17 @@ def inspect_license_summary(parser, args):
14121455 )
14131456 i_license_summary .run ()
14141457
1458+
14151459def inspect_component_summary (parser , args ):
14161460 """
1417- Run the "inspect" sub-command
1418- Parameters
1419- ----------
1420- parser: ArgumentParser
1421- command line parser object
1422- args: Namespace
1423- Parsed arguments
1424- """
1461+ Run the "inspect" sub-command
1462+ Parameters
1463+ ----------
1464+ parser: ArgumentParser
1465+ command line parser object
1466+ args: Namespace
1467+ Parsed arguments
1468+ """
14251469 if args .input is None :
14261470 print_stderr ('Please specify an input file to inspect' )
14271471 parser .parse_args ([args .subparser , args .subparsercmd , '-h' ])
@@ -1440,8 +1484,42 @@ def inspect_component_summary(parser, args):
14401484 )
14411485 i_component_summary .run ()
14421486
1487+
14431488################################ End inspect handlers ################################
14441489
1490+
1491+ def export_dt (parser , args ):
1492+ """
1493+ Run the "export dt" sub-command
1494+ Parameters
1495+ ----------
1496+ parser: ArgumentParser
1497+ command line parser object
1498+ args: Namespace
1499+ Parsed arguments
1500+ """
1501+
1502+ try :
1503+ config = create_dependency_track_exporter_config_from_args (args )
1504+ dt_exporter = DependencyTrackExporter (
1505+ config = config ,
1506+ debug = args .debug ,
1507+ trace = args .trace ,
1508+ quiet = args .quiet ,
1509+ )
1510+
1511+ success = dt_exporter .upload_sbom (args .input )
1512+
1513+ if not success :
1514+ sys .exit (1 )
1515+
1516+ except Exception as e :
1517+ print_stderr (f'ERROR: { e } ' )
1518+ if args .debug :
1519+ traceback .print_exc ()
1520+ sys .exit (1 )
1521+
1522+
14451523def utils_certloc (* _ ):
14461524 """
14471525 Run the "utils certloc" sub-command
0 commit comments