mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-10 19:07:04 +01:00
The largest file in phone_focus_mode, and the last one blocking deploy.sh:
splitting it grows deploy.sh's two hardcoded lists, so those lists are only
final now. All 55 functions moved verbatim.
Three while-read loops were audited before extraction. Two call pm in their
bodies and moved untouched. The third, iter_whitelist_packages, is fed by a
pipe from printf and reads nothing from stdin -- already safe, and now said
so in ctl_usage.sh's header so the distinction is not lost by a later editor
who has only read the warning in daemon_apps.sh.
136 assertions and 22 mutations, all killed. Three survived the first run
and every one was a defect in MY OWN tests, not in the subject:
- cmd_status carries a THIRD copy of the Haversine, and I had asserted
only that it printed "some number". A wrong Earth radius sailed through.
Now the value is checked against a seeded fix ~4.3 km from home.
- the two whitelist filters were each tested with input the OTHER filter
also rejects, so either could be deleted with nothing failing. Fixed
with a punctuation-free undotted token (only the dot check rejects it)
and a dotted token carrying an illegal character (only the charset check
does), making each independently observable.
That last investigation turned up dead code: the `#*)` case arm is provably
equivalent, because `set -- $line` makes a comment's first token "#", which
the dot check already rejects. Removed rather than covered by a test that
cannot fail.
Coverage is NOT 100% and the real numbers are in the evidence: 41.79% to
92.98% across the eight, up from 5-22%. Unlike the daemon split, most of
what remains is genuinely untested -- the per-enforcer status blocks that
print mount state, APK hashes and offload settings, each needing its own
device fixture. The mutations prove the assertions that exist are load-
bearing; they do not prove those branches work.
jscpd checked in a clean worktree at 1.57%: eight files each carrying a
near-identical start/stop/status trio is exactly what that gate is for, so
the tests drive the trios through tables instead of repeating them.
Two drift hazards recorded, not fixed: ctl_is_curfew_now duplicates
daemon_location.sh's is_curfew_now (pinned by an agreement test across every
boundary minute), and cmd_status's awk is the third Haversine.
Over-cap count 17 -> 16. deploy.sh is the last one here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
172 lines
3.9 KiB
Bash
Executable File
172 lines
3.9 KiB
Bash
Executable File
#!/system/bin/sh
|
|
# shellcheck shell=ash
|
|
# ============================================================
|
|
# Focus Mode Control Utility
|
|
# Run on the phone via: su --mount-master -c /data/local/tmp/focus_mode/focus_ctl.sh <command>
|
|
# Or from PC via: adb shell su --mount-master -c '/data/local/tmp/focus_mode/focus_ctl.sh <command>'
|
|
# --mount-master is required so this script (and any daemon it spawns) joins
|
|
# the global mount namespace; otherwise the hosts bind mount is invisible and
|
|
# /data/adb/focus_mode/* checks fail due to per-session SELinux isolation.
|
|
# ============================================================
|
|
|
|
SCRIPT_DIR="/data/local/tmp/focus_mode"
|
|
. "$SCRIPT_DIR/config.sh"
|
|
# shellcheck source=ctl_hosts.sh
|
|
. "$SCRIPT_DIR/ctl_hosts.sh"
|
|
# shellcheck source=ctl_dns.sh
|
|
. "$SCRIPT_DIR/ctl_dns.sh"
|
|
# shellcheck source=ctl_launcher.sh
|
|
. "$SCRIPT_DIR/ctl_launcher.sh"
|
|
# shellcheck source=ctl_workout.sh
|
|
. "$SCRIPT_DIR/ctl_workout.sh"
|
|
# shellcheck source=ctl_curfew.sh
|
|
. "$SCRIPT_DIR/ctl_curfew.sh"
|
|
# shellcheck source=ctl_tether.sh
|
|
. "$SCRIPT_DIR/ctl_tether.sh"
|
|
# shellcheck source=ctl_usage.sh
|
|
. "$SCRIPT_DIR/ctl_usage.sh"
|
|
# shellcheck source=ctl_daemon.sh
|
|
. "$SCRIPT_DIR/ctl_daemon.sh"
|
|
|
|
|
|
# ---- Logging ----
|
|
log() {
|
|
local ts
|
|
ts="$(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo "[$ts] $1" >>"$LOG_FILE"
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HOSTS_PIDFILE="$STATE_DIR/hosts_enforcer.pid"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ---- DNS enforcer ----
|
|
# Hosts file only works for the system resolver. Apps using DoH/DoT bypass
|
|
# /etc/hosts entirely. The DNS enforcer forces Private DNS off and blocks
|
|
# well-known DoH/DoT endpoints so /etc/hosts is actually consulted.
|
|
|
|
DNS_PIDFILE="$STATE_DIR/dns_enforcer.pid"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ---- Launcher enforcer ----
|
|
|
|
LAUNCHER_PIDFILE="$STATE_DIR/launcher_enforcer.pid"
|
|
DISABLED_COMPETITORS_FILE="$STATE_DIR/disabled_competitors.txt"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ---- Workout detector ----
|
|
|
|
WORKOUT_PIDFILE="$STATE_DIR/workout_detector.pid"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================================
|
|
# Night-curfew control (see curfew_enforcer.sh / focus_daemon.sh)
|
|
# ============================================================
|
|
CURFEW_PIDFILE="$STATE_DIR/curfew_enforcer.pid"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmd_curfew_log() { tail -n "${1:-50}" "$CURFEW_ENFORCER_LOG" 2>/dev/null || echo "No curfew log yet."; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================================
|
|
# Hotspot / tethering block control (see tether_enforcer.sh)
|
|
# ============================================================
|
|
TETHER_PIDFILE="$STATE_DIR/tether_enforcer.pid"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "$1" in
|
|
start) cmd_start ;;
|
|
stop) cmd_stop ;;
|
|
status) cmd_status ;;
|
|
enable) cmd_enable ;;
|
|
disable) cmd_disable ;;
|
|
log) cmd_log "${2:-50}" ;;
|
|
list-apps) cmd_list_apps ;;
|
|
whitelist) cmd_whitelist ;;
|
|
restart)
|
|
cmd_stop
|
|
sleep 2
|
|
cmd_start
|
|
;;
|
|
hosts-status) cmd_hosts_status ;;
|
|
hosts-start) cmd_hosts_start ;;
|
|
hosts-stop) cmd_hosts_stop ;;
|
|
hosts-log) cmd_hosts_log "${2:-50}" ;;
|
|
dns-status) cmd_dns_status ;;
|
|
dns-start) cmd_dns_start ;;
|
|
dns-stop) cmd_dns_stop ;;
|
|
dns-log) cmd_dns_log "${2:-50}" ;;
|
|
launcher-status) cmd_launcher_status ;;
|
|
launcher-start) cmd_launcher_start ;;
|
|
launcher-stop) cmd_launcher_stop ;;
|
|
launcher-log) cmd_launcher_log "${2:-50}" ;;
|
|
launcher-snapshot) cmd_launcher_snapshot ;;
|
|
workout-status) cmd_workout_status ;;
|
|
workout-start) cmd_workout_start ;;
|
|
workout-stop) cmd_workout_stop ;;
|
|
workout-log) cmd_workout_log "${2:-50}" ;;
|
|
recheck) cmd_recheck ;;
|
|
notif-status) cmd_notif_status ;;
|
|
curfew-status) cmd_curfew_status ;;
|
|
curfew-start) cmd_curfew_start ;;
|
|
curfew-stop) cmd_curfew_stop ;;
|
|
curfew-log) cmd_curfew_log "${2:-50}" ;;
|
|
curfew-test-on) cmd_curfew_test_on ;;
|
|
curfew-test-off) cmd_curfew_test_off ;;
|
|
curfew-demo-on) cmd_curfew_demo_on ;;
|
|
curfew-demo-off) cmd_curfew_demo_off ;;
|
|
curfew-off) cmd_curfew_off ;;
|
|
curfew-on) cmd_curfew_on ;;
|
|
tether-status) cmd_tether_status ;;
|
|
tether-start) cmd_tether_start ;;
|
|
tether-stop) cmd_tether_stop ;;
|
|
tether-log) cmd_tether_log "${2:-50}" ;;
|
|
tether-test-on) cmd_tether_test_on ;;
|
|
tether-test-off) cmd_tether_test_off ;;
|
|
*) usage ;;
|
|
esac
|