wxDialogUtils.py
上传用户:lswyart
上传日期:2008-06-12
资源大小:3441k
文件大小:10k
源码类别:

杀毒

开发平台:

Visual C++

  1. #-----------------------------------------------------------------------------
  2. # Name:        wxDialogUtils.py
  3. # Product:     ClamWin Free Antivirus
  4. #
  5. # Author:      alch [alch at users dot sourceforge dot net]
  6. #
  7. # Created:     2004/08/05
  8. # Copyright:   Copyright alch (c) 2004
  9. # Licence:     
  10. #   This program is free software; you can redistribute it and/or modify
  11. #   it under the terms of the GNU General Public License as published by
  12. #   the Free Software Foundation; either version 2 of the License, or
  13. #   (at your option) any later version.
  14. #   This program is distributed in the hope that it will be useful,
  15. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. #   GNU General Public License for more details.
  18. #   You should have received a copy of the GNU General Public License
  19. #   along with this program; if not, write to the Free Software
  20. #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. #-----------------------------------------------------------------------------
  22. import os, sys, tempfile, time, re
  23. import wxDialogStatus, wxDialogPreferences, wxDialogAbout, wxDialogCheckUpdate
  24. import wxDialogLogViewer
  25. from wxPython.wx import wxBitmap, wxTextCtrl
  26. from wxPython.lib.dialogs import wxScrolledMessageDialog
  27. import MsgBox, EmailAlert, Utils, version
  28. def wxUpdateVirDB(parent, config, autoClose = False):        
  29.     exit_code = -1
  30.     freshclam_conf = Utils.SaveFreshClamConf(config)
  31.     if not len(freshclam_conf):
  32.         MsgBox.ErrorBox(parent, 'Unable to create freshclam configutration file. Please check there is enough space on the disk')
  33.         return
  34.     updatelog = tempfile.mktemp()       
  35.     dbdir = config.Get('ClamAV', 'Database')
  36.     # create database folder before downloading
  37.     if not os.path.exists(dbdir):
  38.         try:
  39.             os.makedirs(dbdir)
  40.         except:
  41.             pass
  42.     cmd = '--stdout --datadir="' + dbdir.replace('\', '/') + '"' + 
  43.           ' --config-file="%s" --log="%s"' % (freshclam_conf, updatelog)
  44.     cmd = cmd.replace('\', '/')
  45.     if config.Get('ClamAV', 'Debug') == '1':
  46.         cmd += ' --debug'    
  47.     cmd = '"%s" %s' % (config.Get('ClamAV', 'FreshClam'), cmd)
  48.     if sys.platform.startswith('win') and config.Get('UI', 'TrayNotify') == '1':        
  49.         import win32gui
  50.         tray_notify_params = (('Virus Database has been updated.', 0, 
  51.                            win32gui.NIIF_INFO, 10000),
  52.                            ('An error occured during Virus Database Update. Please review the update report.', 1, 
  53.                            win32gui.NIIF_WARNING, 30000)
  54.                            )
  55.     else:
  56.         tray_notify_params = None
  57.     dlg = wxDialogStatus.create(parent, cmd, None, 'n', 'update', tray_notify_params)
  58.     dlg.SetTitle('ClamWin Free Antivirus: Downloading Update...')
  59.     dlg.SetAutoClose(autoClose)
  60.     try:
  61.         dlg.ShowModal()
  62.         exit_code = dlg.GetExitCode()
  63.         #Utils.SetDbFilesPermissions(config.Get('ClamAV', 'Database'))
  64.         maxsize = int(config.Get('ClamAV', 'MaxLogSize'))*1048576        
  65.         logfile = config.Get('Updates', 'DBUpdateLogFile')
  66.         Utils.AppendLogFile(logfile, updatelog, maxsize)       
  67.     finally:
  68.         try:
  69.             os.remove(updatelog)
  70.         except Exception, e:
  71.             print 'Unable to remove file %s. Error: %s' % (updatelog, str(e))
  72.         dlg.Destroy()         
  73.         try:
  74.             os.remove(freshclam_conf)        
  75.         except Exception, e:
  76.             print "couldn't remove file %s. Error: %s" % (freshclam_conf, str(e))        
  77.         if exit_code == 1:
  78.             try:
  79.                 f = file(os.path.join(tempfile.gettempdir(), 'ClamWin_Upadte_Time'), 'w')
  80.                 f.write(str(time.time()))
  81.                 f.close()                       
  82.             except IOError:
  83.                 pass
  84.         return exit_code
  85.     
  86. def wxScan(parent, config, path, autoClose = False):            
  87.     exit_code = -1
  88.     scanlog = tempfile.mktemp()    
  89.     cmd = Utils.GetScanCmd(config, path, scanlog)
  90.     try:
  91.         priority = config.Get('ClamAV', 'Priority')[:1].lower()
  92.     except:
  93.         priority = 'n'
  94.         #check if we have downloaded the virus database and bail out if not    
  95.     hasdb = Utils.CheckDatabase(config)      
  96.     if not hasdb:
  97.         if config.Get('UI', 'TrayNotify') == '1':
  98.             import win32gui
  99.             tray_notify_params = (('Virus Definitions Database Not Found! Please download it now.', -1, 
  100.                     win32gui.NIIF_ERROR, 30000), None)
  101.             # show balloon
  102.             Utils.ShowBalloon(-1, tray_notify_params)
  103.             
  104.             #add to logfile
  105.             logfile = config.Get('ClamAV', 'LogFile')
  106.             if logfile != '':
  107.                 file(scanlog, 'wt').write('n-----------------------------n'
  108.                     'Scan Started %snERROR: Virus Definitions Database Not Found! Please download it now.n'
  109.                     '-----------------------------' % time.asctime())
  110.                 maxsize = int(config.Get('ClamAV', 'MaxLogSize'))*1048576        
  111.                 Utils.AppendLogFile(logfile, scanlog, maxsize)        
  112.                 os.remove(scanlog)
  113.             return
  114.                         
  115.      
  116.     if config.Get('UI', 'TrayNotify') == '1':
  117.         import win32gui
  118.         tray_notify_params = (('Virus has been detected during scan! Please review the scan report.', 1, 
  119.                         win32gui.NIIF_ERROR, 30000),
  120.                         ('An error occured during virus scan. Please review the scan report.', 0, 
  121.                         win32gui.NIIF_WARNING, 30000))      
  122.     else:
  123.         tray_notify_params = None
  124.     dlg = wxDialogStatus.create(parent, cmd, scanlog, priority, "scanprogress", tray_notify_params)
  125.     dlg.SetTitle("ClamWin Free Antivirus: Scanning...")
  126.     dlg.SetAutoClose(autoClose, 0)
  127.     try:
  128.         dlg.ShowModal()         
  129.         exit_code = dlg.GetExitCode()                
  130.         maxsize = int(config.Get('ClamAV', 'MaxLogSize'))*1048576        
  131.         logfile = config.Get('ClamAV', 'LogFile')
  132.         Utils.AppendLogFile(logfile, scanlog, maxsize)        
  133.         # send email alert
  134.         if config.Get('EmailAlerts', 'Enable') == '1':            
  135.             try:     
  136.                 # unix version returns 256 on virus detection
  137.                 # strange but maybe it is cygwin the culprit?
  138.                 if exit_code == 1 or exit_code ==256:
  139.                     msg = EmailAlert.ConfigVirusAlertMsg(config, (scanlog,))
  140.                     msg.Send()                
  141.             except Exception, e:
  142.                 print 'Could not send email alert. Error: %s' % str(e)
  143.               
  144.     finally:
  145.         if os.path.exists(scanlog):
  146.              try:
  147.                  os.remove(scanlog)
  148.              except IOError, e:
  149.                  print 'could not delete logfile : %s. Error: %s' % (scanlog, str(e))                 
  150.         dlg.Destroy()
  151.         return exit_code
  152. def wxConfigure(parent, config, switchToSchedule = False):
  153.     dlg = wxDialogPreferences.create(parent, config, switchToSchedule)
  154.     try:
  155.         dlg.ShowModal()
  156.     finally:
  157.         dlg.Destroy()            
  158. def wxAbout(parent, config):
  159.     dlg = wxDialogAbout.create(parent, config)
  160.     try:
  161.         dlg.ShowModal()
  162.     finally:
  163.         dlg.Destroy()       
  164. def wxShowLog(parent, logfile):
  165.         maxlogsize = 524288 #512 KB        
  166.         if not len(logfile):
  167.             MsgBox.ErrorBox(parent, 'Log files are not properly configured. Please review ClamWin configuration')        
  168.         try:                        
  169.             if not os.path.isfile(logfile):
  170.                 text = ''
  171.             else:
  172.                 if os.stat(logfile).st_size > maxlogsize:                    
  173.                     # read last 512 kbytes from the file
  174.                     f = file(logfile, 'rt')
  175.                     f.seek(-maxlogsize, 2)
  176.                     text = f.read()                    
  177.                 else:
  178.                     text = file(logfile, 'rt').read()                                    
  179.         except Exception, e:
  180.             MsgBox.ErrorBox(parent, 'Unable to read from the log file. Error: %s' % str(e))
  181.             
  182.         dlg = wxDialogLogViewer.create(parent, text, True)        
  183.         try:
  184.             # change window title to include the file we are viewing
  185.             dlg.SetTitle(dlg.GetTitle() + ' - ' + os.path.split(logfile)[1])
  186.             dlg.ShowModal()
  187.         finally:
  188.             dlg.Destroy()
  189.             
  190. def wxGoToInternetUrl(url):
  191.     try:
  192.         import webbrowser
  193.     except ImportError:
  194.         wxMessageBox('Please point your browser at: %s' % url)
  195.     else:
  196.         webbrowser.open(url)
  197.         
  198. def wxCheckUpdate(parent, config):
  199.     if not config.Get('Updates', 'CheckVersion'):
  200.         return
  201.     # if we have a window with such name don't show a second one
  202.     try:
  203.         import win32gui
  204.         hwnd = win32gui.FindWindow('#32770', 'ClamWin Update')
  205.         if hwnd:
  206.             return
  207.     except:
  208.         pass    
  209.         
  210.     try:
  211.         ver, url, changelog = Utils.GetOnlineVersion(config)
  212.         if ver <= version.clamwin_version:
  213.             return
  214.     except Exception, e:
  215.         if config.Get('UI', 'TrayNotify') == '1':
  216.             import win32gui
  217.             tray_notify_params = (('Unable to retrieve ClamWin Free Antivirus online version infomation. Error: %s' % str(e), 0, 
  218.                         win32gui.NIIF_WARNING, 30000), None)
  219.             Utils.ShowBalloon(0, tray_notify_params)
  220.         return
  221.         
  222.     try:
  223.         dlg = wxDialogCheckUpdate.create(parent, config, ver, url, changelog)
  224.         dlg.ShowModal()
  225.     finally:
  226.         dlg.Destroy()   
  227.         
  228. if __name__ == '__main__':
  229.     import Config
  230.     from wxPython.wx import *
  231.     config_file = os.path.join(Utils.GetProfileDir(True),'ClamWin.conf')                          
  232.     config = Config.Settings(config_file)    
  233.     b = config.Read()
  234.     app = wxPySimpleApp()
  235.     wxScan(None, config, 'c:/1Test')
  236.     app.MainLoop()