blob: 86ad446c9f1cbf87d989e40e68944b87e7e8e94e [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
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +010074 self._imsi, self._ki = next(self._imsi_ki_generator)
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000075
Holger Hans Peter Freyther8ae38a62018-08-29 04:25:30 +010076 def imsi(self):
77 return self._imsi
78
79 def ki(self):
80 return self._ki
81
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000082 def write_lua_cfg(self):
83 lua_support = os.path.join(os.path.dirname(__file__), 'lua')
84 cfg = {
85 'test': {
86 'event_path': self._ev_server_path,
87 'lua_support': lua_support,
88 }
89 }
90 lua_cfg_file = os.path.join(self._tmp_dir, "lua_" + self._name_number + ".lua")
91 lua_script = template.render(self._lua_template, cfg)
92 with open(lua_cfg_file, 'w') as w:
93 w.write(lua_script)
94 return lua_cfg_file
95
96 def write_mob_cfg(self, lua_filename, phy_filename):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000097 cfg = {
98 'test': {
99 'script': lua_filename,
100 'virt_phy': phy_filename,
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +0100101 'imsi': self._imsi,
102 'ki_comp128': self._ki,
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000103 'ms_number': self._name_number,
104 }
105 }
106 mob_cfg_file = os.path.join(self._tmp_dir, "mob_" + self._name_number + ".cfg")
107 mob_vty = template.render(self._cfg_template, cfg)
108 with open(mob_cfg_file, 'w') as w:
109 w.write(mob_vty)
110 return mob_cfg_file
111
112 def start(self, loop):
113 lua_filename = self.write_lua_cfg()
114 mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)
115
116 self.log("Starting process")
117 # Let the kernel pick an unused port for the VTY.
118 args = ["mobile", "-c", mob_filename, "--vty-port=0"]
119 self.log(' '.join(args))
120 self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
121
122 def kill(self):
123 """Clean up things."""
124 if self._omob_proc:
125 self._omob_proc.kill()