Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Scripts & Guides

A small collection of automation scripts and setup guides I built for my own use and cleaned up enough to share. Everything here is self-contained — pick the one folder you need and ignore the rest.

Licensed under AGPL-3.0. Please credit t-philip if you use or share these. If you modify any of these tools and make them available to others over a network, you must offer those users the source of your modified version.


Contents

FolderWhat it doesPlatform
Ping_Monitor_Router/Monitors your router's LAN IP and two WAN targets, logging outages to CSV with duration and a probable-restart flag. Runs as a systemd service.Linux
WindowsOS_Install_Apps/Automated fresh-install app setup via winget — one PowerShell script to rebuild a Windows machine's software stack.Windows
network/eve-ng/Step-by-step guide to running EVE-NG network emulation on VMware Workstation.VMware
python/pdf_search.py — search a PDF for lines matching text or a regex, with page numbers. formatted_print.py — an auto-aligning formatted print utility for tabular console output.Python

Ping Monitor

Detects and logs internet and LAN outages so you can tell the difference between "my router rebooted" and "my ISP went down" after the fact.

  • Pings your router's LAN IP and two public DNS resolvers independently
  • Distinguishes LAN outages (router down/restarting) from WAN-only outages (ISP)
  • Flags probable_restart when a LAN outage recovers quickly
  • Writes a daily summary line
  • CSV output, so it drops straight into a spreadsheet or a log analyser

Configure LAN_TARGET in ping_monitor.sh to your own router IP before running — the committed value is a placeholder default.


Windows Install Apps

Rebuilds a Windows machine's application set in one pass using winget, so a fresh install doesn't mean an afternoon of clicking through installers. Edit the app list in install-apps.ps1 to match what you actually want.


EVE-NG on VMware Workstation

A walkthrough for getting EVE-NG running as a VM under VMware Workstation, including the disk and networking settings that are easy to get wrong the first time.


PDF Search

python/pdf_search.py searches a PDF for lines matching some text and prints each one with its page number. Handy for pulling specific entries out of a long statement, report or export without scrolling through it.

Needs pdfplumber:

python -m pip install pdfplumber
# every line containing "Invoice" (case-sensitive substring — the default)
python pdf_search.py statement.pdf "Invoice"# case-insensitive
python pdf_search.py statement.pdf "invoice" -i
# only lines that START with the text
python pdf_search.py report.pdf "Total" --starts-with
# regular expression — any euro amount
python pdf_search.py statement.pdf "EUR ?[0-9.,]+" -r
# write the results to a file instead of printing them
python pdf_search.py report.pdf "Total" -o totals.txt
OptionEffect
-i, --ignore-caseMatch regardless of case
-r, --regexTreat the search text as a regular expression
--starts-withOnly match lines beginning with the text, rather than anywhere in the line
-o FILEWrite results to FILE instead of standard output
-q, --quietPrint only matching lines, with no header or count

It exits 1 when nothing matched, so it composes with shell scripts:

python pdf_search.py report.pdf "OVERDUE" -q &&echo"found something"

Pages that contain no extractable text — scans and image-only pages — are skipped with a warning on stderr rather than failing the run. A PDF that is entirely scanned images will return no matches; that needs OCR, which this script deliberately does not attempt.


Design

docs/DESIGN_SPEC.md explains why each tool works the way it does, one section per tool since they're unrelated, plus an honest verification status for each. Ping Monitor's non-root setup was live-tested end to end on a real systemd host; the rest was reasoned about and checked by hand, since there's no Windows fresh-install or VMware instance available to test those against from the machine that wrote it.


Reporting issues

Found a bug, a mistake in the documentation, or want to suggest something? Open an issue — pick a template and it will ask for the details that actually help.

This repository holds several unrelated tools, so please say which script or guide you mean — the template asks. These were written for one setup and generalised afterwards, so environment details are usually the key to reproducing anything.


Built and maintained by t-philip.

About

Automation scripts and setup guides — router outage monitoring, Windows app provisioning via winget, EVE-NG on VMware, and Python utilities.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages