diff --git a/api-js-fixed.js b/api/api-js-fixed.js similarity index 100% rename from api-js-fixed.js rename to api/api-js-fixed.js diff --git a/api-js-optimized.js b/api/api-js-optimized.js similarity index 100% rename from api-js-optimized.js rename to api/api-js-optimized.js diff --git a/api-js-retrieved.js b/api/api-js-retrieved.js similarity index 100% rename from api-js-retrieved.js rename to api/api-js-retrieved.js diff --git a/apirouters__init__.py b/api/apirouters__init__.py similarity index 100% rename from apirouters__init__.py rename to api/apirouters__init__.py diff --git a/import-js-retrieved.js b/api/import-js-retrieved.js similarity index 100% rename from import-js-retrieved.js rename to api/import-js-retrieved.js diff --git a/server-js-retrieved.js b/api/server-js-retrieved.js similarity index 100% rename from server-js-retrieved.js rename to api/server-js-retrieved.js diff --git a/test-query.js b/api/test-query.js similarity index 100% rename from test-query.js rename to api/test-query.js diff --git a/scripts/bgb-assign-exo-role.ps1 b/clients/bg-builders/scripts/bgb-assign-exo-role.ps1 similarity index 100% rename from scripts/bgb-assign-exo-role.ps1 rename to clients/bg-builders/scripts/bgb-assign-exo-role.ps1 diff --git a/scripts/bgb-check-lesley-ownership.ps1 b/clients/bg-builders/scripts/bgb-check-lesley-ownership.ps1 similarity index 100% rename from scripts/bgb-check-lesley-ownership.ps1 rename to clients/bg-builders/scripts/bgb-check-lesley-ownership.ps1 diff --git a/scripts/bgb-find-leslie.ps1 b/clients/bg-builders/scripts/bgb-find-leslie.ps1 similarity index 100% rename from scripts/bgb-find-leslie.ps1 rename to clients/bg-builders/scripts/bgb-find-leslie.ps1 diff --git a/scripts/bgb-lesley-disable-wipe.ps1 b/clients/bg-builders/scripts/bgb-lesley-disable-wipe.ps1 similarity index 100% rename from scripts/bgb-lesley-disable-wipe.ps1 rename to clients/bg-builders/scripts/bgb-lesley-disable-wipe.ps1 diff --git a/scripts/bgb-lesley-exchange.ps1 b/clients/bg-builders/scripts/bgb-lesley-exchange.ps1 similarity index 100% rename from scripts/bgb-lesley-exchange.ps1 rename to clients/bg-builders/scripts/bgb-lesley-exchange.ps1 diff --git a/scripts/bgb-lesley-fix-rules.ps1 b/clients/bg-builders/scripts/bgb-lesley-fix-rules.ps1 similarity index 100% rename from scripts/bgb-lesley-fix-rules.ps1 rename to clients/bg-builders/scripts/bgb-lesley-fix-rules.ps1 diff --git a/scripts/bgb-lesley-mail-report-20260309.txt b/clients/bg-builders/scripts/bgb-lesley-mail-report-20260309.txt similarity index 100% rename from scripts/bgb-lesley-mail-report-20260309.txt rename to clients/bg-builders/scripts/bgb-lesley-mail-report-20260309.txt diff --git a/scripts/bgb-lesley-mail-report.ps1 b/clients/bg-builders/scripts/bgb-lesley-mail-report.ps1 similarity index 100% rename from scripts/bgb-lesley-mail-report.ps1 rename to clients/bg-builders/scripts/bgb-lesley-mail-report.ps1 diff --git a/scripts/bgb-lesley-recover-review.ps1 b/clients/bg-builders/scripts/bgb-lesley-recover-review.ps1 similarity index 100% rename from scripts/bgb-lesley-recover-review.ps1 rename to clients/bg-builders/scripts/bgb-lesley-recover-review.ps1 diff --git a/scripts/bgb-lesley-verify-wipe.ps1 b/clients/bg-builders/scripts/bgb-lesley-verify-wipe.ps1 similarity index 100% rename from scripts/bgb-lesley-verify-wipe.ps1 rename to clients/bg-builders/scripts/bgb-lesley-verify-wipe.ps1 diff --git a/scripts/bgb-reenable-lesley.ps1 b/clients/bg-builders/scripts/bgb-reenable-lesley.ps1 similarity index 100% rename from scripts/bgb-reenable-lesley.ps1 rename to clients/bg-builders/scripts/bgb-reenable-lesley.ps1 diff --git a/scripts/bgb-terminate-lesley.ps1 b/clients/bg-builders/scripts/bgb-terminate-lesley.ps1 similarity index 100% rename from scripts/bgb-terminate-lesley.ps1 rename to clients/bg-builders/scripts/bgb-terminate-lesley.ps1 diff --git a/scripts/bgb-terminate-wrapper.cmd b/clients/bg-builders/scripts/bgb-terminate-wrapper.cmd similarity index 100% rename from scripts/bgb-terminate-wrapper.cmd rename to clients/bg-builders/scripts/bgb-terminate-wrapper.cmd diff --git a/scripts/bgb-verify-users.ps1 b/clients/bg-builders/scripts/bgb-verify-users.ps1 similarity index 100% rename from scripts/bgb-verify-users.ps1 rename to clients/bg-builders/scripts/bgb-verify-users.ps1 diff --git a/SYNC_SCRIPT_UPDATE_SUMMARY.md b/clients/dataforth/docs/SYNC_SCRIPT_UPDATE_SUMMARY.md similarity index 100% rename from SYNC_SCRIPT_UPDATE_SUMMARY.md rename to clients/dataforth/docs/SYNC_SCRIPT_UPDATE_SUMMARY.md diff --git a/Check-DataforthMailboxType.ps1 b/clients/dataforth/scripts/Check-DataforthMailboxType.ps1 similarity index 100% rename from Check-DataforthMailboxType.ps1 rename to clients/dataforth/scripts/Check-DataforthMailboxType.ps1 diff --git a/Get-DataforthEmailLogs.ps1 b/clients/dataforth/scripts/Get-DataforthEmailLogs.ps1 similarity index 100% rename from Get-DataforthEmailLogs.ps1 rename to clients/dataforth/scripts/Get-DataforthEmailLogs.ps1 diff --git a/Reset-DataforthAD-Password.ps1 b/clients/dataforth/scripts/Reset-DataforthAD-Password.ps1 similarity index 100% rename from Reset-DataforthAD-Password.ps1 rename to clients/dataforth/scripts/Reset-DataforthAD-Password.ps1 diff --git a/Reset-DataforthNotificationsPassword.ps1 b/clients/dataforth/scripts/Reset-DataforthNotificationsPassword.ps1 similarity index 100% rename from Reset-DataforthNotificationsPassword.ps1 rename to clients/dataforth/scripts/Reset-DataforthNotificationsPassword.ps1 diff --git a/Sync-FromNAS-retrieved.ps1 b/clients/dataforth/scripts/Sync-FromNAS-retrieved.ps1 similarity index 100% rename from Sync-FromNAS-retrieved.ps1 rename to clients/dataforth/scripts/Sync-FromNAS-retrieved.ps1 diff --git a/Test-DataforthSMTP.ps1 b/clients/dataforth/scripts/Test-DataforthSMTP.ps1 similarity index 100% rename from Test-DataforthSMTP.ps1 rename to clients/dataforth/scripts/Test-DataforthSMTP.ps1 diff --git a/access-ad2-via-smb.ps1 b/clients/dataforth/scripts/access-ad2-via-smb.ps1 similarity index 100% rename from access-ad2-via-smb.ps1 rename to clients/dataforth/scripts/access-ad2-via-smb.ps1 diff --git a/add-ad2-key-to-nas.ps1 b/clients/dataforth/scripts/add-ad2-key-to-nas.ps1 similarity index 100% rename from add-ad2-key-to-nas.ps1 rename to clients/dataforth/scripts/add-ad2-key-to-nas.ps1 diff --git a/add-key-to-nas.ps1 b/clients/dataforth/scripts/add-key-to-nas.ps1 similarity index 100% rename from add-key-to-nas.ps1 rename to clients/dataforth/scripts/add-key-to-nas.ps1 diff --git a/check-ad2-bat-files.ps1 b/clients/dataforth/scripts/check-ad2-bat-files.ps1 similarity index 100% rename from check-ad2-bat-files.ps1 rename to clients/dataforth/scripts/check-ad2-bat-files.ps1 diff --git a/check-ad2-sync-log.ps1 b/clients/dataforth/scripts/check-ad2-sync-log.ps1 similarity index 100% rename from check-ad2-sync-log.ps1 rename to clients/dataforth/scripts/check-ad2-sync-log.ps1 diff --git a/check-bat-on-nas.ps1 b/clients/dataforth/scripts/check-bat-on-nas.ps1 similarity index 100% rename from check-bat-on-nas.ps1 rename to clients/dataforth/scripts/check-bat-on-nas.ps1 diff --git a/check-db-error.ps1 b/clients/dataforth/scripts/check-db-error.ps1 similarity index 100% rename from check-db-error.ps1 rename to clients/dataforth/scripts/check-db-error.ps1 diff --git a/check-db-performance.ps1 b/clients/dataforth/scripts/check-db-performance.ps1 similarity index 100% rename from check-db-performance.ps1 rename to clients/dataforth/scripts/check-db-performance.ps1 diff --git a/check-db-server.ps1 b/clients/dataforth/scripts/check-db-server.ps1 similarity index 100% rename from check-db-server.ps1 rename to clients/dataforth/scripts/check-db-server.ps1 diff --git a/check-db-simple.ps1 b/clients/dataforth/scripts/check-db-simple.ps1 similarity index 100% rename from check-db-simple.ps1 rename to clients/dataforth/scripts/check-db-simple.ps1 diff --git a/check-dos-compatibility.ps1 b/clients/dataforth/scripts/check-dos-compatibility.ps1 similarity index 100% rename from check-dos-compatibility.ps1 rename to clients/dataforth/scripts/check-dos-compatibility.ps1 diff --git a/check-dos-line-endings.ps1 b/clients/dataforth/scripts/check-dos-line-endings.ps1 similarity index 100% rename from check-dos-line-endings.ps1 rename to clients/dataforth/scripts/check-dos-line-endings.ps1 diff --git a/check-junction.ps1 b/clients/dataforth/scripts/check-junction.ps1 similarity index 100% rename from check-junction.ps1 rename to clients/dataforth/scripts/check-junction.ps1 diff --git a/check-latest-errors.ps1 b/clients/dataforth/scripts/check-latest-errors.ps1 similarity index 100% rename from check-latest-errors.ps1 rename to clients/dataforth/scripts/check-latest-errors.ps1 diff --git a/check-line-endings.ps1 b/clients/dataforth/scripts/check-line-endings.ps1 similarity index 100% rename from check-line-endings.ps1 rename to clients/dataforth/scripts/check-line-endings.ps1 diff --git a/check-new-records.ps1 b/clients/dataforth/scripts/check-new-records.ps1 similarity index 100% rename from check-new-records.ps1 rename to clients/dataforth/scripts/check-new-records.ps1 diff --git a/check-openssh-client.ps1 b/clients/dataforth/scripts/check-openssh-client.ps1 similarity index 100% rename from check-openssh-client.ps1 rename to clients/dataforth/scripts/check-openssh-client.ps1 diff --git a/check-plink-references.ps1 b/clients/dataforth/scripts/check-plink-references.ps1 similarity index 100% rename from check-plink-references.ps1 rename to clients/dataforth/scripts/check-plink-references.ps1 diff --git a/check-pscp-usage.ps1 b/clients/dataforth/scripts/check-pscp-usage.ps1 similarity index 100% rename from check-pscp-usage.ps1 rename to clients/dataforth/scripts/check-pscp-usage.ps1 diff --git a/check-scp-commands.ps1 b/clients/dataforth/scripts/check-scp-commands.ps1 similarity index 100% rename from check-scp-commands.ps1 rename to clients/dataforth/scripts/check-scp-commands.ps1 diff --git a/check-scp-errors.ps1 b/clients/dataforth/scripts/check-scp-errors.ps1 similarity index 100% rename from check-scp-errors.ps1 rename to clients/dataforth/scripts/check-scp-errors.ps1 diff --git a/check-ssh-config.ps1 b/clients/dataforth/scripts/check-ssh-config.ps1 similarity index 100% rename from check-ssh-config.ps1 rename to clients/dataforth/scripts/check-ssh-config.ps1 diff --git a/check-sync-log.ps1 b/clients/dataforth/scripts/check-sync-log.ps1 similarity index 100% rename from check-sync-log.ps1 rename to clients/dataforth/scripts/check-sync-log.ps1 diff --git a/check-sync-script.ps1 b/clients/dataforth/scripts/check-sync-script.ps1 similarity index 100% rename from check-sync-script.ps1 rename to clients/dataforth/scripts/check-sync-script.ps1 diff --git a/check-sync-status.ps1 b/clients/dataforth/scripts/check-sync-status.ps1 similarity index 100% rename from check-sync-status.ps1 rename to clients/dataforth/scripts/check-sync-status.ps1 diff --git a/check-wal-files.ps1 b/clients/dataforth/scripts/check-wal-files.ps1 similarity index 100% rename from check-wal-files.ps1 rename to clients/dataforth/scripts/check-wal-files.ps1 diff --git a/check_old_database.bat b/clients/dataforth/scripts/check_old_database.bat similarity index 100% rename from check_old_database.bat rename to clients/dataforth/scripts/check_old_database.bat diff --git a/convert-to-dos.ps1 b/clients/dataforth/scripts/convert-to-dos.ps1 similarity index 100% rename from convert-to-dos.ps1 rename to clients/dataforth/scripts/convert-to-dos.ps1 diff --git a/copy-install-from-temp.ps1 b/clients/dataforth/scripts/copy-install-from-temp.ps1 similarity index 100% rename from copy-install-from-temp.ps1 rename to clients/dataforth/scripts/copy-install-from-temp.ps1 diff --git a/copy-install-script-to-ad2.ps1 b/clients/dataforth/scripts/copy-install-script-to-ad2.ps1 similarity index 100% rename from copy-install-script-to-ad2.ps1 rename to clients/dataforth/scripts/copy-install-script-to-ad2.ps1 diff --git a/copy-root-files-to-ad2.ps1 b/clients/dataforth/scripts/copy-root-files-to-ad2.ps1 similarity index 100% rename from copy-root-files-to-ad2.ps1 rename to clients/dataforth/scripts/copy-root-files-to-ad2.ps1 diff --git a/copy-stop-install-to-ad2.ps1 b/clients/dataforth/scripts/copy-stop-install-to-ad2.ps1 similarity index 100% rename from copy-stop-install-to-ad2.ps1 rename to clients/dataforth/scripts/copy-stop-install-to-ad2.ps1 diff --git a/copy-to-ad2.ps1 b/clients/dataforth/scripts/copy-to-ad2.ps1 similarity index 100% rename from copy-to-ad2.ps1 rename to clients/dataforth/scripts/copy-to-ad2.ps1 diff --git a/copy-to-nas-now.ps1 b/clients/dataforth/scripts/copy-to-nas-now.ps1 similarity index 100% rename from copy-to-nas-now.ps1 rename to clients/dataforth/scripts/copy-to-nas-now.ps1 diff --git a/create-ssh-wrapper.ps1 b/clients/dataforth/scripts/create-ssh-wrapper.ps1 similarity index 100% rename from create-ssh-wrapper.ps1 rename to clients/dataforth/scripts/create-ssh-wrapper.ps1 diff --git a/dataforth-notifications-creds.txt b/clients/dataforth/scripts/dataforth-notifications-creds.txt similarity index 100% rename from dataforth-notifications-creds.txt rename to clients/dataforth/scripts/dataforth-notifications-creds.txt diff --git a/demo-ad2-automation.ps1 b/clients/dataforth/scripts/demo-ad2-automation.ps1 similarity index 100% rename from demo-ad2-automation.ps1 rename to clients/dataforth/scripts/demo-ad2-automation.ps1 diff --git a/deploy-agent-to-ad2-simple.ps1 b/clients/dataforth/scripts/deploy-agent-to-ad2-simple.ps1 similarity index 100% rename from deploy-agent-to-ad2-simple.ps1 rename to clients/dataforth/scripts/deploy-agent-to-ad2-simple.ps1 diff --git a/deploy-agent-to-ad2.ps1 b/clients/dataforth/scripts/deploy-agent-to-ad2.ps1 similarity index 100% rename from deploy-agent-to-ad2.ps1 rename to clients/dataforth/scripts/deploy-agent-to-ad2.ps1 diff --git a/deploy-db-fix.ps1 b/clients/dataforth/scripts/deploy-db-fix.ps1 similarity index 100% rename from deploy-db-fix.ps1 rename to clients/dataforth/scripts/deploy-db-fix.ps1 diff --git a/deploy-db-optimization-smb.ps1 b/clients/dataforth/scripts/deploy-db-optimization-smb.ps1 similarity index 100% rename from deploy-db-optimization-smb.ps1 rename to clients/dataforth/scripts/deploy-db-optimization-smb.ps1 diff --git a/deploy-db-optimization.ps1 b/clients/dataforth/scripts/deploy-db-optimization.ps1 similarity index 100% rename from deploy-db-optimization.ps1 rename to clients/dataforth/scripts/deploy-db-optimization.ps1 diff --git a/deploy-test-query.ps1 b/clients/dataforth/scripts/deploy-test-query.ps1 similarity index 100% rename from deploy-test-query.ps1 rename to clients/dataforth/scripts/deploy-test-query.ps1 diff --git a/scripts/df-check-desktop-creds.ps1 b/clients/dataforth/scripts/df-check-desktop-creds.ps1 similarity index 100% rename from scripts/df-check-desktop-creds.ps1 rename to clients/dataforth/scripts/df-check-desktop-creds.ps1 diff --git a/scripts/df-check-jlohr-lockout.ps1 b/clients/dataforth/scripts/df-check-jlohr-lockout.ps1 similarity index 100% rename from scripts/df-check-jlohr-lockout.ps1 rename to clients/dataforth/scripts/df-check-jlohr-lockout.ps1 diff --git a/scripts/df-test-winrm.ps1 b/clients/dataforth/scripts/df-test-winrm.ps1 similarity index 100% rename from scripts/df-test-winrm.ps1 rename to clients/dataforth/scripts/df-test-winrm.ps1 diff --git a/diagnose-nas-ssh.ps1 b/clients/dataforth/scripts/diagnose-nas-ssh.ps1 similarity index 100% rename from diagnose-nas-ssh.ps1 rename to clients/dataforth/scripts/diagnose-nas-ssh.ps1 diff --git a/diagnose-sync-issue.ps1 b/clients/dataforth/scripts/diagnose-sync-issue.ps1 similarity index 100% rename from diagnose-sync-issue.ps1 rename to clients/dataforth/scripts/diagnose-sync-issue.ps1 diff --git a/explore-testdatadb.ps1 b/clients/dataforth/scripts/explore-testdatadb.ps1 similarity index 100% rename from explore-testdatadb.ps1 rename to clients/dataforth/scripts/explore-testdatadb.ps1 diff --git a/find-error-logging.ps1 b/clients/dataforth/scripts/find-error-logging.ps1 similarity index 100% rename from find-error-logging.ps1 rename to clients/dataforth/scripts/find-error-logging.ps1 diff --git a/scripts/fix-ad2-error-logging.ps1 b/clients/dataforth/scripts/fix-ad2-error-logging.ps1 similarity index 100% rename from scripts/fix-ad2-error-logging.ps1 rename to clients/dataforth/scripts/fix-ad2-error-logging.ps1 diff --git a/get-server-js.ps1 b/clients/dataforth/scripts/get-server-js.ps1 similarity index 100% rename from get-server-js.ps1 rename to clients/dataforth/scripts/get-server-js.ps1 diff --git a/get-sync-error-details.ps1 b/clients/dataforth/scripts/get-sync-error-details.ps1 similarity index 100% rename from get-sync-error-details.ps1 rename to clients/dataforth/scripts/get-sync-error-details.ps1 diff --git a/get-sync-script.ps1 b/clients/dataforth/scripts/get-sync-script.ps1 similarity index 100% rename from get-sync-script.ps1 rename to clients/dataforth/scripts/get-sync-script.ps1 diff --git a/get-testdb-docs.ps1 b/clients/dataforth/scripts/get-testdb-docs.ps1 similarity index 100% rename from get-testdb-docs.ps1 rename to clients/dataforth/scripts/get-testdb-docs.ps1 diff --git a/install-agent-on-ad2.ps1 b/clients/dataforth/scripts/install-agent-on-ad2.ps1 similarity index 100% rename from install-agent-on-ad2.ps1 rename to clients/dataforth/scripts/install-agent-on-ad2.ps1 diff --git a/install-from-temp.ps1 b/clients/dataforth/scripts/install-from-temp.ps1 similarity index 100% rename from install-from-temp.ps1 rename to clients/dataforth/scripts/install-from-temp.ps1 diff --git a/investigate-sync-errors.ps1 b/clients/dataforth/scripts/investigate-sync-errors.ps1 similarity index 100% rename from investigate-sync-errors.ps1 rename to clients/dataforth/scripts/investigate-sync-errors.ps1 diff --git a/manual-push-to-nas.sh b/clients/dataforth/scripts/manual-push-to-nas.sh similarity index 100% rename from manual-push-to-nas.sh rename to clients/dataforth/scripts/manual-push-to-nas.sh diff --git a/monitor-next-sync.ps1 b/clients/dataforth/scripts/monitor-next-sync.ps1 similarity index 100% rename from monitor-next-sync.ps1 rename to clients/dataforth/scripts/monitor-next-sync.ps1 diff --git a/monitor-sync-status.ps1 b/clients/dataforth/scripts/monitor-sync-status.ps1 similarity index 100% rename from monitor-sync-status.ps1 rename to clients/dataforth/scripts/monitor-sync-status.ps1 diff --git a/push-fixed-bat-files.ps1 b/clients/dataforth/scripts/push-fixed-bat-files.ps1 similarity index 100% rename from push-fixed-bat-files.ps1 rename to clients/dataforth/scripts/push-fixed-bat-files.ps1 diff --git a/quick-sync-check.ps1 b/clients/dataforth/scripts/quick-sync-check.ps1 similarity index 100% rename from quick-sync-check.ps1 rename to clients/dataforth/scripts/quick-sync-check.ps1 diff --git a/read-sync-script.ps1 b/clients/dataforth/scripts/read-sync-script.ps1 similarity index 100% rename from read-sync-script.ps1 rename to clients/dataforth/scripts/read-sync-script.ps1 diff --git a/recreate-sync-task.ps1 b/clients/dataforth/scripts/recreate-sync-task.ps1 similarity index 100% rename from recreate-sync-task.ps1 rename to clients/dataforth/scripts/recreate-sync-task.ps1 diff --git a/remove-pause-echo.ps1 b/clients/dataforth/scripts/remove-pause-echo.ps1 similarity index 100% rename from remove-pause-echo.ps1 rename to clients/dataforth/scripts/remove-pause-echo.ps1 diff --git a/restart-ad2-agent.ps1 b/clients/dataforth/scripts/restart-ad2-agent.ps1 similarity index 100% rename from restart-ad2-agent.ps1 rename to clients/dataforth/scripts/restart-ad2-agent.ps1 diff --git a/restore-and-fix-sync.ps1 b/clients/dataforth/scripts/restore-and-fix-sync.ps1 similarity index 100% rename from restore-and-fix-sync.ps1 rename to clients/dataforth/scripts/restore-and-fix-sync.ps1 diff --git a/restore-original.ps1 b/clients/dataforth/scripts/restore-original.ps1 similarity index 100% rename from restore-original.ps1 rename to clients/dataforth/scripts/restore-original.ps1 diff --git a/run-sync-direct.ps1 b/clients/dataforth/scripts/run-sync-direct.ps1 similarity index 100% rename from run-sync-direct.ps1 rename to clients/dataforth/scripts/run-sync-direct.ps1 diff --git a/search-menux-ad2.ps1 b/clients/dataforth/scripts/search-menux-ad2.ps1 similarity index 100% rename from search-menux-ad2.ps1 rename to clients/dataforth/scripts/search-menux-ad2.ps1 diff --git a/setup-openssh-sync.ps1 b/clients/dataforth/scripts/setup-openssh-sync.ps1 similarity index 100% rename from setup-openssh-sync.ps1 rename to clients/dataforth/scripts/setup-openssh-sync.ps1 diff --git a/simple-testdb-check.ps1 b/clients/dataforth/scripts/simple-testdb-check.ps1 similarity index 100% rename from simple-testdb-check.ps1 rename to clients/dataforth/scripts/simple-testdb-check.ps1 diff --git a/stop-and-install-agent.ps1 b/clients/dataforth/scripts/stop-and-install-agent.ps1 similarity index 100% rename from stop-and-install-agent.ps1 rename to clients/dataforth/scripts/stop-and-install-agent.ps1 diff --git a/temp-check-ad2-timestamps.ps1 b/clients/dataforth/scripts/temp-check-ad2-timestamps.ps1 similarity index 100% rename from temp-check-ad2-timestamps.ps1 rename to clients/dataforth/scripts/temp-check-ad2-timestamps.ps1 diff --git a/temp-check-nas-files.ps1 b/clients/dataforth/scripts/temp-check-nas-files.ps1 similarity index 100% rename from temp-check-nas-files.ps1 rename to clients/dataforth/scripts/temp-check-nas-files.ps1 diff --git a/temp-check-task-scheduler.ps1 b/clients/dataforth/scripts/temp-check-task-scheduler.ps1 similarity index 100% rename from temp-check-task-scheduler.ps1 rename to clients/dataforth/scripts/temp-check-task-scheduler.ps1 diff --git a/temp-find-sync-script.ps1 b/clients/dataforth/scripts/temp-find-sync-script.ps1 similarity index 100% rename from temp-find-sync-script.ps1 rename to clients/dataforth/scripts/temp-find-sync-script.ps1 diff --git a/temp-get-log.ps1 b/clients/dataforth/scripts/temp-get-log.ps1 similarity index 100% rename from temp-get-log.ps1 rename to clients/dataforth/scripts/temp-get-log.ps1 diff --git a/temp-get-sync-config.ps1 b/clients/dataforth/scripts/temp-get-sync-config.ps1 similarity index 100% rename from temp-get-sync-config.ps1 rename to clients/dataforth/scripts/temp-get-sync-config.ps1 diff --git a/temp-get-sync-script.ps1 b/clients/dataforth/scripts/temp-get-sync-script.ps1 similarity index 100% rename from temp-get-sync-script.ps1 rename to clients/dataforth/scripts/temp-get-sync-script.ps1 diff --git a/temp-read-sync-script.ps1 b/clients/dataforth/scripts/temp-read-sync-script.ps1 similarity index 100% rename from temp-read-sync-script.ps1 rename to clients/dataforth/scripts/temp-read-sync-script.ps1 diff --git a/temp-search-ad2-database.ps1 b/clients/dataforth/scripts/temp-search-ad2-database.ps1 similarity index 100% rename from temp-search-ad2-database.ps1 rename to clients/dataforth/scripts/temp-search-ad2-database.ps1 diff --git a/test-ad2-network.ps1 b/clients/dataforth/scripts/test-ad2-network.ps1 similarity index 100% rename from test-ad2-network.ps1 rename to clients/dataforth/scripts/test-ad2-network.ps1 diff --git a/test-db-directly.ps1 b/clients/dataforth/scripts/test-db-directly.ps1 similarity index 100% rename from test-db-directly.ps1 rename to clients/dataforth/scripts/test-db-directly.ps1 diff --git a/test-error-logging.ps1 b/clients/dataforth/scripts/test-error-logging.ps1 similarity index 100% rename from test-error-logging.ps1 rename to clients/dataforth/scripts/test-error-logging.ps1 diff --git a/test-ssh-after-key.ps1 b/clients/dataforth/scripts/test-ssh-after-key.ps1 similarity index 100% rename from test-ssh-after-key.ps1 rename to clients/dataforth/scripts/test-ssh-after-key.ps1 diff --git a/test-ssh-direct.ps1 b/clients/dataforth/scripts/test-ssh-direct.ps1 similarity index 100% rename from test-ssh-direct.ps1 rename to clients/dataforth/scripts/test-ssh-direct.ps1 diff --git a/test-ssh-from-ad2.ps1 b/clients/dataforth/scripts/test-ssh-from-ad2.ps1 similarity index 100% rename from test-ssh-from-ad2.ps1 rename to clients/dataforth/scripts/test-ssh-from-ad2.ps1 diff --git a/test-ssh-now.ps1 b/clients/dataforth/scripts/test-ssh-now.ps1 similarity index 100% rename from test-ssh-now.ps1 rename to clients/dataforth/scripts/test-ssh-now.ps1 diff --git a/test-ssh-via-cmd.ps1 b/clients/dataforth/scripts/test-ssh-via-cmd.ps1 similarity index 100% rename from test-ssh-via-cmd.ps1 rename to clients/dataforth/scripts/test-ssh-via-cmd.ps1 diff --git a/test-updated-sync.ps1 b/clients/dataforth/scripts/test-updated-sync.ps1 similarity index 100% rename from test-updated-sync.ps1 rename to clients/dataforth/scripts/test-updated-sync.ps1 diff --git a/test-winrm.ps1 b/clients/dataforth/scripts/test-winrm.ps1 similarity index 100% rename from test-winrm.ps1 rename to clients/dataforth/scripts/test-winrm.ps1 diff --git a/trigger-ad2-sync-now.ps1 b/clients/dataforth/scripts/trigger-ad2-sync-now.ps1 similarity index 100% rename from trigger-ad2-sync-now.ps1 rename to clients/dataforth/scripts/trigger-ad2-sync-now.ps1 diff --git a/trigger-sync-now.ps1 b/clients/dataforth/scripts/trigger-sync-now.ps1 similarity index 100% rename from trigger-sync-now.ps1 rename to clients/dataforth/scripts/trigger-sync-now.ps1 diff --git a/trigger-sync-push.ps1 b/clients/dataforth/scripts/trigger-sync-push.ps1 similarity index 100% rename from trigger-sync-push.ps1 rename to clients/dataforth/scripts/trigger-sync-push.ps1 diff --git a/trigger-sync.ps1 b/clients/dataforth/scripts/trigger-sync.ps1 similarity index 100% rename from trigger-sync.ps1 rename to clients/dataforth/scripts/trigger-sync.ps1 diff --git a/update-sync-to-openssh.ps1 b/clients/dataforth/scripts/update-sync-to-openssh.ps1 similarity index 100% rename from update-sync-to-openssh.ps1 rename to clients/dataforth/scripts/update-sync-to-openssh.ps1 diff --git a/verify-ad2-files.ps1 b/clients/dataforth/scripts/verify-ad2-files.ps1 similarity index 100% rename from verify-ad2-files.ps1 rename to clients/dataforth/scripts/verify-ad2-files.ps1 diff --git a/verify-ad2-line-endings.ps1 b/clients/dataforth/scripts/verify-ad2-line-endings.ps1 similarity index 100% rename from verify-ad2-line-endings.ps1 rename to clients/dataforth/scripts/verify-ad2-line-endings.ps1 diff --git a/verify-and-test-sync.ps1 b/clients/dataforth/scripts/verify-and-test-sync.ps1 similarity index 100% rename from verify-and-test-sync.ps1 rename to clients/dataforth/scripts/verify-and-test-sync.ps1 diff --git a/verify-bat-deployment.ps1 b/clients/dataforth/scripts/verify-bat-deployment.ps1 similarity index 100% rename from verify-bat-deployment.ps1 rename to clients/dataforth/scripts/verify-bat-deployment.ps1 diff --git a/verify-error-logging.ps1 b/clients/dataforth/scripts/verify-error-logging.ps1 similarity index 100% rename from verify-error-logging.ps1 rename to clients/dataforth/scripts/verify-error-logging.ps1 diff --git a/verify-nas-crlf.ps1 b/clients/dataforth/scripts/verify-nas-crlf.ps1 similarity index 100% rename from verify-nas-crlf.ps1 rename to clients/dataforth/scripts/verify-nas-crlf.ps1 diff --git a/Remove-CentraStage.ps1 b/clients/glaztech/scripts/Remove-CentraStage.ps1 similarity index 100% rename from Remove-CentraStage.ps1 rename to clients/glaztech/scripts/Remove-CentraStage.ps1 diff --git a/SSH_ACCESS_SETUP.md b/clients/internal-infrastructure/docs/SSH_ACCESS_SETUP.md similarity index 100% rename from SSH_ACCESS_SETUP.md rename to clients/internal-infrastructure/docs/SSH_ACCESS_SETUP.md diff --git a/SSH_CONNECTION_INVESTIGATION_REPORT.md b/clients/internal-infrastructure/docs/SSH_CONNECTION_INVESTIGATION_REPORT.md similarity index 100% rename from SSH_CONNECTION_INVESTIGATION_REPORT.md rename to clients/internal-infrastructure/docs/SSH_CONNECTION_INVESTIGATION_REPORT.md diff --git a/Reset-GiteaPassword.ps1 b/clients/internal-infrastructure/scripts/Reset-GiteaPassword.ps1 similarity index 100% rename from Reset-GiteaPassword.ps1 rename to clients/internal-infrastructure/scripts/Reset-GiteaPassword.ps1 diff --git a/Reset-Password-ExchangeOnline.ps1 b/clients/internal-infrastructure/scripts/Reset-Password-ExchangeOnline.ps1 similarity index 100% rename from Reset-Password-ExchangeOnline.ps1 rename to clients/internal-infrastructure/scripts/Reset-Password-ExchangeOnline.ps1 diff --git a/add-rob-to-gdap-groups.ps1 b/clients/internal-infrastructure/scripts/add-rob-to-gdap-groups.ps1 similarity index 100% rename from add-rob-to-gdap-groups.ps1 rename to clients/internal-infrastructure/scripts/add-rob-to-gdap-groups.ps1 diff --git a/check-node-running.ps1 b/clients/internal-infrastructure/scripts/check-node-running.ps1 similarity index 100% rename from check-node-running.ps1 rename to clients/internal-infrastructure/scripts/check-node-running.ps1 diff --git a/compare-common-folders.ps1 b/clients/internal-infrastructure/scripts/compare-common-folders.ps1 similarity index 100% rename from compare-common-folders.ps1 rename to clients/internal-infrastructure/scripts/compare-common-folders.ps1 diff --git a/create-task-xml.ps1 b/clients/internal-infrastructure/scripts/create-task-xml.ps1 similarity index 100% rename from create-task-xml.ps1 rename to clients/internal-infrastructure/scripts/create-task-xml.ps1 diff --git a/find_backup_folders.ps1 b/clients/internal-infrastructure/scripts/find_backup_folders.ps1 similarity index 100% rename from find_backup_folders.ps1 rename to clients/internal-infrastructure/scripts/find_backup_folders.ps1 diff --git a/find_ts_backups.ps1 b/clients/internal-infrastructure/scripts/find_ts_backups.ps1 similarity index 100% rename from find_ts_backups.ps1 rename to clients/internal-infrastructure/scripts/find_ts_backups.ps1 diff --git a/reset-gitea-password.sh b/clients/internal-infrastructure/scripts/reset-gitea-password.sh similarity index 100% rename from reset-gitea-password.sh rename to clients/internal-infrastructure/scripts/reset-gitea-password.sh diff --git a/test-api-endpoint.ps1 b/clients/internal-infrastructure/scripts/test-api-endpoint.ps1 similarity index 100% rename from test-api-endpoint.ps1 rename to clients/internal-infrastructure/scripts/test-api-endpoint.ps1 diff --git a/schema-retrieved.sql b/docs/database/schema-retrieved.sql similarity index 100% rename from schema-retrieved.sql rename to docs/database/schema-retrieved.sql diff --git a/Create-PeacefulSpiritVPN.ps1 b/infrastructure/vpn-configs/Create-PeacefulSpiritVPN.ps1 similarity index 100% rename from Create-PeacefulSpiritVPN.ps1 rename to infrastructure/vpn-configs/Create-PeacefulSpiritVPN.ps1 diff --git a/Setup-PeacefulSpiritVPN.ps1 b/infrastructure/vpn-configs/Setup-PeacefulSpiritVPN.ps1 similarity index 100% rename from Setup-PeacefulSpiritVPN.ps1 rename to infrastructure/vpn-configs/Setup-PeacefulSpiritVPN.ps1 diff --git a/docs/forum-posts/arch-linux-ext4-home-from-windows-drive.md b/projects/community-forum/forum-posts/arch-linux-ext4-home-from-windows-drive.md similarity index 100% rename from docs/forum-posts/arch-linux-ext4-home-from-windows-drive.md rename to projects/community-forum/forum-posts/arch-linux-ext4-home-from-windows-drive.md diff --git a/docs/forum-posts/cachyos-tailscale-fix.md b/projects/community-forum/forum-posts/cachyos-tailscale-fix.md similarity index 100% rename from docs/forum-posts/cachyos-tailscale-fix.md rename to projects/community-forum/forum-posts/cachyos-tailscale-fix.md diff --git a/docs/forum-posts/esxi8-evaluation-license-reset.md b/projects/community-forum/forum-posts/esxi8-evaluation-license-reset.md similarity index 100% rename from docs/forum-posts/esxi8-evaluation-license-reset.md rename to projects/community-forum/forum-posts/esxi8-evaluation-license-reset.md diff --git a/docs/forum-posts/freepbx17-pjsip-trunk-name-reload-fix.md b/projects/community-forum/forum-posts/freepbx17-pjsip-trunk-name-reload-fix.md similarity index 100% rename from docs/forum-posts/freepbx17-pjsip-trunk-name-reload-fix.md rename to projects/community-forum/forum-posts/freepbx17-pjsip-trunk-name-reload-fix.md diff --git a/docs/forum-posts/kde-plasma-brightness-nvidia-intel-fix.md b/projects/community-forum/forum-posts/kde-plasma-brightness-nvidia-intel-fix.md similarity index 100% rename from docs/forum-posts/kde-plasma-brightness-nvidia-intel-fix.md rename to projects/community-forum/forum-posts/kde-plasma-brightness-nvidia-intel-fix.md diff --git a/docs/forum-posts/screenconnect-linux-wayland-fix.md b/projects/community-forum/forum-posts/screenconnect-linux-wayland-fix.md similarity index 100% rename from docs/forum-posts/screenconnect-linux-wayland-fix.md rename to projects/community-forum/forum-posts/screenconnect-linux-wayland-fix.md diff --git a/docs/forum-posts/tailscale-missing-vlan-subnet-route.md b/projects/community-forum/forum-posts/tailscale-missing-vlan-subnet-route.md similarity index 100% rename from docs/forum-posts/tailscale-missing-vlan-subnet-route.md rename to projects/community-forum/forum-posts/tailscale-missing-vlan-subnet-route.md diff --git a/projects/community-forum/theme-v2.less b/projects/community-forum/theme-v2.less index 6f5d574..ecd4169 100644 --- a/projects/community-forum/theme-v2.less +++ b/projects/community-forum/theme-v2.less @@ -500,6 +500,36 @@ body, .App { line-height: 1.6 !important; } +/* Force all code block text to be readable - override syntax highlighting */ +.Post-body pre code *, +.Post-body pre code span, +.Post-body pre code .hljs-keyword, +.Post-body pre code .hljs-string, +.Post-body pre code .hljs-built_in, +.Post-body pre code .hljs-comment, +.Post-body pre code .hljs-variable, +.Post-body pre code .hljs-title, +.Post-body pre code .hljs-attr, +.Post-body pre code .hljs-selector-tag, +.Post-body pre code .hljs-name, +.Post-body pre code .hljs-type, +.Post-body pre code .hljs-number, +.Post-body pre code .hljs-literal, +.Post-body pre code .hljs-symbol, +.Post-body pre code .hljs-bullet { + color: #c9d1d9 !important; +} + +/* Add some color variation for readability */ +.Post-body pre code .hljs-keyword { color: #ff7b72 !important; } +.Post-body pre code .hljs-string { color: #a5d6ff !important; } +.Post-body pre code .hljs-comment { color: #8b949e !important; font-style: italic; } +.Post-body pre code .hljs-number, +.Post-body pre code .hljs-literal { color: #79c0ff !important; } +.Post-body pre code .hljs-variable, +.Post-body pre code .hljs-title { color: #d2a8ff !important; } +.Post-body pre code .hljs-built_in { color: #ffa657 !important; } + /* Blockquotes */ .Post-body blockquote { border-left: 3px solid var(--g-orange) !important; diff --git a/scripts/check_record_counts.py b/projects/gururmm-agent/scripts/check_record_counts.py similarity index 100% rename from scripts/check_record_counts.py rename to projects/gururmm-agent/scripts/check_record_counts.py diff --git a/scripts/create_jwt_token.py b/projects/gururmm-agent/scripts/create_jwt_token.py similarity index 100% rename from scripts/create_jwt_token.py rename to projects/gururmm-agent/scripts/create_jwt_token.py diff --git a/test_gururmm_api.py b/projects/gururmm-agent/scripts/test_gururmm_api.py similarity index 100% rename from test_gururmm_api.py rename to projects/gururmm-agent/scripts/test_gururmm_api.py diff --git a/azcomputerguru-changelog.md b/projects/internal/acg-website-2025/azcomputerguru-changelog.md similarity index 100% rename from azcomputerguru-changelog.md rename to projects/internal/acg-website-2025/azcomputerguru-changelog.md diff --git a/azcomputerguru-design-vision.md b/projects/internal/acg-website-2025/azcomputerguru-design-vision.md similarity index 100% rename from azcomputerguru-design-vision.md rename to projects/internal/acg-website-2025/azcomputerguru-design-vision.md diff --git a/azcomputerguru-refined.css b/projects/internal/acg-website-2025/azcomputerguru-refined.css similarity index 100% rename from azcomputerguru-refined.css rename to projects/internal/acg-website-2025/azcomputerguru-refined.css diff --git a/scripts/check_rmm_status.cmd b/projects/msp-tools/scripts/check_rmm_status.cmd similarity index 100% rename from scripts/check_rmm_status.cmd rename to projects/msp-tools/scripts/check_rmm_status.cmd diff --git a/scripts/cipp-add-claude-app-template.ps1 b/projects/msp-tools/scripts/cipp-add-claude-app-template.ps1 similarity index 100% rename from scripts/cipp-add-claude-app-template.ps1 rename to projects/msp-tools/scripts/cipp-add-claude-app-template.ps1 diff --git a/scripts/claude-msp-combined-manifest.json b/projects/msp-tools/scripts/claude-msp-combined-manifest.json similarity index 100% rename from scripts/claude-msp-combined-manifest.json rename to projects/msp-tools/scripts/claude-msp-combined-manifest.json diff --git a/scripts/claude-msp-onboard-tenant.ps1 b/projects/msp-tools/scripts/claude-msp-onboard-tenant.ps1 similarity index 100% rename from scripts/claude-msp-onboard-tenant.ps1 rename to projects/msp-tools/scripts/claude-msp-onboard-tenant.ps1 diff --git a/scripts/claude-msp-update-permissions.ps1 b/projects/msp-tools/scripts/claude-msp-update-permissions.ps1 similarity index 100% rename from scripts/claude-msp-update-permissions.ps1 rename to projects/msp-tools/scripts/claude-msp-update-permissions.ps1 diff --git a/scripts/datto-smartbadge-check.ps1 b/projects/msp-tools/scripts/datto-smartbadge-check.ps1 similarity index 100% rename from scripts/datto-smartbadge-check.ps1 rename to projects/msp-tools/scripts/datto-smartbadge-check.ps1 diff --git a/scripts/datto-smartbadge-fix.reg b/projects/msp-tools/scripts/datto-smartbadge-fix.reg similarity index 100% rename from scripts/datto-smartbadge-fix.reg rename to projects/msp-tools/scripts/datto-smartbadge-fix.reg diff --git a/scripts/perms.json b/projects/msp-tools/scripts/perms.json similarity index 100% rename from scripts/perms.json rename to projects/msp-tools/scripts/perms.json diff --git a/scripts/sam.json b/projects/msp-tools/scripts/sam.json similarity index 100% rename from scripts/sam.json rename to projects/msp-tools/scripts/sam.json diff --git a/projects/radio-show/website/package-lock.json b/projects/radio-show/website/package-lock.json index 9dddcd0..f4ed5bc 100644 --- a/projects/radio-show/website/package-lock.json +++ b/projects/radio-show/website/package-lock.json @@ -300,7 +300,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2179,7 +2178,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2189,7 +2187,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -2330,7 +2327,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2352,7 +2348,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2472,7 +2467,6 @@ "resolved": "https://registry.npmjs.org/astro/-/astro-6.0.4.tgz", "integrity": "sha512-1piLJCPTL/x7AMO2cjVFSTFyRqKuC3W8sSEySCt1aJio+p/wGs5H3K+Xr/rE9ftKtknLUtjxCqCE7/0NsXfGpQ==", "license": "MIT", - "peer": true, "dependencies": { "@astrojs/compiler": "^3.0.0", "@astrojs/internal-helpers": "0.8.0", @@ -2614,7 +2608,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5366,7 +5359,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -5407,7 +5399,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5417,7 +5408,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -5799,7 +5789,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -6204,7 +6193,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6606,7 +6594,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -7012,7 +6999,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/projects/radio-show/website/src/components/home/AboutPreview.astro b/projects/radio-show/website/src/components/home/AboutPreview.astro index 0219d77..971a746 100644 --- a/projects/radio-show/website/src/components/home/AboutPreview.astro +++ b/projects/radio-show/website/src/components/home/AboutPreview.astro @@ -8,9 +8,10 @@ About the Show

Meet Your Host

- Mike Swanson has been breaking down technology for everyday people since 2014. - As a Tucson-based tech professional and broadcaster, he brings decades of - hands-on experience to every episode. + Mike Swanson has been Tucson's go-to resource for technology solutions that + make sense for over 20 years. Since founding Arizona Computer Guru in 2001 + and launching The Computer Guru Show in 2009, his mission has stayed the same: + solve your tech problems while treating you like a person in the process.

"Technology should empower you, not intimidate you. That is what this show is all about." diff --git a/projects/radio-show/website/src/components/home/HeroSection.astro b/projects/radio-show/website/src/components/home/HeroSection.astro index 9762816..647277e 100644 --- a/projects/radio-show/website/src/components/home/HeroSection.astro +++ b/projects/radio-show/website/src/components/home/HeroSection.astro @@ -16,9 +16,9 @@

Helping you deal with all of your technology needs while treating you like a person in the process.

- Your source for making sense of the tech world without the jargon. - Hosted by Mike Swanson from Tucson, Arizona -- cutting through the noise - so you can enjoy technology the way it was meant to be. + Straight answers without the jargon or the drama. Hosted by Mike Swanson + from Tucson, Arizona -- over 20 years of solving tech problems for home users + and businesses alike. Tune in Saturdays at 9am on KVOI or call in at 520-790-2040.

diff --git a/projects/radio-show/website/src/pages/about.astro b/projects/radio-show/website/src/pages/about.astro index 5d494c1..1a26875 100644 --- a/projects/radio-show/website/src/pages/about.astro +++ b/projects/radio-show/website/src/pages/about.astro @@ -25,10 +25,14 @@ import BaseLayout from '../layouts/BaseLayout.astro';

Mike Swanson

The Computer Guru

- Technology professional based in Tucson, Arizona. Owner of Arizona Computer Guru, - providing IT services to businesses and individuals throughout Southern Arizona. - Host of The Computer Guru Show since 2014, bringing technology news, analysis, - and how-tos to listeners in a way that is fun, accessible, and practical. + Mike Swanson has been the Tucson community's go-to resource for technology + solutions that make sense for over 20 years. Since founding Arizona Computer Guru + in 2001 and launching The Computer Guru Show in 2009, his mission has stayed the + same: solve your technology problems while treating you like a person in the process. + Whether you're a home user battling a stubborn computer or a business owner looking + for IT support that actually speaks your language, The Computer Guru Show delivers + straight answers without the jargon or the drama. No politics, no fluff -- just + real solutions from someone who's been in the trenches.

@@ -51,17 +55,17 @@ import BaseLayout from '../layouts/BaseLayout.astro';
- 2014 + 2009

Show Launches

-

The Computer Guru Show debuts, bringing technology discussion to the airwaves with a mission to make tech fun and simple for everyone.

+

The Computer Guru Show debuts on Tucson radio, bringing technology discussion to the airwaves with a mission to make tech accessible and fun for everyone.

- 2014 - 2018 + 2009 - 2018

10 Seasons, 194 Episodes

-

Over four years the show covers the biggest stories in technology -- net neutrality battles, the rise of streaming, smartphone evolution, hacking scandals, self-driving cars, and the early days of AI. Every episode is part of the archive.

+

Over nearly a decade the show covers the biggest stories in technology -- net neutrality battles, the rise of streaming, smartphone evolution, hacking scandals, self-driving cars, and the early days of AI. Every episode is part of the archive.

diff --git a/CTONW_ANALYSIS.md b/projects/wrightstown-smarthome/docs/CTONW_ANALYSIS.md similarity index 100% rename from CTONW_ANALYSIS.md rename to projects/wrightstown-smarthome/docs/CTONW_ANALYSIS.md diff --git a/CTONW_V1.2_CHANGELOG.md b/projects/wrightstown-smarthome/docs/CTONW_V1.2_CHANGELOG.md similarity index 100% rename from CTONW_V1.2_CHANGELOG.md rename to projects/wrightstown-smarthome/docs/CTONW_V1.2_CHANGELOG.md diff --git a/NWTOC_ANALYSIS.md b/projects/wrightstown-smarthome/docs/NWTOC_ANALYSIS.md similarity index 100% rename from NWTOC_ANALYSIS.md rename to projects/wrightstown-smarthome/docs/NWTOC_ANALYSIS.md diff --git a/NWTOC_COMPLETE_SUMMARY.md b/projects/wrightstown-smarthome/docs/NWTOC_COMPLETE_SUMMARY.md similarity index 100% rename from NWTOC_COMPLETE_SUMMARY.md rename to projects/wrightstown-smarthome/docs/NWTOC_COMPLETE_SUMMARY.md diff --git a/NWTOC_INDEX.md b/projects/wrightstown-smarthome/docs/NWTOC_INDEX.md similarity index 100% rename from NWTOC_INDEX.md rename to projects/wrightstown-smarthome/docs/NWTOC_INDEX.md diff --git a/extract_batch.py b/scripts/extract_batch.py similarity index 100% rename from extract_batch.py rename to scripts/extract_batch.py diff --git a/tmp_backup_ad2.ps1 b/tmp_backup_ad2.ps1 deleted file mode 100644 index 6f42eb7..0000000 --- a/tmp_backup_ad2.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - Write-Output "=== DRIVE MAPPED ===" - - # Step 3: Back up the current script - $src = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $bak = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1.bak.2026-02-17" - Copy-Item -Path $src -Destination $bak -Force - Write-Output "=== BACKUP CREATED: $bak ===" - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_bulksync.ps1 b/tmp_bulksync.ps1 deleted file mode 100644 index 7f55145..0000000 --- a/tmp_bulksync.ps1 +++ /dev/null @@ -1,56 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" -New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - -# Write a one-time bulk sync runner script -$bulkScript = @" -# One-time bulk sync with 86400 minute window (60 days) -# This catches all stranded files from the last ~35 days -# Auto-deletes itself after running -Set-Location "C:\Shares\test\scripts" -& powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Shares\test\scripts\Sync-FromNAS.ps1" -MaxAgeMinutes 86400 -Verbose -# Log completion -Add-Content -Path "C:\Shares\test\scripts\sync-from-nas.log" -Value "$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) : BULK SYNC COMPLETE - one-time catchup finished" -# Clean up this trigger script -Remove-Item -Path "C:\Shares\test\scripts\BulkSync-OneTime.ps1" -Force -ErrorAction SilentlyContinue -"@ - -Set-Content -Path "AD2:\Shares\test\scripts\BulkSync-OneTime.ps1" -Value $bulkScript -Write-Output "[OK] Bulk sync script written to AD2:\Shares\test\scripts\BulkSync-OneTime.ps1" - -# Now create a scheduled task on AD2 to run it immediately -# We can do this by writing a schtasks command file -$taskScript = @" -schtasks /create /tn "BulkSync-OneTime" /tr "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\BulkSync-OneTime.ps1" /sc once /st 00:00 /ru INTRANET\sysadmin /rp "Paper123\!@#" /f -schtasks /run /tn "BulkSync-OneTime" -"@ - -Set-Content -Path "AD2:\Shares\test\scripts\run-bulk.cmd" -Value $taskScript -Write-Output "[OK] Task creation script written" -Write-Output "" -Write-Output "NOTE: The scheduled task needs to be triggered on AD2." -Write-Output "Attempting to use WMI to create process on AD2..." - -# Try WMI process creation (may work even if WinRM doesnt) -try { - $proc = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\BulkSync-OneTime.ps1" - if ($proc.ReturnValue -eq 0) { - Write-Output "[OK] WMI process started on AD2\! PID: $($proc.ProcessId)" - } else { - Write-Output "[ERROR] WMI process creation failed with return value: $($proc.ReturnValue)" - } -} catch { - Write-Output "[ERROR] WMI failed: $_" - Write-Output "Trying schtasks approach..." - try { - $schResult = schtasks /create /s 192.168.0.6 /u INTRANET\sysadmin /p "Paper123\!@#" /tn "BulkSync-OneTime" /tr "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\BulkSync-OneTime.ps1" /sc once /st 00:00 /ru INTRANET\sysadmin /rp "Paper123\!@#" /f 2>&1 - Write-Output "schtasks create: $schResult" - $runResult = schtasks /run /s 192.168.0.6 /u INTRANET\sysadmin /p "Paper123\!@#" /tn "BulkSync-OneTime" 2>&1 - Write-Output "schtasks run: $runResult" - } catch { - Write-Output "[ERROR] schtasks also failed: $_" - } -} - -Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue diff --git a/tmp_bulksync2.ps1 b/tmp_bulksync2.ps1 deleted file mode 100644 index c4535ac..0000000 --- a/tmp_bulksync2.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncPath = "\\192.168.0.6\C$\Shares\test\scripts" - -# Map net use -net use "\\192.168.0.6\C$" /user:INTRANET\sysadmin ("Paper123" + [char]33 + "@#") 2>&1 | Out-Null - -# Write the bulk sync script using direct UNC path -$bulkContent = @" -Set-Location "C:\Shares\test\scripts" -& powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Shares\test\scripts\Sync-FromNAS.ps1" -MaxAgeMinutes 86400 -Verbose -"@ - -[System.IO.File]::WriteAllText("\\192.168.0.6\C$\Shares\test\scripts\BulkSync-OneTime.ps1", $bulkContent) -Write-Output "[OK] BulkSync script written via System.IO" - -# Verify it exists -$exists = Test-Path "\\192.168.0.6\C$\Shares\test\scripts\BulkSync-OneTime.ps1" -Write-Output "File exists: $exists" - -# Now trigger it via WMI -$proc = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\BulkSync-OneTime.ps1" -if ($proc.ReturnValue -eq 0) { - Write-Output "[OK] Bulk sync started on AD2\! PID: $($proc.ProcessId)" -} else { - Write-Output "[ERROR] Failed to start: return value $($proc.ReturnValue)" -} - -net use "\\192.168.0.6\C$" /delete 2>&1 | Out-Null diff --git a/tmp_check2.ps1 b/tmp_check2.ps1 deleted file mode 100644 index ace3160..0000000 --- a/tmp_check2.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -# Check if still running -$procs = Get-WmiObject -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Filter "Name='powershell.exe'" 2>$null -$syncRunning = $false -foreach ($p in $procs) { - if ($p.CommandLine -match "BulkSync|86400") { - Write-Output "Still running: PID=$($p.ProcessId)" - $syncRunning = $true - } -} -if (-not $syncRunning) { Write-Output "Bulk sync has completed\!" } diff --git a/tmp_check3.ps1 b/tmp_check3.ps1 deleted file mode 100644 index f9ddc37..0000000 --- a/tmp_check3.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -# Read the last 40 lines of the sync log -$logContent = [System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\sync-from-nas.log") -$lines = $logContent -split "`n" -$lastLines = $lines | Select-Object -Last 40 -Write-Output "=== LAST 40 LOG LINES ===" -$lastLines | ForEach-Object { Write-Output $_ } - -# Check process status -$procs = Get-WmiObject -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Filter "Name='powershell.exe'" 2>$null -$syncRunning = $false -foreach ($p in $procs) { - if ($p.CommandLine -match "BulkSync|86400") { $syncRunning = $true } -} -Write-Output "" -if ($syncRunning) { Write-Output "STATUS: Still running..." } else { Write-Output "STATUS: COMPLETED" } diff --git a/tmp_check4.ps1 b/tmp_check4.ps1 deleted file mode 100644 index fb13a84..0000000 --- a/tmp_check4.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -# Read the last 50 lines of the sync log -$logContent = [System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\sync-from-nas.log") -$lines = $logContent -split "`n" -$lastLines = $lines | Select-Object -Last 50 -Write-Output "=== LAST 50 LOG LINES ===" -$lastLines | ForEach-Object { Write-Output $_ } - -# Check process status -$procs = Get-WmiObject -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Filter "Name='powershell.exe'" 2>$null -$syncRunning = $false -foreach ($p in $procs) { - if ($p.CommandLine -match "BulkSync|86400") { $syncRunning = $true } -} -Write-Output "" -if ($syncRunning) { Write-Output "[...] STATUS: Still running..." } else { Write-Output "[OK] STATUS: COMPLETED" } diff --git a/tmp_check_proc.ps1 b/tmp_check_proc.ps1 deleted file mode 100644 index 1449063..0000000 --- a/tmp_check_proc.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -# Check if the process is still running -$proc = Get-WmiObject -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Filter "ProcessId=15856" 2>$null -if ($proc) { - Write-Output "Process 15856 still running: $($proc.CommandLine)" -} else { - Write-Output "Process 15856 has completed" -} - -# Check for any powershell processes running our script -$procs = Get-WmiObject -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Filter "Name='powershell.exe'" 2>$null -foreach ($p in $procs) { - if ($p.CommandLine -match "Sync-FromNAS|BulkSync") { - Write-Output "Found sync process: PID=$($p.ProcessId) CMD=$($p.CommandLine)" - } -} diff --git a/tmp_connect_ad2.ps1 b/tmp_connect_ad2.ps1 deleted file mode 100644 index 939e7fb..0000000 --- a/tmp_connect_ad2.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop - Write-Output "=== DRIVE MAPPED ===" - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - if (Test-Path $scriptPath) { - Write-Output "=== SCRIPT CONTENT START ===" - Get-Content $scriptPath -Raw - Write-Output "=== SCRIPT CONTENT END ===" - } else { - Write-Output "Script not found" - } - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_fix2.ps1 b/tmp_fix2.ps1 deleted file mode 100644 index 83e2299..0000000 --- a/tmp_fix2.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $lines = Get-Content $scriptPath - - # Fix line 70 (0-indexed: 69) - the Copy-FromNAS SCP line - $oldLine = $lines[69] - Write-Output "OLD LINE 70: $oldLine" - - # The correct line should have backtick-quoted remote path and quoted local path - $lines[69] = ' $result = & $SCP -O -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" "${NAS_USER}@${NAS_IP}:`"${RemotePath}`"" "$LocalPath" 2>&1' - - Write-Output "NEW LINE 70: $($lines[69])" - - # Write back - Set-Content -Path $scriptPath -Value $lines - Write-Output "=== LINE 70 FIXED ===" - - # Verify both SCP lines are now correct - $verify = Get-Content $scriptPath - Write-Output "=== FINAL SCP LINES ===" - for ($i = 0; $i -lt $verify.Count; $i++) { - if ($verify[$i] -match "result.*SCP") { - Write-Output ("{0,3}: {1}" -f ($i+1), $verify[$i].TrimEnd()) - } - } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" - Write-Output $_.ScriptStackTrace -} diff --git a/tmp_fix_script.ps1 b/tmp_fix_script.ps1 deleted file mode 100644 index f45866d..0000000 --- a/tmp_fix_script.ps1 +++ /dev/null @@ -1,58 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - Write-Output "=== DRIVE MAPPED ===" - - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $content = Get-Content $scriptPath -Raw - - # Fix 1: Invoke-NASCommand - add user@host target - $old1 = '$result = & $SSH -i "C:\Users\sysadmin\.ssh\id_ed25519" -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new $Command 2>&1' - $new1 = '$result = & $SSH -i "C:\Users\sysadmin\.ssh\id_ed25519" -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new "${NAS_USER}@${NAS_IP}" $Command 2>&1' - $content = $content.Replace($old1, $new1) - - # Fix 2: Copy-FromNAS - fix the SCP line (it has the if statement on same line + unquoted paths) - $old2 = '$result = & $SCP -O -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" "${NAS_USER}@${NAS_IP}:$RemotePath" $LocalPath 2>&1 if ($LASTEXITCODE -ne 0) {' - $new2 = @" -`$result = & `$SCP -O -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" "`${NAS_USER}@`${NAS_IP}:`"`${RemotePath}`"" "`$LocalPath" 2>&1 - if (`$LASTEXITCODE -ne 0) { -"@ - $content = $content.Replace($old2, $new2) - - # Fix 3: Fix the error message in Copy-FromNAS (PUSH -> PULL) - $old3 = 'Write-Log " SCP PUSH ERROR (exit $LASTEXITCODE): $errorMsg"' - # Only fix the FIRST occurrence (in Copy-FromNAS). Use a targeted approach. - # Since we already fixed the structure, just do a simple replace of the first occurrence - $idx = $content.IndexOf($old3) - if ($idx -ge 0) { - $new3 = 'Write-Log " SCP PULL ERROR (exit $LASTEXITCODE): $errorMsg"' - $content = $content.Substring(0, $idx) + $new3 + $content.Substring($idx + $old3.Length) - } - - # Fix 4: Copy-ToNAS - quote both paths - $old4 = '$result = & $SCP -O -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" $LocalPath "${NAS_USER}@${NAS_IP}:$RemotePath" 2>&1' - $new4 = '$result = & $SCP -O -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" "$LocalPath" "${NAS_USER}@${NAS_IP}:`"${RemotePath}`"" 2>&1' - $content = $content.Replace($old4, $new4) - - # Write the fixed script - Set-Content -Path $scriptPath -Value $content -NoNewline - Write-Output "=== SCRIPT UPDATED ===" - - # Verify the fixes - $verify = Get-Content $scriptPath -Raw - Write-Output "=== VERIFY: SCP LINES ===" - $verify -split "`n" | Where-Object { $_ -match "result = .* SCP" } | ForEach-Object { Write-Output (" " + $_.Trim()) } - Write-Output "=== VERIFY: SSH LINE ===" - $verify -split "`n" | Where-Object { $_ -match "result = .* SSH" } | ForEach-Object { Write-Output (" " + $_.Trim()) } - Write-Output "=== VERIFY: ERROR MESSAGES ===" - $verify -split "`n" | Where-Object { $_ -match "SCP (PULL|PUSH) ERROR" } | ForEach-Object { Write-Output (" " + $_.Trim()) } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" - Write-Output $_.ScriptStackTrace -} diff --git a/tmp_grep.ps1 b/tmp_grep.ps1 deleted file mode 100644 index fa1dc4a..0000000 --- a/tmp_grep.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$cmd = "cmd /c powershell -NoProfile -Command \"Get-Content C:\Shares\test\scripts\sync-from-nas.log | Select-String -Pattern 'Starting sync|Max age: 86400|Sync complete|No new DAT|Found.*DAT|PULL=|ambiguous' | Select-Object -Last 30 | ForEach-Object { $_.Line } > C:\Shares\test\scripts\tail-grep.txt 2>&1\"" -$r = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList $cmd -Write-Output "PID: $($r.ProcessId)" -Start-Sleep -Seconds 15 -Write-Output ([System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\tail-grep.txt")) diff --git a/tmp_grep2.ps1 b/tmp_grep2.ps1 deleted file mode 100644 index a3281e2..0000000 --- a/tmp_grep2.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -$filterScript = 'Get-Content C:\Shares\test\scripts\sync-from-nas.log | Select-String -Pattern "Starting sync|Max age: 86400|Sync complete|No new DAT|Found.*DAT|PULL=|ambiguous|Copied to station|Copied report" | Select-Object -Last 40 | ForEach-Object { $_.Line } | Out-File C:\Shares\test\scripts\tail-grep.txt -Encoding utf8' - -[System.IO.File]::WriteAllText("\\192.168.0.6\C$\Shares\test\scripts\filter-log.ps1", $filterScript) -$r = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\filter-log.ps1" -Write-Output "PID: $($r.ProcessId)" -Start-Sleep -Seconds 20 -try { - Write-Output ([System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\tail-grep.txt")) -} catch { - Write-Output "File not ready: $_" -} diff --git a/tmp_inspect.ps1 b/tmp_inspect.ps1 deleted file mode 100644 index b88f06d..0000000 --- a/tmp_inspect.ps1 +++ /dev/null @@ -1,24 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - Write-Output "=== DRIVE MAPPED ===" - - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $content = Get-Content $scriptPath -Raw - - # Show the original problematic lines - Write-Output "=== ORIGINAL Copy-FromNAS SCP LINE ===" - $content -split "`n" | Where-Object { $_ -match "SCP.*RemotePath.*LocalPath|SCP.*LocalPath.*RemotePath" } | ForEach-Object { Write-Output $_.Trim() } - - Write-Output "=== ORIGINAL Invoke-NASCommand LINE ===" - $content -split "`n" | Where-Object { $_ -match "result = .* \" } | ForEach-Object { Write-Output $_.Trim() } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_lines.ps1 b/tmp_lines.ps1 deleted file mode 100644 index 2e14861..0000000 --- a/tmp_lines.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $lines = Get-Content $scriptPath - - # Show lines 70-95 (around Copy-FromNAS SCP area) - Write-Output "=== Lines 60-95 ===" - for ($i = 59; $i -lt 95 -and $i -lt $lines.Count; $i++) { - Write-Output ("{0,3}: {1}" -f ($i+1), $lines[$i]) - } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_readlog.ps1 b/tmp_readlog.ps1 deleted file mode 100644 index 1066e96..0000000 --- a/tmp_readlog.ps1 +++ /dev/null @@ -1,9 +0,0 @@ -# Read sync log - last 60 lines -try { - $log = [System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\sync-from-nas.log") - $logLines = $log -split "`n" - Write-Output "=== SYNC LOG (last 60 lines) ===" - $logLines | Select-Object -Last 60 | ForEach-Object { Write-Output $_ } -} catch { - Write-Output "ERROR reading log: $_" -} diff --git a/tmp_readlog2.ps1 b/tmp_readlog2.ps1 deleted file mode 100644 index e69de29..0000000 diff --git a/tmp_readtail.ps1 b/tmp_readtail.ps1 deleted file mode 100644 index 15a6a01..0000000 --- a/tmp_readtail.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -# Write a small script on AD2 to create the tail file -$tailScript = "Get-Content C:\Shares\test\scripts\sync-from-nas.log -Tail 80 | Out-File C:\Shares\test\scripts\sync-tail.txt -Encoding utf8; Get-Content C:\Shares\test\_SYNC_STATUS.txt | Out-File C:\Shares\test\scripts\sync-tail.txt -Append -Encoding utf8" -[System.IO.File]::WriteAllText("\\192.168.0.6\C$\Shares\test\scripts\read-tail.ps1", $tailScript) - -# Run it via WMI -$cmd = "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\read-tail.ps1" -$result = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList $cmd -Write-Output "WMI result: $($result.ReturnValue) PID: $($result.ProcessId)" - -# Wait for it to finish -Start-Sleep -Seconds 5 - -# Read the tail file -$tailContent = [System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\sync-tail.txt") -Write-Output $tailContent diff --git a/tmp_summary.ps1 b/tmp_summary.ps1 deleted file mode 100644 index 0ce1312..0000000 --- a/tmp_summary.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) - -$script = '$log = Get-Content C:\Shares\test\scripts\sync-from-nas.log; $bulk = $log | Where-Object { $_ -match "2026-02-17 16:(4|5)" }; $out = @(); $out += "=== FIRST 30 LINES ==="; $out += ($bulk | Select-Object -First 30); $out += ""; $out += "=== LAST 20 LINES ==="; $out += ($bulk | Select-Object -Last 20); $out += ""; $out += "=== SUMMARY ==="; $out += "Total lines: $($bulk.Count)"; $out += "Pushed: $(($bulk | Where-Object { $_ -match "Pushed:" }).Count)"; $out += "Errors: $(($bulk | Where-Object { $_ -match "ERROR" }).Count)"; $out += "Ambiguous: $(($bulk | Where-Object { $_ -match "ambiguous" }).Count)"; $out += "No such file: $(($bulk | Where-Object { $_ -match "No such file" }).Count)"; $out += "Copied station: $(($bulk | Where-Object { $_ -match "Copied to station" }).Count)"; $out += "Copied report: $(($bulk | Where-Object { $_ -match "Copied report" }).Count)"; $out | Out-File C:\Shares\test\scripts\sync-summary.txt -Encoding utf8' - -[System.IO.File]::WriteAllText("\\192.168.0.6\C$\Shares\test\scripts\make-summary.ps1", $script) -$r = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Shares\test\scripts\make-summary.ps1" -Write-Output "PID: $($r.ProcessId)" -Start-Sleep -Seconds 10 -Write-Output ([System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\sync-summary.txt")) diff --git a/tmp_syntax.ps1 b/tmp_syntax.ps1 deleted file mode 100644 index 754906f..0000000 --- a/tmp_syntax.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $content = Get-Content $scriptPath -Raw - - # Syntax check via parsing the content string - $parseErrors = $null - [System.Management.Automation.Language.Parser]::ParseInput($content, [ref]$null, [ref]$parseErrors) - if ($parseErrors.Count -eq 0) { - Write-Output "[OK] Script parses OK - no syntax errors" - } else { - foreach ($err in $parseErrors) { - Write-Output "[ERROR] PARSE ERROR: $($err.Message) at line $($err.Extent.StartLineNumber)" - } - } - - # Count total lines - $lineCount = ($content -split "`n").Count - Write-Output "Total lines: $lineCount" - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_syntax2.ps1 b/tmp_syntax2.ps1 deleted file mode 100644 index b8abf95..0000000 --- a/tmp_syntax2.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" -New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null -$content = Get-Content "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" -Raw -$tokens = $null; $parseErrors = $null -[void][System.Management.Automation.Language.Parser]::ParseInput($content, [ref]$tokens, [ref]$parseErrors) -Write-Output "Parse errors: $($parseErrors.Count)" -if ($parseErrors.Count -gt 0) { $parseErrors | ForEach-Object { Write-Output " $_" } } -else { Write-Output "[OK] No syntax errors detected" } -Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue diff --git a/tmp_tail.ps1 b/tmp_tail.ps1 deleted file mode 100644 index 99141bb..0000000 --- a/tmp_tail.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$r = Invoke-WmiMethod -ComputerName 192.168.0.6 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "cmd /c powershell -NoProfile -Command Get-Content C:\Shares\test\scripts\sync-from-nas.log -Tail 40 > C:\Shares\test\scripts\tail40.txt 2>&1" -Write-Output "PID: $($r.ProcessId) Return: $($r.ReturnValue)" -Start-Sleep -Seconds 8 -Write-Output ([System.IO.File]::ReadAllText("\\192.168.0.6\C$\Shares\test\scripts\tail40.txt")) diff --git a/tmp_test.ps1 b/tmp_test.ps1 deleted file mode 100644 index b6be0aa..0000000 --- a/tmp_test.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" -New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - -# First, do a dry run to see what files are stranded on the NAS -Write-Output "=== DRY RUN: Bulk sync with 86400 minute window (60 days) ===" -$dryRunOutput = & powershell -NoProfile -ExecutionPolicy Bypass -Command { - # We cannot run the script directly on AD2 from here, so we will invoke it remotely -} - -# Actually we need to run this ON AD2. Lets check if we can invoke it via the mapped drive. -# The script needs to run locally on AD2 (it calls SCP/SSH). We need WinRM or SSH for that. -# Since WinRM is blocked from this machine, lets try another approach. - -# Check: can we SSH to AD2 with the key from this machine? -Write-Output "=== Testing SSH to NAS directly from this machine ===" -Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue diff --git a/tmp_verify.ps1 b/tmp_verify.ps1 deleted file mode 100644 index 09ace83..0000000 --- a/tmp_verify.ps1 +++ /dev/null @@ -1,33 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $content = Get-Content $scriptPath -Raw - - # Show the Copy-FromNAS function - $lines = $content -split "`n" - $inFunc = $false - $funcName = "" - foreach ($line in $lines) { - if ($line -match "^function (Copy-FromNAS|Copy-ToNAS|Invoke-NASCommand)") { - $inFunc = $true - $funcName = $Matches[1] - Write-Output "=== $funcName ===" - } - if ($inFunc) { - Write-Output $line.TrimEnd() - if ($line.Trim() -eq "}" -and $funcName) { - $inFunc = $false - Write-Output "" - } - } - } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/tmp_verify2.ps1 b/tmp_verify2.ps1 deleted file mode 100644 index 12f612c..0000000 --- a/tmp_verify2.ps1 +++ /dev/null @@ -1,32 +0,0 @@ -$ErrorActionPreference = "Stop" -$pass = ConvertTo-SecureString ("Paper123" + [char]33 + "@#") -AsPlainText -Force -$cred = New-Object PSCredential("INTRANET\sysadmin", $pass) -$uncRoot = "\\192.168.0.6\C$" - -try { - New-PSDrive -Name AD2 -PSProvider FileSystem -Root $uncRoot -Credential $cred -ErrorAction Stop | Out-Null - $scriptPath = "AD2:\Shares\test\scripts\Sync-FromNAS.ps1" - $lines = Get-Content $scriptPath - - Write-Output "=== FULL VERIFICATION: Lines 48-100 ===" - for ($i = 47; $i -lt 100 -and $i -lt $lines.Count; $i++) { - Write-Output ("{0,3}: {1}" -f ($i+1), $lines[$i]) - } - - # Also check the script parses without errors - Write-Output "" - Write-Output "=== SYNTAX CHECK ===" - $parseErrors = $null - [System.Management.Automation.Language.Parser]::ParseFile("AD2:\Shares\test\scripts\Sync-FromNAS.ps1", [ref]$null, [ref]$parseErrors) - if ($parseErrors.Count -eq 0) { - Write-Output "Script parses OK - no syntax errors" - } else { - foreach ($err in $parseErrors) { - Write-Output "PARSE ERROR: $($err.Message) at line $($err.Extent.StartLineNumber)" - } - } - - Remove-PSDrive -Name AD2 -ErrorAction SilentlyContinue -} catch { - Write-Output "ERROR: $_" -} diff --git a/extract_license_plate.py b/tools/extract_license_plate.py similarity index 100% rename from extract_license_plate.py rename to tools/extract_license_plate.py diff --git a/review_best_plates.py b/tools/review_best_plates.py similarity index 100% rename from review_best_plates.py rename to tools/review_best_plates.py