22# PYTHON_ARGCOMPLETE_OK
33
44import argparse
5+ import contextlib
56import functools
67import logging
78import pathlib
89import sys
910from typing import Callable , Any , Dict , Tuple , Optional
1011
11- from uiucprescon .tripwire import validation , utils , manifest_check , metadata
12- from uiucprescon .tripwire .files import InvalidFileFormat
12+ from uiucprescon .tripwire import (
13+ validation ,
14+ utils ,
15+ manifest_check ,
16+ metadata ,
17+ introspection ,
18+ )
19+ from uiucprescon .tripwire .exceptions import InvalidFileFormat
1320import argcomplete
1421
1522logger = logging .getLogger (__name__ )
@@ -121,10 +128,22 @@ def get_arg_parser() -> Tuple[
121128
122129 metadata_show_show .add_argument ("glob" , type = str )
123130
124- metadata_validate = metadata_parser .add_parser ("validate" )
131+ metadata_validate = metadata_parser .add_parser (
132+ "validate" , help = "validate files from mediaconch policy"
133+ )
125134 metadata_validate .add_argument ("policy_file" , type = pathlib .Path )
126135 metadata_validate .add_argument ("glob" , type = str )
127-
136+ metadata_validate .add_argument (
137+ "-v" ,
138+ "--verbose" ,
139+ action = "count" ,
140+ default = 1 ,
141+ help = "increase output verbosity" ,
142+ dest = "verbosity" ,
143+ )
144+ sub_commands .add_parser (
145+ "info" , help = "get information about current version of tripwire"
146+ )
128147 return (
129148 parser ,
130149 {
@@ -142,14 +161,56 @@ def metadata_show_command(args: argparse.Namespace) -> None:
142161 metadata .show_metadata (args .glob , search_path = pathlib .Path ("." ))
143162
144163
164+ @contextlib .contextmanager
165+ def module_logging_verbosity (logger , verbosity = logging .INFO ):
166+ """Set logging level to verbosity for a module.
167+
168+ This is useful for setting the logging level for a module to a specific
169+ level for the duration of a block of code, and then resetting it back after
170+ leaving the decorated function's scope.
171+ """
172+ starting_verbosity = logger .getEffectiveLevel ()
173+ handler_levels = {}
174+ try :
175+ logger .setLevel (verbosity )
176+ for handler in logger .handlers :
177+ handler_levels [handler .name ] = handler .level
178+ handler .setLevel (verbosity )
179+ yield
180+ finally :
181+ logger .setLevel (starting_verbosity )
182+ for handler in logger .handlers :
183+ if handler .name in handler_levels :
184+ handler .setLevel (handler_levels [handler .name ])
185+
186+
145187@capture_log (logger = metadata .logger )
146- def metadata_validate_command (args : argparse .Namespace ) -> None :
188+ def metadata_validate_command (
189+ args : argparse .Namespace ,
190+ validate_metadata_strategy = metadata .validate_metadata ,
191+ ) -> None :
147192 """Run metadata validate command."""
148- if not metadata .validate_metadata (
149- args .glob , policy_xml_file = args .policy_file
193+
194+ def get_log_level (verbosity : int ) -> int :
195+ if verbosity > 2 :
196+ print ("verbosity level to max, defaulting to DEBUG" )
197+ return logging .DEBUG
198+ else :
199+ match args .verbosity :
200+ case 1 :
201+ return logging .INFO
202+ case 2 :
203+ return logging .DEBUG
204+ return logging .INFO
205+
206+ with module_logging_verbosity (
207+ metadata .logger , verbosity = get_log_level (args .verbosity )
150208 ):
151- print ("failed metadata validation" )
152- sys .exit (1 )
209+ if not validate_metadata_strategy (
210+ args .glob , policy_xml_file = args .policy_file
211+ ):
212+ print ("failed metadata validation" )
213+ sys .exit (1 )
153214
154215 print ("passed metadata validation" )
155216
@@ -165,6 +226,11 @@ def metadata_command(args: argparse.Namespace, subcommand: str) -> None:
165226 raise ValueError (f"Unknown metadata subcommand: { subcommand } " )
166227
167228
229+ def show_info_command () -> None :
230+ """Show info about application."""
231+ print (introspection .get_application_info ())
232+
233+
168234def main () -> None :
169235 """Main entry point for the Tripwire command line interface."""
170236 parser , print_help_commands = get_arg_parser ()
@@ -182,6 +248,8 @@ def main() -> None:
182248 )
183249 case "metadata" :
184250 metadata_command (args , args .metadata_command )
251+ case "info" :
252+ show_info_command ()
185253
186254
187255if __name__ == "__main__" :
0 commit comments