Add existing scripts.
This commit is contained in:
11
README.md
11
README.md
@@ -1,3 +1,12 @@
|
||||
# focusfriend
|
||||
# FocusFriend
|
||||
|
||||
FocusFriend is an app that empowers users to utilize their computers mindfully.
|
||||
|
||||
|
||||
## Unkillable Process
|
||||
|
||||
Our monitoring process has to be unkillable.
|
||||
|
||||
I have found [this](https://skallwar.fr/posts/unkillable_process/) solution that
|
||||
uses Kernel hooks, but I think the approach via sudo is cleaner.
|
||||
|
||||
|
||||
48
blocker.py
Normal file
48
blocker.py
Normal file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import psutil
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
XDOTOOL_CMD = ["xdotool", "getactivewindow", "getwindowname", "getwindowpid"]
|
||||
|
||||
|
||||
BLOCKED_BROWSER_WORDS = []
|
||||
|
||||
def is_window_blocked(window_name, blocked):
|
||||
for b in blocked:
|
||||
if type(b) is str and b == window_name:
|
||||
return True
|
||||
elif type(b) is re.Pattern and b.findall(window_name):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
blocked = [re.compile(f"{word}.*(Firefox|Chromium)", flags=re.IGNORECASE)
|
||||
for word in BLOCKED_BROWSER_WORDS]
|
||||
while True:
|
||||
time.sleep(1)
|
||||
p = subprocess.run(XDOTOOL_CMD, capture_output=True)
|
||||
if p.returncode != 0:
|
||||
continue
|
||||
window_name, window_pid, _ = p.stdout.decode().split("\n")
|
||||
if is_window_blocked(window_name, blocked):
|
||||
p = psutil.Process(int(window_pid))
|
||||
p.kill()
|
||||
print(f"Kill {window_name}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if os.geteuid() == 0:
|
||||
newpid = os.fork()
|
||||
if newpid == 0:
|
||||
main()
|
||||
else:
|
||||
cmd = ["sudo"] + sys.argv
|
||||
subprocess.Popen(cmd, start_new_session=True)
|
||||
|
||||
70
focus.py
Normal file
70
focus.py
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/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)
|
||||
|
||||
51
hash.py
Executable file
51
hash.py
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import hashlib
|
||||
import sys
|
||||
import time
|
||||
import getpass
|
||||
|
||||
|
||||
def get_input():
|
||||
total_count = 0
|
||||
while not total_count:
|
||||
try:
|
||||
total_count = int(float(input("Enter count: ")))
|
||||
except ValueError:
|
||||
print("Enter a positive integer.")
|
||||
|
||||
seed, seed_check = "a", "b"
|
||||
while seed != seed_check:
|
||||
seed = getpass.getpass()
|
||||
seed_check = getpass.getpass(prompt="Confirm password: ")
|
||||
if seed != seed_check:
|
||||
print("Passwords must match.")
|
||||
return total_count, seed
|
||||
|
||||
|
||||
def print_progress(total_count, passed_time, current_count):
|
||||
projected_time = total_count * passed_time / current_count
|
||||
progress_time = "[{:.2f} / {:.2f}s".format(passed_time, projected_time)
|
||||
progress_percent = current_count / total_count * 100
|
||||
progress_percent = "- {:.2f}%]".format(progress_percent)
|
||||
print(progress_time, progress_percent, " ", end='\r')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
total_count, seed = get_input()
|
||||
|
||||
start_time = time.time()
|
||||
current_time = start_time
|
||||
m = hashlib.sha256()
|
||||
m.update(seed.encode())
|
||||
|
||||
for current_count in range(total_count):
|
||||
if time.time() - current_time > 1:
|
||||
current_time = time.time()
|
||||
passed_time = current_time - start_time
|
||||
print_progress(total_count, passed_time, current_count)
|
||||
m.update(m.digest())
|
||||
|
||||
print("{} hashes done. Final result:".format(total_count))
|
||||
print(m.hexdigest())
|
||||
|
||||
Reference in New Issue
Block a user