blob: 3efbaf951db1861b480c63d942f3435dfc35c5d6 [file] [log] [blame]
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +02001#!/usr/bin/env python3
2
3# just import all python3 modules used by osmo-gsm-tester to make sure they are
4# installed.
5
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +02006
Pau Espin Pedrol045245d2020-04-17 19:37:10 +02007
8import os
9import sys
10import argparse
11import pprint
12import subprocess
13
14feature_module_map = {
15 'powersupply_intellinet' : ['powersupply_intellinet'],
16 'powersupply_sispm' : ['powersupply_sispm'],
17 'rfemu_amarisoftctrl': ['rfemu_amarisoftctrl'],
18 'rfemu_minicircuits': ['rfemu_minicircuits'],
19}
20
21def skip_features_to_skip_modules(skip_features):
22 skip_obj_modules = []
23
24 for skip_feature in skip_features:
25 if skip_feature not in feature_module_map:
26 raise Exception('feature %s doesn\'t exist!' % skip_feature)
27 for skip_module in feature_module_map[skip_feature]:
28 skip_obj_modules.append(skip_module)
29 return skip_obj_modules
30
31def import_runtime_dependencies():
32 # we don't have any right now, but in the future if we import a module during runtime (eg inside a function), then we need to place it here:
33 # import foobar
34 pass
35
36def import_all_py_in_dir(rel_path, skip_modules=[]):
37 selfdir = os.path.dirname(os.path.abspath(__file__))
38 dir = os.path.join(selfdir, rel_path)
39 print('importing files in directory %s' % dir)
40 for entry in os.listdir(dir):
41 full_entry = os.path.join(selfdir, rel_path, entry)
42 if not os.path.isfile(full_entry):
43 if args.verbose:
44 print('skipping entry %s' % full_entry)
45 continue
46 if not full_entry.endswith('.py'):
47 if args.verbose:
48 print('skipping file %s' % full_entry)
49 continue
50 modulename = entry[:-3]
51 if modulename in skip_modules:
52 if args.verbose:
53 print('skipping module %s' % modulename)
54 continue
55 modulepath = rel_path.replace('/', '.') + '.' + modulename
56 print('importing %s' % modulepath)
57 __import__(modulepath, globals(), locals())
58
59def get_module_names():
60 all_modules=sys.modules.items()
61 all_modules_filtered = {}
62 for mname, m in all_modules:
63 if not hasattr(m, '__file__'):
64 continue # skip built-in modules
65 if mname.startswith('_'):
66 continue # skip internal modules
67 if mname.startswith('src.osmo_') or 'osmo_gsm_tester' in mname or 'osmo_ms_driver' in mname:
68 continue # skip our own local modules
69 mname = mname.split('.')[0] # store only main module
70 if m not in all_modules_filtered.values():
71 all_modules_filtered[mname] = m
72 return all_modules_filtered
73
74def print_deb_packages(modules):
75 packages_deb = []
76 modules_err = []
77 for mname, m in modules.items():
78 proc = subprocess.Popen(["dpkg", "-S", m.__file__], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
79 outs, errs = proc.communicate()
80 if args.verbose:
81 print('out: %s, err: %s' %(outs, errs))
82 if len(errs): # error -> package not found (installed through pip?)
83 modules_err.append((mname, errs.decode('utf-8')))
84 elif len(outs):
85 outs = outs.decode('utf-8')
86 outs = outs.split()[0].rstrip(':') # first part is debian package name
87 if not outs in packages_deb:
88 packages_deb.append(outs)
89 else:
90 print('WARNING: dpkg returns empty!')
91
92 print('Debian packages:')
93 for pkgname in packages_deb:
94 print("\t" + pkgname)
95 print()
96 print('Modules without debian package (pip or setuptools?):')
97 for mname, err in modules_err:
98 print("\t" + mname.ljust(20) + " [" + err.rstrip() +"]")
99
100parser = argparse.ArgumentParser(epilog=__doc__, formatter_class=argparse.RawTextHelpFormatter)
101parser.add_argument('-s', '--skip-feature', dest='skip_features', choices=feature_module_map.keys(), action='append',
102 help='''All osmo-gsm-tester features not used by the user running the script''')
103parser.add_argument('-p', '--distro-packages', dest='distro_packages', action='store_true',
104 help='Print distro packages installing modules')
105parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
106 help='Print a lot more information')
107args = parser.parse_args()
108
109skip_obj_modules = skip_features_to_skip_modules(list(args.skip_features or []))
110
111print('Skip checking modules: %r' % skip_obj_modules)
112
113# We need to add it for cross-references between osmo_ms_driver and osmo_gsm_tester to work:
114sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'src/'))
115import_all_py_in_dir('src/osmo_ms_driver')
116import_all_py_in_dir('src/osmo_gsm_tester/core')
117import_all_py_in_dir('src/osmo_gsm_tester/obj', skip_obj_modules)
118import_all_py_in_dir('src/osmo_gsm_tester')
119import_runtime_dependencies()
120print('Importing dependencies ok, all installed')
121
122print('Retreiving list of imported modules...')
123modules = get_module_names()
124if args.verbose:
125 for mname, m in modules.items():
126 print('%s --> %s' %(mname, m.__file__))
127
128if args.distro_packages:
129 print('Generating distro package list from imported module list...')
130 print_deb_packages(modules)