[PATCH] prserv: add --status to list running servers
Babanpreet Singh <[email protected]>
| Newsgroups | org.openembedded.lists.bitbake-devel |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> --- bin/bitbake-prserv | 7 +++++++ lib/prserv/serv.py | 23 +++++++++++++++++++++++ lib/prserv/tests.py | 16 +++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/bin/bitbake-prserv b/bin/bitbake-prserv index c26362b2e..8413c585f 100755 --- a/bin/bitbake-prserv +++ b/bin/bitbake-prserv @@ -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 diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py index e17588630..322c22a0f 100644 --- a/lib/prserv/serv.py +++ b/lib/prserv/serv.py @@ -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) diff --git a/lib/prserv/tests.py b/lib/prserv/tests.py index df0c00300..518d5c441 100644 --- a/lib/prserv/tests.py +++ b/lib/prserv/tests.py @@ -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) -- 2.43.0