71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import psutil
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
|
|
|
|
XDOTOOL_CMD = ["xdotool", "getactivewindow", "getwindowname", "getwindowpid"]
|
|
|
|
|
|
SESSIONS = {
|
|
"sicp": [
|
|
"~",
|
|
"~/dev/sicp",
|
|
"mit-scheme",
|
|
"Mozilla Firefox",
|
|
"[No Name] - VIM",
|
|
re.compile("sicp-ex-"),
|
|
re.compile("\.scm"),
|
|
re.compile("Structure and Interpretation of Computer Programs"),
|
|
re.compile("SICP-Solutions"),
|
|
]
|
|
}
|
|
|
|
|
|
def is_window_allowed(window_name, allowed):
|
|
for a in allowed:
|
|
if type(a) is str and a == window_name:
|
|
return True
|
|
elif type(a) is re.Pattern and a.findall(window_name):
|
|
return True
|
|
return False
|
|
|
|
|
|
def main(session_name):
|
|
allowed_window_names = SESSIONS[session_name]
|
|
start_time = time.time()
|
|
|
|
while time.time() - start_time < 60 * 60:
|
|
time.sleep(5)
|
|
p = subprocess.run(XDOTOOL_CMD, capture_output=True)
|
|
if p.returncode != 0:
|
|
continue
|
|
window_name, window_pid, _ = p.stdout.decode().split("\n")
|
|
if not is_window_allowed(window_name, allowed_window_names):
|
|
p = psutil.Process(int(window_pid))
|
|
p.kill()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
session_name = sys.argv[1]
|
|
except IndexError:
|
|
print("Provide a session name as the first argument.")
|
|
sys.exit(1)
|
|
if not session_name in SESSIONS:
|
|
print(f"Session with name {session_name} does not exist.")
|
|
sys.exit(1)
|
|
|
|
if os.geteuid() == 0:
|
|
newpid = os.fork()
|
|
if newpid == 0:
|
|
main(session_name)
|
|
else:
|
|
cmd = ["sudo"] + sys.argv
|
|
subprocess.Popen(cmd, start_new_session=True)
|
|
|