diff --git a/maldump/__main__.py b/maldump/__main__.py index 228df84..7a9e761 100755 --- a/maldump/__main__.py +++ b/maldump/__main__.py @@ -48,8 +48,8 @@ def main() -> None: 'Working in directory "%s", files would be stored into "%s"', os.getcwd(), dest ) - # Get a list of all installed avs - avs = AVManager.detect() + # Get a list of all supported or all installed avs + avs = AVManager.detect() if args.detect_avs else AVManager.retrieve() logger.debug("Detected AVs: %s", [av.name for av in avs]) @@ -169,6 +169,12 @@ def parse_cli() -> argparse.Namespace: parser.add_argument( "-a", "--all", action="store_true", help="equivalent of running both -q and -m" ) + parser.add_argument( + "-c", + "--detect-avs", + action="store_false", + help="try only avs which were detected in the system", + ) parser.add_argument( "-t", "--log-level", diff --git a/maldump/av_manager.py b/maldump/av_manager.py index c7047ae..ca133f1 100755 --- a/maldump/av_manager.py +++ b/maldump/av_manager.py @@ -39,3 +39,8 @@ class AVManager: def detect(cls) -> list[Quarantine]: """Returns a list of avs installed on the system""" return [av for av in cls.avs if av.location.exists()] + + @classmethod + def retrieve(cls) -> list[Quarantine]: + """Returns a list of all supported avs""" + return cls.avs diff --git a/maldump/parsers/avast_parser.py b/maldump/parsers/avast_parser.py index 3013ed0..1aed838 100644 --- a/maldump/parsers/avast_parser.py +++ b/maldump/parsers/avast_parser.py @@ -29,8 +29,21 @@ def __init__(self): @log.log(lgr=logger) def __del__(self): if hasattr(self, "db"): - self.db.close() - unlink(self.tmpfile) + logger.debug( + "Deleting parser object, closing database file, unlinking tmp file" + ) + + if self.db is not None: + self.db.close() + + try: + logger.debug('Trying to delete temporary file "%s"', self.tmpfile) + if self.tmpfile is not None: + unlink(self.tmpfile) + except OSError as e: + logger.exception( + 'Cannot unlink temporary file "%s"', self.tmpfile, exc_info=e + ) @log.log(lgr=logger) def _initDB(self) -> bool: @@ -40,7 +53,7 @@ def _initDB(self) -> bool: 'Trying to parse index.xml file "%s"', self.location / "index.xml" ) self.root = ET.parse(self.location / "index.xml").getroot() - except ParseError as e: + except (ParseError, OSError) as e: logger.exception("Cannot open and parse index.xml", exc_info=e) return False diff --git a/maldump/parsers/avg_parser.py b/maldump/parsers/avg_parser.py index 06415d6..bb7ab53 100644 --- a/maldump/parsers/avg_parser.py +++ b/maldump/parsers/avg_parser.py @@ -29,8 +29,21 @@ def __init__(self): @log.log(lgr=logger) def __del__(self): if hasattr(self, "db"): - self.db.close() - unlink(self.tmpfile) + logger.debug( + "Deleting parser object, closing database file, unlinking tmp file" + ) + + if self.db is not None: + self.db.close() + + try: + logger.debug('Trying to delete temporary file "%s"', self.tmpfile) + if self.tmpfile is not None: + unlink(self.tmpfile) + except OSError as e: + logger.exception( + 'Cannot unlink temporary file "%s"', self.tmpfile, exc_info=e + ) @log.log(lgr=logger) def _initDB(self) -> bool: @@ -40,7 +53,7 @@ def _initDB(self) -> bool: 'Trying to parse index.xml file "%s"', self.location / "index.xml" ) self.root = ET.parse(self.location / "index.xml").getroot() - except ParseError as e: + except (ParseError, OSError) as e: logger.exception("Cannot open and parse index.xml", exc_info=e) return False