blob: 5218a571ca830c74f26f034307330dbe8f44ec89 [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)
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000042 self._vphy_proc = None
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000043
44 def phy_filename(self):
45 return self._phy_filename
46
47 def start(self, loop):
48 if len(self._phy_filename.encode()) > 107:
49 raise log.Error('Path for unix socket is longer than max allowed len for unix socket path (107):', self._phy_filename)
50
51 self.log("Starting virtphy process")
52 args = ["virtphy", "--l1ctl-sock=" + self._phy_filename]
53 self.log(' '.join(args))
54 self._vphy_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
55
56 def verify_ready(self):
57 while True:
58 if os.path.exists(self._phy_filename):
59 return
60 time.sleep(0.2)
61
62 def kill(self):
63 """Clean up things."""
64 if self._vphy_proc:
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000065 self._vphy_proc.terminate()
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000066
67class OsmoMobile(Launcher):
68 def __init__(self, name_number, tmp_dir, lua_tmpl, cfg_tmpl, imsi_ki_generator, phy_filename, ev_server_path):
69 super().__init__("osmo-ms-mob", name_number, tmp_dir)
70 self._lua_template = lua_tmpl
71 self._cfg_template = cfg_tmpl
72 self._imsi_ki_generator = imsi_ki_generator
73 self._phy_filename = phy_filename
74 self._ev_server_path = ev_server_path
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +010075 self._imsi, self._ki = next(self._imsi_ki_generator)
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000076 self._omob_proc = None
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000077
Holger Hans Peter Freyther8ae38a62018-08-29 04:25:30 +010078 def imsi(self):
79 return self._imsi
80
81 def ki(self):
82 return self._ki
83
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000084 def write_lua_cfg(self):
85 lua_support = os.path.join(os.path.dirname(__file__), 'lua')
86 cfg = {
87 'test': {
88 'event_path': self._ev_server_path,
89 'lua_support': lua_support,
90 }
91 }
92 lua_cfg_file = os.path.join(self._tmp_dir, "lua_" + self._name_number + ".lua")
93 lua_script = template.render(self._lua_template, cfg)
94 with open(lua_cfg_file, 'w') as w:
95 w.write(lua_script)
96 return lua_cfg_file
97
98 def write_mob_cfg(self, lua_filename, phy_filename):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000099 cfg = {
100 'test': {
101 'script': lua_filename,
102 'virt_phy': phy_filename,
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +0100103 'imsi': self._imsi,
104 'ki_comp128': self._ki,
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000105 'ms_number': self._name_number,
106 }
107 }
108 mob_cfg_file = os.path.join(self._tmp_dir, "mob_" + self._name_number + ".cfg")
109 mob_vty = template.render(self._cfg_template, cfg)
110 with open(mob_cfg_file, 'w') as w:
111 w.write(mob_vty)
112 return mob_cfg_file
113
114 def start(self, loop):
115 lua_filename = self.write_lua_cfg()
116 mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)
117
118 self.log("Starting process")
119 # Let the kernel pick an unused port for the VTY.
120 args = ["mobile", "-c", mob_filename, "--vty-port=0"]
121 self.log(' '.join(args))
122 self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
123
124 def kill(self):
125 """Clean up things."""
126 if self._omob_proc:
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +0000127 self._omob_proc.terminate()