blob: 243dedc9192be41cef8499a13b6101e2e315d144 [file] [log] [blame]
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +00001# osmo_ms_driver: Starter for processes
2# Help to start processes over time.
3#
4# Copyright (C) 2018 by Holger Hans Peter Freyther
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as
8# published by the Free Software Foundation, either version 3 of the
9# License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19from osmo_gsm_tester import log, template
20
21import os
22import os.path
23import subprocess
24import time
25
26_devnull = open(os.devnull, 'w')
27#_devnull = open('/dev/stdout', 'w')
28
29class Launcher(log.Origin):
30 def __init__(self, base_name, name_number, tmp_dir):
31 super().__init__(log.C_RUN, "{}/{}".format(base_name, name_number))
32 self._name_number = name_number
33 self._tmp_dir = tmp_dir
34
35 def name_number(self):
36 return self._name_number
37
38class OsmoVirtPhy(Launcher):
39 def __init__(self, name_number, tmp_dir):
40 super().__init__("osmo-ms-virt-phy", name_number, tmp_dir)
41 self._phy_filename = os.path.join(self._tmp_dir, "osmocom_l2_" + self._name_number)
42
43 def phy_filename(self):
44 return self._phy_filename
45
46 def start(self, loop):
47 if len(self._phy_filename.encode()) > 107:
48 raise log.Error('Path for unix socket is longer than max allowed len for unix socket path (107):', self._phy_filename)
49
50 self.log("Starting virtphy process")
51 args = ["virtphy", "--l1ctl-sock=" + self._phy_filename]
52 self.log(' '.join(args))
53 self._vphy_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
54
55 def verify_ready(self):
56 while True:
57 if os.path.exists(self._phy_filename):
58 return
59 time.sleep(0.2)
60
61 def kill(self):
62 """Clean up things."""
63 if self._vphy_proc:
64 self._vphy_proc.kill()
65
66class OsmoMobile(Launcher):
67 def __init__(self, name_number, tmp_dir, lua_tmpl, cfg_tmpl, imsi_ki_generator, phy_filename, ev_server_path):
68 super().__init__("osmo-ms-mob", name_number, tmp_dir)
69 self._lua_template = lua_tmpl
70 self._cfg_template = cfg_tmpl
71 self._imsi_ki_generator = imsi_ki_generator
72 self._phy_filename = phy_filename
73 self._ev_server_path = ev_server_path
74
75 def write_lua_cfg(self):
76 lua_support = os.path.join(os.path.dirname(__file__), 'lua')
77 cfg = {
78 'test': {
79 'event_path': self._ev_server_path,
80 'lua_support': lua_support,
81 }
82 }
83 lua_cfg_file = os.path.join(self._tmp_dir, "lua_" + self._name_number + ".lua")
84 lua_script = template.render(self._lua_template, cfg)
85 with open(lua_cfg_file, 'w') as w:
86 w.write(lua_script)
87 return lua_cfg_file
88
89 def write_mob_cfg(self, lua_filename, phy_filename):
90 (imsi, ki) = next(self._imsi_ki_generator)
91 cfg = {
92 'test': {
93 'script': lua_filename,
94 'virt_phy': phy_filename,
95 'imsi': imsi,
96 'ki_comp128': ki,
97 'ms_number': self._name_number,
98 }
99 }
100 mob_cfg_file = os.path.join(self._tmp_dir, "mob_" + self._name_number + ".cfg")
101 mob_vty = template.render(self._cfg_template, cfg)
102 with open(mob_cfg_file, 'w') as w:
103 w.write(mob_vty)
104 return mob_cfg_file
105
106 def start(self, loop):
107 lua_filename = self.write_lua_cfg()
108 mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)
109
110 self.log("Starting process")
111 # Let the kernel pick an unused port for the VTY.
112 args = ["mobile", "-c", mob_filename, "--vty-port=0"]
113 self.log(' '.join(args))
114 self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
115
116 def kill(self):
117 """Clean up things."""
118 if self._omob_proc:
119 self._omob_proc.kill()