From 0c581d6f5c8e40106576a6db21e1139c19ea031c Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Fri, 12 Dec 2025 16:41:32 +0300 Subject: [PATCH] [+] update oom_firefox 1. add l keybinding to change in realtime cgroup max memory limit; 2. make sure keybindings are not working when a dialog is opened; 3. make sure the app correctly handles Ctrl+C; 4. improve logging format, include a timestamp and line locatin; --- python/meson.build | 2 +- python/online/fxreader/pr34/oom_firefox.py | 101 ++++++++++++++++-- python/pyproject.toml | 1 + ...ne_fxreader_pr34-0.1.5.45-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.47-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.48-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.49-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.50-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.51-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.52-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.53-py3-none-any.whl | 3 + ...ne_fxreader_pr34-0.1.5.54-py3-none-any.whl | 3 + 12 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl create mode 100644 releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl diff --git a/python/meson.build b/python/meson.build index e9f40ff..6a57b6f 100644 --- a/python/meson.build +++ b/python/meson.build @@ -5,7 +5,7 @@ project( ).stdout().strip('\n'), # 'online.fxreader.uv', # ['c', 'cpp'], - version: '0.1.5.44', + version: '0.1.5.54', # default_options: [ # 'cpp_std=c++23', # # 'prefer_static=true', diff --git a/python/online/fxreader/pr34/oom_firefox.py b/python/online/fxreader/pr34/oom_firefox.py index 5e6733c..9311c03 100644 --- a/python/online/fxreader/pr34/oom_firefox.py +++ b/python/online/fxreader/pr34/oom_firefox.py @@ -13,8 +13,9 @@ import re import sys from prompt_toolkit.application import Application -from prompt_toolkit.key_binding import KeyBindings +from prompt_toolkit.key_binding import KeyBindings, ConditionalKeyBindings from prompt_toolkit.layout import Layout, HSplit, FloatContainer, Float +from prompt_toolkit.filters import Condition from prompt_toolkit.layout.containers import Window from prompt_toolkit.layout.controls import FormattedTextControl from prompt_toolkit.widgets import TextArea, Frame, Dialog, Button, Label @@ -23,6 +24,7 @@ from prompt_toolkit.styles import Style from typing import ( TypedDict, Any, + Optional, ) from collections import OrderedDict @@ -34,7 +36,7 @@ __created__ = '2025-11-21' # — Helper for cgroup / slice matching — -def get_cgroup_path(pid): +def get_cgroup_path(pid: int) -> Optional[str]: try: with open(f'/proc/{pid}/cgroup', 'r') as f: for line in f: @@ -264,6 +266,12 @@ def main(): logging.basicConfig( level=logging.INFO, + format=( + '%(asctime)s ' + '%(levelname)-8s ' + '%(filename)s:%(lineno)d ' + '%(funcName)s – %(message)s' + ), handlers=[ logging.handlers.RotatingFileHandler( pathlib.Path('~/.cache/oom_firefox/log').expanduser(), @@ -348,8 +356,8 @@ def main(): pass # app.exit() - # signal.signal(signal.SIGINT, lambda s, f: terminate()) - # signal.signal(signal.SIGTERM, lambda s, f: terminate()) + signal.signal(signal.SIGINT, lambda s, f: terminate()) + signal.signal(signal.SIGTERM, lambda s, f: terminate()) def refresh_body(): nonlocal firefox_proc @@ -397,8 +405,12 @@ def main(): def on_ok(): txt = ta.text - for m in re.finditer(r'\((\d+)\)', txt): + for m in re.finditer(r'\((\d+)[^\)\d]*\)', txt): low_priority_pids.add(int(m.group(1))) + for m in re.finditer(r'^\s*(\d+)\s*$', txt): + low_priority_pids.add(int(m.group(1))) + for m in re.finditer(r'^\s*-(\d+)\s*$', txt): + low_priority_pids.remove(int(m.group(1))) close_dialog() refresh_body() @@ -420,6 +432,63 @@ def main(): root_floats.append(f) app.layout.focus(ta) + def change_max_mb(max_mb: int) -> None: + for cmd in ( + [ + 'systemctl', + '--user', + 'set-property', + '%s.scope' % args.unit_name, + 'MemoryHigh=%dM' % max_mb, + ], + [ + 'systemctl', + '--user', + 'set-property', + '%s.scope' % args.unit_name, + 'MemoryMax=%dM' % (max_mb * 1.1), + ], + ): + logger.info(dict(cmd=cmd)) + + subprocess.check_call(cmd) + + args.max_mb = max_mb + + def open_limit_dialog(): + ta = TextArea(text='', multiline=True, scrollbar=True) + + def on_ok(): + txt = ta.text + m = re.compile(r'^\s*(\d+)\s*$').match(txt) + + a: str = 234234 + if m: + change_max_mb(int(m[1])) + + close_dialog() + refresh_body() + else: + logger.error('invalid input %s' % txt) + + def on_cancel(): + close_dialog() + + dialog = Dialog( + title='Enter maximum memory threshold in MB', + body=ta, + buttons=[ + Button(text='OK', handler=on_ok), + Button(text='Cancel', handler=on_cancel), + ], + width=60, + modal=True, + ) + f = Float(content=dialog, left=2, top=2) + dialog_float[0] = f + root_floats.append(f) + app.layout.focus(ta) + def open_message(title, message): def on_close(): close_dialog() @@ -445,6 +514,11 @@ def main(): kb = KeyBindings() + gkb = ConditionalKeyBindings( + key_bindings=kb, + filter=Condition(lambda: dialog_float[0] is None), + ) + @kb.add('q') def _(event): terminate() @@ -453,9 +527,18 @@ def main(): def _(event): open_pid_dialog() + @kb.add('l') + def _(event): + open_limit_dialog() + + HELP_TEXT = 'm=add PIDs, l=change limit, s=settings, a=about, q=quit' + @kb.add('h') def _(event): - open_message('Help', 'Keys: m=add PIDs, s=settings, a=about, q=quit') + open_message( + 'Help', + 'Keys: %s' % HELP_TEXT, + ) @kb.add('s') def _(event): @@ -479,7 +562,7 @@ def main(): Window( height=1, content=FormattedTextControl( - 'q=quit, m=PID, h=help, s=setting, a=about' + HELP_TEXT, ), ), ] @@ -498,7 +581,7 @@ def main(): app = Application( layout=Layout(root), - key_bindings=kb, + key_bindings=gkb, style=style, full_screen=True, refresh_interval=args.interval, @@ -531,7 +614,7 @@ def main(): # refresh_body() app.run( - handle_sigint=True + # handle_sigint=True ) # from prompt‑toolkit API :contentReference[oaicite:0]{index=0} t.join() diff --git a/python/pyproject.toml b/python/pyproject.toml index badcd38..3b929a2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -144,6 +144,7 @@ include = [ #'../../../../../follow_the_leader/logic/payments.py', #'../../../../../follow_the_leader/logic/paypal.py', 'online/fxreader/pr34/commands_typed/**/*.py', + #'online/fxreader/pr34/oom_firefox.py', ] # stubPath = '../mypy-stubs' extraPaths = [ diff --git a/releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl new file mode 100644 index 0000000..f431de1 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2453a83bddeb241769a350598b395fcfd25687012c7b2c0ea661a6eeb12776dc +size 82964 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl new file mode 100644 index 0000000..8ac0b29 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1c6e293c1d065bf0b4c95ee7d5737cde47a0af89d270a14547b544f3f88d770 +size 83100 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl new file mode 100644 index 0000000..975de8b --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1757771a00bda395b3a7fe8d7b0e186ebd2e85fd3155bc0efe6bdf8676e8d0ef +size 83157 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl new file mode 100644 index 0000000..060311a --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7f6fa731ebe094aebdaed8aeec4d424f536cf25205b7a9fcae744f717926404 +size 83159 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl new file mode 100644 index 0000000..f183df4 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43a3ab5b8144e3f0fb9370119152fae5733dd545a7477360f290de68227204d2 +size 83153 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl new file mode 100644 index 0000000..f5d9d86 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8151ce2349503ea794c7686334a2165a277f06ab44785a7932727abbbf10c20f +size 83251 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl new file mode 100644 index 0000000..6615bdd --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:115f3772c7ce52f9eaa64082f40bbfcfb6a4e53a787f7145641df56735255493 +size 83260 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl new file mode 100644 index 0000000..c66ba67 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba1c1ceb2f20f57d3446e965f9f22c1e24041b7d76fa8d4d58a2a8f094b98240 +size 83288 diff --git a/releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl b/releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl new file mode 100644 index 0000000..e646d23 --- /dev/null +++ b/releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f32e106209f3f8c1fc29c9d17c19ad473f8f1ce0af4d90df939beb8a1a56280 +size 83298