From 060e4dcdc52d1fdb29654c7cdcc04a72b7c3ddda Mon Sep 17 00:00:00 2001 From: thebeninator Date: Tue, 16 Sep 2025 13:55:45 -0700 Subject: [PATCH 1/9] add dev printer flag; add hold to virtual prints --- docker-compose.printer.dev.yml | 1 + printer/modules/gerard.py | 4 ++-- printer/server.py | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docker-compose.printer.dev.yml b/docker-compose.printer.dev.yml index af422cd..33bffc6 100644 --- a/docker-compose.printer.dev.yml +++ b/docker-compose.printer.dev.yml @@ -18,3 +18,4 @@ services: - --port=14000 - --dont-delete-pdfs - --config-json-path=/app/config/config.json + - --dev-printer diff --git a/printer/modules/gerard.py b/printer/modules/gerard.py index cde3d46..21f8f7e 100644 --- a/printer/modules/gerard.py +++ b/printer/modules/gerard.py @@ -61,11 +61,11 @@ def create_print_job( file_path=file_path, ) - if is_development_mode: + if is_development_mode and not is_dev_printer: logging.warning( f"server is in development mode, command would've been `{command}`" ) - job_id = f"HP_LaserJet_p2015dn_Right-{next(print_job_suffix)}" + job_id = f"HP_LaserJet_p2015dn_Right-{next(print_job_suffix)}" return job_id diff --git a/printer/server.py b/printer/server.py index 2ccf10a..582c5b0 100644 --- a/printer/server.py +++ b/printer/server.py @@ -122,13 +122,13 @@ def send_file_to_printer( # only the right printer works right now, so we default to it PRINTER_NAME = os.environ.get("RIGHT_PRINTER_NAME") - if (args.development): + if (args.dev_printer): PRINTER_NAME = "HP_LaserJet_p2015dn_Right" metrics_handler.print_jobs_recieved.inc() job_id = gerard.create_print_job( - num_copies, maybe_page_range, sides, PRINTER_NAME, file_path, args.development + num_copies, maybe_page_range, sides, PRINTER_NAME, file_path, args.development, args.dev_printer ) if job_id: sqlite_helpers.insert_print_job(args.database_file_path, job_id) @@ -213,15 +213,16 @@ async def read_item( # metrics_handler referenced by the rest of the file. otherwise, # the thread interacts with an instance different than the one the # server uses -if __name__ == "server" and not args.development: +if __name__ == "server" and (not args.development or args.dev_printer): # set the last time we opened an ssh tunnel to now because # when the script runs for the first time, we did so in what.sh - metrics_handler.ssh_tunnel_last_opened.set(int(time.time())) - t = threading.Thread( - target=maybe_reopen_ssh_tunnel, - daemon=True, - ) - t.start() + if not args.dev_printer: + metrics_handler.ssh_tunnel_last_opened.set(int(time.time())) + t = threading.Thread( + target=maybe_reopen_ssh_tunnel, + daemon=True, + ) + t.start() sqlite_helpers.maybe_create_table(args.database_file_path) From bcb4622e32bc73c5dd5f5efbad0ed3a99f85ff6a Mon Sep 17 00:00:00 2001 From: thebeninator Date: Tue, 7 Oct 2025 13:30:42 -0700 Subject: [PATCH 2/9] error checking for status; some other misc changes --- printer/modules/gerard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printer/modules/gerard.py b/printer/modules/gerard.py index 21f8f7e..294055f 100644 --- a/printer/modules/gerard.py +++ b/printer/modules/gerard.py @@ -65,7 +65,7 @@ def create_print_job( logging.warning( f"server is in development mode, command would've been `{command}`" ) - job_id = f"HP_LaserJet_p2015dn_Right-{next(print_job_suffix)}" + job_id = f"HP_LaserJet_p2015dn_Right-{next(print_job_suffix)}" return job_id From 8923b6fcf6a0beab124325ee0e7ed8abacf328eb Mon Sep 17 00:00:00 2001 From: thebeninator Date: Mon, 22 Dec 2025 12:38:03 -0800 Subject: [PATCH 3/9] remove dev printer flag --- docker-compose.printer.dev.yml | 1 - printer/server.py | 19 +++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/docker-compose.printer.dev.yml b/docker-compose.printer.dev.yml index 33bffc6..af422cd 100644 --- a/docker-compose.printer.dev.yml +++ b/docker-compose.printer.dev.yml @@ -18,4 +18,3 @@ services: - --port=14000 - --dont-delete-pdfs - --config-json-path=/app/config/config.json - - --dev-printer diff --git a/printer/server.py b/printer/server.py index 582c5b0..2ccf10a 100644 --- a/printer/server.py +++ b/printer/server.py @@ -122,13 +122,13 @@ def send_file_to_printer( # only the right printer works right now, so we default to it PRINTER_NAME = os.environ.get("RIGHT_PRINTER_NAME") - if (args.dev_printer): + if (args.development): PRINTER_NAME = "HP_LaserJet_p2015dn_Right" metrics_handler.print_jobs_recieved.inc() job_id = gerard.create_print_job( - num_copies, maybe_page_range, sides, PRINTER_NAME, file_path, args.development, args.dev_printer + num_copies, maybe_page_range, sides, PRINTER_NAME, file_path, args.development ) if job_id: sqlite_helpers.insert_print_job(args.database_file_path, job_id) @@ -213,16 +213,15 @@ async def read_item( # metrics_handler referenced by the rest of the file. otherwise, # the thread interacts with an instance different than the one the # server uses -if __name__ == "server" and (not args.development or args.dev_printer): +if __name__ == "server" and not args.development: # set the last time we opened an ssh tunnel to now because # when the script runs for the first time, we did so in what.sh - if not args.dev_printer: - metrics_handler.ssh_tunnel_last_opened.set(int(time.time())) - t = threading.Thread( - target=maybe_reopen_ssh_tunnel, - daemon=True, - ) - t.start() + metrics_handler.ssh_tunnel_last_opened.set(int(time.time())) + t = threading.Thread( + target=maybe_reopen_ssh_tunnel, + daemon=True, + ) + t.start() sqlite_helpers.maybe_create_table(args.database_file_path) From 999236cde2411ca6ad1a5aa15fca6f8d46485f80 Mon Sep 17 00:00:00 2001 From: thebeninator Date: Mon, 22 Dec 2025 12:48:22 -0800 Subject: [PATCH 4/9] fix tests --- printer/test/test_gerard.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/printer/test/test_gerard.py b/printer/test/test_gerard.py index 08e8053..c8425b6 100644 --- a/printer/test/test_gerard.py +++ b/printer/test/test_gerard.py @@ -132,19 +132,31 @@ def test_create_print_job_cant_parse_development_mode(self): self.assertEqual( gerard.create_print_job( +<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, +======= + 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True +>>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-0", ) self.assertEqual( gerard.create_print_job( +<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, +======= + 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True +>>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-1", ) self.assertEqual( gerard.create_print_job( +<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, +======= + 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True +>>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-2", ) From ab8afcaa5864945282db59e212e0d884e6cc468d Mon Sep 17 00:00:00 2001 From: thebeninator Date: Mon, 22 Dec 2025 14:00:32 -0800 Subject: [PATCH 5/9] new completion marking stuff --- printer/modules/lpstat_helpers.py | 24 ++++++++++-------------- printer/test/test_lpstat.py | 21 +-------------------- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/printer/modules/lpstat_helpers.py b/printer/modules/lpstat_helpers.py index 019354f..f950891 100644 --- a/printer/modules/lpstat_helpers.py +++ b/printer/modules/lpstat_helpers.py @@ -4,10 +4,9 @@ from modules import sqlite_helpers -LPSTAT_CMD = "lpstat -o HP_LaserJet_p2015dn_Right" -SLEEP_TIME = 2 -jobs_seen_last = set() +LPSTAT_CMD = "lpstat -o -W completed HP_LaserJet_p2015dn_Right" +SLEEP_TIME = 2 logging.basicConfig( # in mondo we trust @@ -18,8 +17,14 @@ def query_lpstat(): - global jobs_seen_last global current_jobs + """ + the output of this command looks like + ben@ben:/app# lpstat -W completed -o HP_LaserJet_p2015dn_Right + HP_LaserJet_p2015dn_Right-3 ben 5120 Mon Dec 22 21:43:54 2025 + HP_LaserJet_p2015dn_Right-2 ben 8192 Mon Dec 22 21:43:23 2025 + HP_LaserJet_p2015dn_Right-1 ben 8192 Mon Dec 22 21:41:08 2025 + """ p = subprocess.Popen( LPSTAT_CMD, shell=True, @@ -52,21 +57,12 @@ def query_lpstat(): def poll_lpstat(sqlite_file): - global jobs_seen_last while True: try: - current_jobs = set(query_lpstat()) - completed_jobs = jobs_seen_last - current_jobs - + completed_jobs = set(query_lpstat()) sqlite_helpers.mark_jobs_completed( sqlite_file, [job for job in completed_jobs] ) - sqlite_helpers.mark_jobs_acknowledged( - sqlite_file, [job for job in current_jobs] - ) - - jobs_seen_last.clear() - jobs_seen_last.update(current_jobs) except Exception: logging.exception("what happened to query_lpstat?") diff --git a/printer/test/test_lpstat.py b/printer/test/test_lpstat.py index 6a58e58..a36c76a 100644 --- a/printer/test/test_lpstat.py +++ b/printer/test/test_lpstat.py @@ -20,9 +20,6 @@ class TestLpStatSqlite(unittest.TestCase): "HP_LaserJet_p2015dn_Right-53 root 5120 Sat May 31 18:19:38 2025" ) - def setUp(self): - lpstat_helpers.jobs_seen_last.clear() - # returns a single line result @mock.patch("modules.lpstat_helpers.subprocess.Popen") def test_query_lpstat(self, mock_popen): @@ -77,9 +74,6 @@ def test_query_lpstat_nonzero(self, mock_popen): def test_poll_lpstat( self, mock_sleep, mock_query_lpstat, mock_mark_acknowledged, mock_mark_completed ): - # Set initial seen job - lpstat_helpers.jobs_seen_last = {"HP_LaserJet_p2015dn_Right-52"} - # Simulate current jobs reported by lpstat mock_query_lpstat.return_value = [ "HP_LaserJet_p2015dn_Right-53", @@ -94,20 +88,7 @@ def test_poll_lpstat( # Check correct jobs marked as completed and acknowledged mock_mark_completed.assert_called_once_with( - "dummy.db", ["HP_LaserJet_p2015dn_Right-52"] - ) - mock_mark_acknowledged.assert_called_once() - database_name, acknowledged_jobs = mock_mark_acknowledged.call_args_list[0].args - self.assertEqual(database_name, "dummy.db") - self.assertCountEqual( - acknowledged_jobs, - ["HP_LaserJet_p2015dn_Right-53", "HP_LaserJet_p2015dn_Right-54"], - ) - - # Ensure state was cleared and updated - self.assertEqual( - lpstat_helpers.jobs_seen_last, - {"HP_LaserJet_p2015dn_Right-53", "HP_LaserJet_p2015dn_Right-54"}, + "dummy.db", ["HP_LaserJet_p2015dn_Right-54", "HP_LaserJet_p2015dn_Right-53"], ) From 3a618a4f4c882086b77f70460bfc590b147437c6 Mon Sep 17 00:00:00 2001 From: thebeninator Date: Mon, 22 Dec 2025 14:03:25 -0800 Subject: [PATCH 6/9] SILENCE --- printer/modules/sqlite_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printer/modules/sqlite_helpers.py b/printer/modules/sqlite_helpers.py index 82d4244..2da816d 100644 --- a/printer/modules/sqlite_helpers.py +++ b/printer/modules/sqlite_helpers.py @@ -56,7 +56,7 @@ def mark_jobs_with_status(sqlite_file, jobs, status): job_ids = [(job_id,) for job_id in jobs] if not job_ids: return - logging.info(f"marking {job_ids} as {status} in sqlite") + logging.debug(f"marking {job_ids} as {status} in sqlite") sql_update = ( f"UPDATE logs SET status = '{status}' WHERE job_id = ?" From 42ac7c06826e8e98fe49a6dd30c359c791996e9f Mon Sep 17 00:00:00 2001 From: evan Date: Wed, 24 Dec 2025 14:41:39 -0800 Subject: [PATCH 7/9] no more >>> --- printer/test/test_gerard.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/printer/test/test_gerard.py b/printer/test/test_gerard.py index c8425b6..08e8053 100644 --- a/printer/test/test_gerard.py +++ b/printer/test/test_gerard.py @@ -132,31 +132,19 @@ def test_create_print_job_cant_parse_development_mode(self): self.assertEqual( gerard.create_print_job( -<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, -======= - 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True ->>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-0", ) self.assertEqual( gerard.create_print_job( -<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, -======= - 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True ->>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-1", ) self.assertEqual( gerard.create_print_job( -<<<<<<< HEAD 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, -======= - 1, "1", "one-side", "HP_P2015_DN", "/tmp/test-id", True, True ->>>>>>> 65023cf (fix tests) ), "HP_LaserJet_p2015dn_Right-2", ) From 778c249cfb442eb3317b9190571a814f0fe65043 Mon Sep 17 00:00:00 2001 From: evan Date: Wed, 24 Dec 2025 14:42:26 -0800 Subject: [PATCH 8/9] SLEEP_TIME --- printer/modules/lpstat_helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/printer/modules/lpstat_helpers.py b/printer/modules/lpstat_helpers.py index f950891..64258ef 100644 --- a/printer/modules/lpstat_helpers.py +++ b/printer/modules/lpstat_helpers.py @@ -6,7 +6,7 @@ LPSTAT_CMD = "lpstat -o -W completed HP_LaserJet_p2015dn_Right" -SLEEP_TIME = 2 +POLL_LPSTAT_INTERVAL_SECONDS = 2 logging.basicConfig( # in mondo we trust @@ -66,4 +66,4 @@ def poll_lpstat(sqlite_file): except Exception: logging.exception("what happened to query_lpstat?") - time.sleep(SLEEP_TIME) + time.sleep(POLL_LPSTAT_INTERVAL_SECONDS) From 7a455a8c73604b65bcb568c985b444637c7bb38d Mon Sep 17 00:00:00 2001 From: evan Date: Wed, 24 Dec 2025 14:47:45 -0800 Subject: [PATCH 9/9] remove no_dev_printer --- printer/modules/gerard.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/printer/modules/gerard.py b/printer/modules/gerard.py index 294055f..9d247df 100644 --- a/printer/modules/gerard.py +++ b/printer/modules/gerard.py @@ -44,7 +44,6 @@ def create_print_job( printer_name, file_path, is_development_mode=False, - # no_dev_printer=False ): hold_time = "immediate" if is_development_mode: @@ -61,7 +60,7 @@ def create_print_job( file_path=file_path, ) - if is_development_mode and not is_dev_printer: + if is_development_mode: logging.warning( f"server is in development mode, command would've been `{command}`" )