diff options
Diffstat (limited to 'module')
| -rw-r--r-- | module/plugins/hooks/AntiVirus.py | 72 | 
1 files changed, 48 insertions, 24 deletions
| diff --git a/module/plugins/hooks/AntiVirus.py b/module/plugins/hooks/AntiVirus.py index b58d0b61d..d7ec69031 100644 --- a/module/plugins/hooks/AntiVirus.py +++ b/module/plugins/hooks/AntiVirus.py @@ -10,23 +10,25 @@ except ImportError:      pass  from module.plugins.internal.Addon import Addon, Expose, threaded +from module.plugins.internal.Plugin import exists  from module.utils import fs_encode, save_join as fs_join  class AntiVirus(Addon):      __name__    = "AntiVirus"      __type__    = "hook" -    __version__ = "0.12" +    __version__ = "0.13"      __status__  = "testing"      #@TODO: add trash option (use Send2Trash lib) -    __config__ = [("action"    , "Antivirus default;Delete;Quarantine", "Manage infected files"                     , "Antivirus default"), -                  ("quardir"   , "folder"                             , "Quarantine folder"                         , ""                 ), -                  ("deltotrash", "bool"                               , "Move to trash (recycle bin) instead delete", True               ), -                  ("scanfailed", "bool"                               , "Scan incompleted files (failed downloads)" , False              ), -                  ("cmdfile"   , "file"                               , "Antivirus executable"                      , ""                 ), -                  ("cmdargs"   , "str"                                , "Scan options"                              , ""                 ), -                  ("ignore-err", "bool"                               , "Ignore scan errors"                        , False              )] +    __config__ = [("action"    , "Antivirus default;Delete;Quarantine", "Manage infected files"       , "Antivirus default"), +                  ("quardir"   , "folder"                             , "Quarantine folder"           , ""                 ), +                  ("deltotrash", "bool"                               , "Move to trash instead delete", True               ), +                  ("scanfailed", "bool"                               , "Scan failed downloads"       , False              ), +                  ("avfile"    , "file"                               , "Antivirus executable"        , ""                 ), +                  ("avargs"    , "str"                                , "Executable arguments"        , ""                 ), +                  ("avtarget"  , "file;folder"                        , "Scan target"                 , "file"             ), +                  ("ignore-err", "bool"                               , "Ignore scan errors"          , False              )]      __description__ = """Scan downloaded files with antivirus program"""      __license__     = "GPLv3" @@ -36,12 +38,24 @@ class AntiVirus(Addon):      @Expose      @threaded      def scan(self, pyfile, thread): -        file     = fs_encode(pyfile.plugin.last_download) -        filename = os.path.basename(pyfile.plugin.last_download) -        cmdfile  = fs_encode(self.get_config('cmdfile')) -        cmdargs  = fs_encode(self.get_config('cmdargs').strip()) +        avfile = fs_encode(self.get_config('avfile')) +        avargs = fs_encode(self.get_config('avargs').strip()) -        if not os.path.isfile(file) or not os.path.isfile(cmdfile): +        if not os.path.isfile(avfile): +            self.fail(_("Antivirus executable not found")) + +        scanfolder = self.get_config('avtarget') is "folder" + +        if scanfolder: +            download_folder = self.pyload.config.get("general", "download_folder") +            package_folder  = pyfile.package().folder if self.pyload.config.get("general", "folder_per_package") else "" +            target      = fs_join(download_folder, package_folder, pyfile.name) +            target_repr = "Folder: " + package_folder or download_folder +        else: +            target      = fs_encode(pyfile.plugin.last_download) +            target_repr = "File: " + os.path.basename(pyfile.plugin.last_download) + +        if not exists(target):              return          thread.addActive(pyfile) @@ -49,24 +63,34 @@ class AntiVirus(Addon):          pyfile.setProgress(0)          try: -            p = subprocess.Popen([cmdfile, cmdargs, file], bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +            p = subprocess.Popen([avfile, avargs, target], +                                 bufsize=-1, +                                 stdout=subprocess.PIPE, +                                 stderr=subprocess.PIPE)              out, err = map(str.strip, p.communicate())              if out: -                self.log_info(filename, out) +                self.log_info(target_repr, out)              if err: -                self.log_warning(filename, err) +                self.log_warning(target_repr, err)                  if not self.get_config('ignore-err'): -                    self.log_debug("Delete/Quarantine task is aborted") +                    self.log_debug("Delete/Quarantine task aborted due scan error")                      return              if p.returncode: -                pyfile.error = _("Infected file")                  action = self.get_config('action') + +                if scanfolder: +                    if action is "Antivirus default": +                        self.log_warning(_("Delete/Quarantine task skipped in folder scan mode") +                    return + +                pyfile.error = _("Infected file") +                  try: -                    if action == "Delete": +                    if action is "Delete":                          if not self.get_config('deltotrash'):                              os.remove(file) @@ -87,15 +111,15 @@ class AntiVirus(Addon):                              else:                                  self.log_debug("Successfully moved file to trash") -                    elif action == "Quarantine": +                    elif action is "Quarantine":                          pyfile.setCustomStatus(_("file moving"))                          shutil.move(file, self.get_config('quardir'))                  except (IOError, shutil.Error), e: -                    self.log_error(filename, action + " action failed!", e) +                    self.log_error(target_repr, action + " action failed!", e) -            elif not out and not err: -                self.log_debug(filename, "No infected file found") +            elif not err: +                self.log_debug(target_repr, "No infected file found")          finally:              pyfile.setProgress(100) @@ -108,5 +132,5 @@ class AntiVirus(Addon):      def download_failed(self, pyfile):          #: Check if pyfile is still "failed", maybe might has been restarted in meantime -        if pyfile.status == 8 and self.get_config('scanfailed'): +        if pyfile.status is 8 and self.get_config('scanfailed'):              return self.scan(pyfile) | 
