病毒扫描
病毒扫描包下的文件组成
__init__.py
commit_differ.py:文件差异对比
db_oper.py:数据库操作
models.py:数据库模型
run_virus_scan.py:主启动文件
scan_settings.py:病毒扫描设置
thread_pool.py:线程池声明
virus_scan.py:病毒扫描函数
scan_settings(关于扫描的设置)
class Settings():
__init__():
parse_config():
parse_scan_config():
parse_send_mail_config():
is_enabled():
补充一:configParser:读取配置对象
parse_scan_config:分析扫描的配置。
该方法对配置中的virus_scan中的多个属性进行检查。
包括scan_command,virus_code,nonvirus_code,scan_interval,scan_size_limit,scan_skip_ext,threads.
大体结构如下:
if cfg.has_option('virus_scan', 'scan_command'):
self.scan_cmd = cfg.get('virus_scan', 'scan_command')
if not self.scan_cmd:
logger.info('[virus_scan] scan_command option is not found in %s, disable virus scan.' %
seaf_conf)
return False
parse_send_mail_config:对邮件的病毒扫描进行配置的信息。
引入了utils.config中的两个方法:get_opt_from_conf_or_env,parse_bool
get_opt_from_conf_or_env:在配置中查找属性,没有的话,如果有设置环境变量中的变量的话,调用os.environ(os模块中获取环境变量的方法)
def get_opt_from_conf_or_env(config, section, key, env_key=None, default=None):
'''Get option value from events.conf. If not specified in events.conf,
check the environment variable.
'''
try:
return config.get(section, key)
except configparser.NoOptionError:
if env_key is None:
return default
else:
return os.environ.get(env_key.upper(), default)
parse_bool:判断输入是否为true
符合要求类型:1和lower(v)="true"
返回parse_send_mail_config方法
通过get_opt_from_conf_or_env读取配置'SEAHUB EMAIL'中的 'enabled'和'seahubdir'属性。
然后根据配置返回mail时的virus scan配置
parse方法:读取config并调用上述方法进行设置。
commit_differ.py(差异对比)
和seafobj中的commit_differ相似,为差异对比。
首先是辅助函数make_path(dirname,filename)
def make_path(dirname, filename):
if dirname == '/':
return dirname + filename
else:
return '/'.join((dirname, filename))
该函数用于连接文件夹名和文件名
class CommitDiffer
def __init__(self, repo_id, version, root1, root2):
self.repo_id = repo_id
self.version = version
self.root1 = root1
self.root2 = root2
def diff为差异对比函数
model.py(数据库模型)
存放数据库模型
VirusScanRecord:repo_id(主键), scan_commit_id
VirusFile:vid(主键,自增),repo_id, commit_id, file_path, has_deleted, has_ignored
db_oper.py(数据库的操作)
文件结构
class DBOper:
def __init__(self,settings)
def get_repo_list(self)
def get_scan_commit_id(self,repo_id)
def update_vscan_record(self,repo_id,scan_commit_id)
add_virus_record(self,records)
def get_virus_files(session, repo_id, has_handled, start, limit)
def delete_virus_file(session, vid)
def operate_virus_file(session, vid, ignore)
def get_virus_file_by_vid(session, vid)
def get_virus_file_by_vid(session,vid):从VirusFile表中通过vid来获取对象
q = session.query(VirusFile).filter(VirusFile.vid == vid)
return q.first()
def operate_virus_file(sessoin,vid,ignore):修改指定vid的has_ignored属性
q = session.query(VirusFile).filter(VirusFile.vid == vid)
r = q.first()
r.has_ignored = ignore
session.commit()
return 0
def delete_virus_file(session, vid):修改指定vid的has_deleted属性为1
q = session.query(VirusFile).filter(VirusFile.vid == vid)
r = q.first()
r.has_deleted = 1
session.commit()
return 0
def get_virus_files(session, repo_id, has_handled, start, limit):
获取VirusFile对象(start:起始位置,has_handled:属性要求,limit:条数限制)
q = session.query(VirusFile)
if repo_id:
q = q.filter(VirusFile.repo_id == repo_id)
if has_handled is not None:
if has_handled:
q = q.filter(or_(VirusFile.has_deleted == 1, VirusFile.has_ignored == 1))
else:
q = q.filter(and_(VirusFile.has_deleted == 0, VirusFile.has_ignored == 0))
q = q.slice(start, start+limit)
return q.all()
class DBOper
def get_scan_commit_id(self,repo_id):根据repo_id查询VirusScanRecord表中的scan_commit_id
q = session.query(VirusScanRecord).filter(VirusScanRecord.repo_id == repo_id)
r = q.first()
scan_commit_id = r.scan_commit_id if r else None
return scan_commit_id
def update_vscan_record(self, repo_id, scan_commit_id)