@@ -64,6 +64,11 @@ def main():
action="store_true",
help="stop daemon",
)
+ parser.add_argument(
+ "--status",
+ action="store_true",
+ help="list PR servers running on this machine",
+ )
parser.add_argument(
"--host",
help="ip address to bind",
@@ -102,6 +107,8 @@ def main():
)
elif args.stop:
ret=prserv.serv.stop_daemon(args.host, args.port)
+ elif args.status:
+ ret=prserv.serv.status_daemon()
else:
ret=parser.print_help()
return ret
@@ -388,6 +388,29 @@ def stop_daemon(host, port):
return 0
+def status_daemon():
+ import glob
+ running = 0
+ for pidfile in sorted(glob.glob(PIDPREFIX % ("*", "*"))):
+ root, _ = os.path.splitext(os.path.basename(pidfile))
+ parts = root.split("_")
+ ip, port = "_".join(parts[1:-1]), parts[-1]
+ try:
+ with open(pidfile) as pf:
+ pid = int(pf.readline().strip())
+ except (IOError, ValueError):
+ sys.stderr.write("Ignoring unreadable pidfile %s\n" % pidfile)
+ continue
+ if is_running(pid):
+ print("PRServer running at %s:%s (pid %s)" % (ip, port, pid))
+ running += 1
+ else:
+ print("Stale pidfile %s (pid %s not running)" % (pidfile, pid))
+ if not running:
+ print("No PRServer running.")
+ return 1
+ return 0
+
def is_running(pid):
try:
os.kill(pid, 0)
@@ -381,8 +381,22 @@ class ScriptTests(unittest.TestCase):
except subprocess.CalledProcessError as e:
self.fail("Failed to start bitbake-prserv: %s" % e.returncode)
- def test_2_stop_bitbake_prserv(self):
+ def test_2_status_bitbake_prserv(self):
+ result = subprocess.run([BIN_DIR / "bitbake-prserv", "--status"],
+ capture_output=True, text=True)
+ self.assertEqual(result.returncode, 0,
+ "Expected a running PRServer: %s" % result.stdout)
+ self.assertIn(":8585 (pid ", result.stdout)
+
+ def test_3_stop_bitbake_prserv(self):
try:
subprocess.check_call([BIN_DIR / "bitbake-prserv", "--stop"])
except subprocess.CalledProcessError as e:
self.fail("Failed to stop bitbake-prserv: %s" % e.returncode)
+
+ def test_4_status_stopped_bitbake_prserv(self):
+ result = subprocess.run([BIN_DIR / "bitbake-prserv", "--status"],
+ capture_output=True, text=True)
+ self.assertEqual(result.returncode, 1,
+ "Expected no running PRServer: %s" % result.stdout)
+ self.assertNotIn(":8585 (pid ", result.stdout)
bitbake-prserv could start and stop a server but not say what is running. Add --status: it reads every /tmp/PRServer_<ip>_<port>.pid, reports each server as running (with its pid) or as a stale pidfile, and exits 0 if at least one server is alive, 1 otherwise. Extend the ScriptTests start/stop lifecycle with status checks in both states. [YOCTO #10865] Signed-off-by: Babanpreet Singh <bbnpreetsingh@gmail.com> --- bin/bitbake-prserv | 7 +++++++ lib/prserv/serv.py | 23 +++++++++++++++++++++++ lib/prserv/tests.py | 16 +++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-)