Skip to content
This repository was archived by the owner on Jun 7, 2023. It is now read-only.

Commit 43064f9

Browse files
committed
add dependency check
1 parent aa33c4b commit 43064f9

File tree

3 files changed

+78
-3
lines changed

3 files changed

+78
-3
lines changed

viper/common/abstracts.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22
# This file is part of Viper - https://github.com/viper-framework/viper
33
# See the file 'LICENSE' for copying permission.
44

5+
import sys
56
import argparse
7+
from distutils.spawn import find_executable
8+
import pkg_resources
9+
10+
import logging
11+
612
import viper.common.out as out
713
from viper.core.config import console_output
814
from viper.common.exceptions import ArgumentErrorCallback
915

16+
log = logging.getLogger('viper')
17+
1018

1119
class ArgumentParser(argparse.ArgumentParser):
1220
def print_usage(self):
@@ -31,9 +39,64 @@ class Module(object):
3139
authors = []
3240
output = []
3341

42+
min_python_version = (2, 7)
43+
dependency_list_python = []
44+
dependency_list_system = []
45+
3446
def __init__(self):
3547
self.parser = ArgumentParser(prog=self.cmd, description=self.description)
3648

49+
def check(self):
50+
min_python_version = self._check_min_python_version()
51+
dep_python = self._check_dependencies_python()
52+
dep_system = self._check_dependencies_system()
53+
if min_python_version and dep_python and dep_system:
54+
return True
55+
else:
56+
return False
57+
58+
def _check_min_python_version(self):
59+
if sys.version_info >= self.min_python_version:
60+
log.debug("{}: Python Version ok".format(self.__class__.__name__))
61+
return True
62+
else:
63+
log.warning("{}: Python Version NOT ok".format(self.__class__.__name__))
64+
return False
65+
66+
def _check_dependencies_python(self):
67+
if not self.dependency_list_python:
68+
return True
69+
70+
missing = []
71+
72+
for item in self.dependency_list_python:
73+
try:
74+
pkg_resources.require(item)
75+
except pkg_resources.DistributionNotFound as err:
76+
log.debug("{}: Missing Python dependency: {}".format(self.__class__.__name__, err))
77+
missing.append(item)
78+
except pkg_resources.VersionConflict as err:
79+
log.debug("{}: Python dependency wrong version: {}".format(self.__class__.__name__, err))
80+
missing.append(item)
81+
82+
if missing:
83+
log.warning("{}: Missing/Failed Python dependencies: {}".format(self.__class__.__name__, missing))
84+
return False
85+
86+
return True
87+
88+
def _check_dependencies_system(self):
89+
if not self.dependency_list_system:
90+
return True
91+
92+
missing = [item for item in self.dependency_list_system if not find_executable(item)]
93+
94+
if missing:
95+
log.warning("{}: Missing System dependencies: {}".format(self.__class__.__name__, missing))
96+
return False
97+
else:
98+
return True
99+
37100
def set_commandline(self, command):
38101
self.command_line = command
39102

viper/core/plugins.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
import pkgutil
66
import inspect
7+
import logging
78
import importlib
89

910
from viper.common.out import print_warning
1011
from viper.common.abstracts import Module
1112

13+
log = logging.getLogger('viper')
14+
1215

1316
def load_modules():
1417
# Import modules package.
@@ -31,10 +34,17 @@ def load_modules():
3134
# Walk through all members of currently imported modules.
3235
for member_name, member_object in inspect.getmembers(module):
3336
# Check if current member is a class.
34-
if inspect.isclass(member_object):
35-
# Yield the class if it's a subclass of Module.
36-
if issubclass(member_object, Module) and member_object is not Module:
37+
if not inspect.isclass(member_object):
38+
continue
39+
# Yield the class if it's a subclass of Module.
40+
if issubclass(member_object, Module) and member_object is not Module:
41+
# run dependency check on each module
42+
if member_object().check():
43+
log.debug("Module: {} - dependency check ok".format(member_name))
3744
plugins[member_object.cmd] = dict(obj=member_object, description=member_object.description)
45+
else:
46+
log.warning("Module: {} - failed dependency check".format(member_name))
47+
print_warning("Module: {} - failed dependency check".format(member_name))
3848

3949
return plugins
4050

viper/modules/misp.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class MISP(Module):
4848
description = 'Upload and query IOCs to/from a MISP instance'
4949
authors = ['Raphaël Vinot']
5050

51+
min_python_version = (3, 7) # TODO(frennkie) remove .. for testing only!
52+
5153
def __init__(self):
5254
super(MISP, self).__init__()
5355
self.cur_path = __project__.get_path()

0 commit comments

Comments
 (0)