blockmine 1.24.0 â 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.en.md +427 -0
- package/README.md +40 -0
- package/backend/cli.js +1 -1
- package/backend/src/ai/plugin-assistant-system-prompt.md +664 -5
- package/backend/src/api/routes/bots.js +13 -0
- package/backend/src/api/routes/servers.js +14 -2
- package/backend/src/core/BotProcess.js +98 -2
- package/backend/src/core/PluginLoader.js +83 -3
- package/backend/src/core/PluginManager.js +75 -5
- package/backend/src/core/services/BotLifecycleService.js +186 -2
- package/backend/src/server.js +11 -1
- package/frontend/dist/assets/browser-ponyfill-DN7pwmHT.js +2 -0
- package/frontend/dist/assets/index-LSy71uwm.js +11261 -0
- package/frontend/dist/assets/index-SfhKxI4-.css +32 -0
- package/frontend/dist/flags/en.svg +32 -0
- package/frontend/dist/flags/ru.svg +5 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/locales/en/admin.json +100 -0
- package/frontend/dist/locales/en/api-keys.json +58 -0
- package/frontend/dist/locales/en/bots.json +110 -0
- package/frontend/dist/locales/en/common.json +47 -0
- package/frontend/dist/locales/en/configuration.json +22 -0
- package/frontend/dist/locales/en/console.json +10 -0
- package/frontend/dist/locales/en/dashboard.json +85 -0
- package/frontend/dist/locales/en/dialogs.json +70 -0
- package/frontend/dist/locales/en/event-graphs.json +50 -0
- package/frontend/dist/locales/en/graph-store.json +70 -0
- package/frontend/dist/locales/en/login.json +34 -0
- package/frontend/dist/locales/en/management.json +114 -0
- package/frontend/dist/locales/en/minecraft-viewer.json +27 -0
- package/frontend/dist/locales/en/nodes.json +1077 -0
- package/frontend/dist/locales/en/permissions.json +50 -0
- package/frontend/dist/locales/en/plugin-detail.json +49 -0
- package/frontend/dist/locales/en/plugins.json +110 -0
- package/frontend/dist/locales/en/proxies.json +81 -0
- package/frontend/dist/locales/en/servers.json +39 -0
- package/frontend/dist/locales/en/setup.json +17 -0
- package/frontend/dist/locales/en/sidebar.json +27 -0
- package/frontend/dist/locales/en/tasks.json +62 -0
- package/frontend/dist/locales/en/visual-editor.json +219 -0
- package/frontend/dist/locales/en/websocket.json +86 -0
- package/frontend/dist/locales/ru/admin.json +100 -0
- package/frontend/dist/locales/ru/api-keys.json +58 -0
- package/frontend/dist/locales/ru/bots.json +110 -0
- package/frontend/dist/locales/ru/common.json +49 -0
- package/frontend/dist/locales/ru/configuration.json +22 -0
- package/frontend/dist/locales/ru/console.json +10 -0
- package/frontend/dist/locales/ru/dashboard.json +85 -0
- package/frontend/dist/locales/ru/dialogs.json +70 -0
- package/frontend/dist/locales/ru/event-graphs.json +50 -0
- package/frontend/dist/locales/ru/graph-store.json +70 -0
- package/frontend/dist/locales/ru/login.json +34 -0
- package/frontend/dist/locales/ru/management.json +114 -0
- package/frontend/dist/locales/ru/minecraft-viewer.json +27 -0
- package/frontend/dist/locales/ru/nodes.json +1077 -0
- package/frontend/dist/locales/ru/permissions.json +50 -0
- package/frontend/dist/locales/ru/plugin-detail.json +49 -0
- package/frontend/dist/locales/ru/plugins.json +110 -0
- package/frontend/dist/locales/ru/proxies.json +81 -0
- package/frontend/dist/locales/ru/servers.json +39 -0
- package/frontend/dist/locales/ru/setup.json +17 -0
- package/frontend/dist/locales/ru/sidebar.json +27 -0
- package/frontend/dist/locales/ru/tasks.json +62 -0
- package/frontend/dist/locales/ru/visual-editor.json +221 -0
- package/frontend/dist/locales/ru/websocket.json +86 -0
- package/frontend/dist/monacoeditorwork/css.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/html.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/json.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/ts.worker.bundle.js +3 -3
- package/frontend/package.json +4 -0
- package/package.json +1 -1
- package/screen/3dviewer.png +0 -0
- package/screen/console.png +0 -0
- package/screen/dashboard.png +0 -0
- package/screen/graph_collabe.png +0 -0
- package/screen/graph_live_debug.png +0 -0
- package/screen/language_selector.png +0 -0
- package/screen/management_command.png +0 -0
- package/screen/node_debug_trace.png +0 -0
- package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
- package/screen/websocket.png +0 -0
- package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
- package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
- package/.claude/agents/README.md +0 -469
- package/.claude/agents/auth-route-debugger.md +0 -118
- package/.claude/agents/auth-route-tester.md +0 -93
- package/.claude/agents/auto-error-resolver.md +0 -97
- package/.claude/agents/build-optimizer.md +0 -236
- package/.claude/agents/code-architect.md +0 -34
- package/.claude/agents/code-architecture-reviewer.md +0 -83
- package/.claude/agents/code-explorer.md +0 -51
- package/.claude/agents/code-refactor-master.md +0 -94
- package/.claude/agents/code-reviewer.md +0 -46
- package/.claude/agents/cost-optimizer.md +0 -134
- package/.claude/agents/deployment-orchestrator.md +0 -113
- package/.claude/agents/documentation-architect.md +0 -82
- package/.claude/agents/frontend-error-fixer.md +0 -77
- package/.claude/agents/iac-code-generator.md +0 -71
- package/.claude/agents/incident-responder.md +0 -346
- package/.claude/agents/infrastructure-architect.md +0 -31
- package/.claude/agents/kubernetes-specialist.md +0 -56
- package/.claude/agents/migration-planner.md +0 -181
- package/.claude/agents/network-architect.md +0 -196
- package/.claude/agents/plan-reviewer.md +0 -52
- package/.claude/agents/refactor-planner.md +0 -63
- package/.claude/agents/security-scanner.md +0 -102
- package/.claude/agents/web-research-specialist.md +0 -78
- package/.claude/commands/cost-analysis.md +0 -315
- package/.claude/commands/dev-docs-update.md +0 -55
- package/.claude/commands/dev-docs.md +0 -51
- package/.claude/commands/feature-dev.md +0 -125
- package/.claude/commands/incident-debug.md +0 -247
- package/.claude/commands/infra-plan.md +0 -81
- package/.claude/commands/migration-plan.md +0 -478
- package/.claude/commands/route-research-for-testing.md +0 -37
- package/.claude/commands/security-review.md +0 -66
- package/.claude/hooks/CONFIG.md +0 -448
- package/.claude/hooks/README.md +0 -163
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +0 -226
- package/.claude/hooks/WINDOWS_HOOKS_README.md +0 -151
- package/.claude/hooks/add-skill-activation-banners.ts +0 -132
- package/.claude/hooks/comprehensive-skill-test.ts +0 -1315
- package/.claude/hooks/error-handling-reminder.sh +0 -12
- package/.claude/hooks/error-handling-reminder.ts +0 -222
- package/.claude/hooks/k8s-manifest-validator.sh +0 -56
- package/.claude/hooks/package-lock.json +0 -556
- package/.claude/hooks/package.json +0 -16
- package/.claude/hooks/post-tool-use-tracker.ps1 +0 -174
- package/.claude/hooks/post-tool-use-tracker.sh +0 -183
- package/.claude/hooks/security-policy-check.sh +0 -247
- package/.claude/hooks/skill-activation-prompt.ps1 +0 -10
- package/.claude/hooks/skill-activation-prompt.sh +0 -10
- package/.claude/hooks/skill-activation-prompt.ts +0 -141
- package/.claude/hooks/stop-build-check-enhanced.sh +0 -130
- package/.claude/hooks/terraform-validator.sh +0 -53
- package/.claude/hooks/test-input.json +0 -7
- package/.claude/hooks/test-skill-activation.ts +0 -427
- package/.claude/hooks/trigger-build-resolver.sh +0 -79
- package/.claude/hooks/tsc-check.sh +0 -173
- package/.claude/hooks/tsconfig.json +0 -19
- package/.claude/settings.json +0 -59
- package/.claude/settings.local.json +0 -67
- package/.claude/skills/README.md +0 -507
- package/.claude/skills/api-engineering/SKILL.md +0 -63
- package/.claude/skills/api-engineering/resources/api-versioning.md +0 -88
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +0 -106
- package/.claude/skills/api-engineering/resources/rate-limiting.md +0 -118
- package/.claude/skills/api-engineering/resources/rest-api-design.md +0 -105
- package/.claude/skills/backend-dev-guidelines/SKILL.md +0 -306
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +0 -451
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +0 -307
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +0 -638
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +0 -275
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +0 -224
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +0 -213
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +0 -756
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +0 -336
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +0 -789
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +0 -235
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +0 -754
- package/.claude/skills/budget-and-cost-management/SKILL.md +0 -850
- package/.claude/skills/build-engineering/SKILL.md +0 -431
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +0 -72
- package/.claude/skills/build-engineering/resources/build-caching.md +0 -96
- package/.claude/skills/build-engineering/resources/build-pipelines.md +0 -105
- package/.claude/skills/build-engineering/resources/build-security.md +0 -95
- package/.claude/skills/build-engineering/resources/build-systems.md +0 -389
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +0 -201
- package/.claude/skills/build-engineering/resources/dependency-management.md +0 -73
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +0 -110
- package/.claude/skills/build-engineering/resources/performance-optimization.md +0 -113
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +0 -82
- package/.claude/skills/cloud-engineering/SKILL.md +0 -675
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +0 -742
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +0 -714
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +0 -987
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +0 -757
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +0 -1058
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +0 -1530
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +0 -990
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +0 -758
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +0 -820
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +0 -670
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +0 -1198
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +0 -795
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +0 -966
- package/.claude/skills/cybersecurity/SKILL.md +0 -409
- package/.claude/skills/cybersecurity/resources/security-architecture.md +0 -266
- package/.claude/skills/database-engineering/SKILL.md +0 -61
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +0 -72
- package/.claude/skills/database-engineering/resources/database-replication.md +0 -63
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +0 -70
- package/.claude/skills/database-engineering/resources/query-optimization.md +0 -68
- package/.claude/skills/devsecops/SKILL.md +0 -374
- package/.claude/skills/devsecops/resources/ci-cd-security.md +0 -204
- package/.claude/skills/devsecops/resources/compliance-automation.md +0 -530
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +0 -2322
- package/.claude/skills/devsecops/resources/container-security.md +0 -915
- package/.claude/skills/devsecops/resources/cspm-integration.md +0 -1440
- package/.claude/skills/devsecops/resources/policy-enforcement.md +0 -619
- package/.claude/skills/devsecops/resources/secrets-management.md +0 -755
- package/.claude/skills/devsecops/resources/security-monitoring.md +0 -146
- package/.claude/skills/devsecops/resources/security-scanning.md +0 -887
- package/.claude/skills/devsecops/resources/security-testing.md +0 -203
- package/.claude/skills/devsecops/resources/supply-chain-security.md +0 -518
- package/.claude/skills/devsecops/resources/vulnerability-management.md +0 -481
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +0 -177
- package/.claude/skills/documentation-as-code/SKILL.md +0 -323
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +0 -90
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +0 -79
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +0 -44
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +0 -99
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +0 -68
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +0 -79
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +0 -162
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +0 -77
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +0 -60
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +0 -202
- package/.claude/skills/engineering-management/SKILL.md +0 -356
- package/.claude/skills/engineering-management/resources/career-ladders.md +0 -609
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +0 -555
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +0 -609
- package/.claude/skills/engineering-management/resources/resource-planning.md +0 -557
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +0 -491
- package/.claude/skills/engineering-management/resources/technical-interviews.md +0 -474
- package/.claude/skills/engineering-operations-management/SKILL.md +0 -817
- package/.claude/skills/error-tracking/SKILL.md +0 -379
- package/.claude/skills/frontend-design/SKILL.md +0 -42
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +0 -403
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +0 -331
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +0 -872
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +0 -502
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +0 -767
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +0 -502
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +0 -501
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +0 -406
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +0 -364
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +0 -428
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +0 -418
- package/.claude/skills/general-it-engineering/SKILL.md +0 -393
- package/.claude/skills/general-it-engineering/resources/asset-management.md +0 -712
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +0 -817
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +0 -786
- package/.claude/skills/general-it-engineering/resources/change-management.md +0 -715
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +0 -729
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +0 -738
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +0 -834
- package/.claude/skills/general-it-engineering/resources/it-governance.md +0 -753
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +0 -503
- package/.claude/skills/general-it-engineering/resources/service-management.md +0 -669
- package/.claude/skills/infrastructure-architecture/SKILL.md +0 -328
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +0 -505
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +0 -528
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +0 -453
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +0 -773
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +0 -499
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +0 -501
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +0 -535
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +0 -512
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +0 -608
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +0 -562
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +0 -538
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +0 -489
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +0 -1000
- package/.claude/skills/infrastructure-strategy/SKILL.md +0 -924
- package/.claude/skills/network-engineering/SKILL.md +0 -385
- package/.claude/skills/network-engineering/resources/dns-management.md +0 -738
- package/.claude/skills/network-engineering/resources/load-balancing.md +0 -820
- package/.claude/skills/network-engineering/resources/network-architecture.md +0 -546
- package/.claude/skills/network-engineering/resources/network-security.md +0 -921
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +0 -749
- package/.claude/skills/network-engineering/resources/routing-switching.md +0 -373
- package/.claude/skills/network-engineering/resources/sdn-networking.md +0 -695
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +0 -777
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +0 -444
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +0 -672
- package/.claude/skills/node-development/SKILL.md +0 -317
- package/.claude/skills/observability-engineering/SKILL.md +0 -101
- package/.claude/skills/observability-engineering/resources/apm-tools.md +0 -97
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +0 -87
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +0 -98
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +0 -118
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +0 -141
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +0 -110
- package/.claude/skills/platform-engineering/SKILL.md +0 -555
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +0 -600
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +0 -916
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +0 -634
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +0 -670
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +0 -650
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +0 -778
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +0 -708
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +0 -602
- package/.claude/skills/platform-engineering/resources/platform-security.md +0 -711
- package/.claude/skills/platform-engineering/resources/resource-management.md +0 -592
- package/.claude/skills/platform-engineering/resources/service-mesh.md +0 -628
- package/.claude/skills/release-engineering/SKILL.md +0 -393
- package/.claude/skills/release-engineering/resources/artifact-management.md +0 -108
- package/.claude/skills/release-engineering/resources/build-optimization.md +0 -84
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +0 -411
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +0 -197
- package/.claude/skills/release-engineering/resources/pipeline-security.md +0 -62
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +0 -83
- package/.claude/skills/release-engineering/resources/release-automation.md +0 -68
- package/.claude/skills/release-engineering/resources/release-orchestration.md +0 -77
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +0 -66
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +0 -59
- package/.claude/skills/route-tester/SKILL.md +0 -392
- package/.claude/skills/skill-developer/ADVANCED.md +0 -197
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +0 -306
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +0 -152
- package/.claude/skills/skill-developer/SKILL.md +0 -430
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +0 -315
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +0 -305
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +0 -514
- package/.claude/skills/skill-rules.json +0 -2989
- package/.claude/skills/sre/SKILL.md +0 -464
- package/.claude/skills/sre/resources/alerting-best-practices.md +0 -282
- package/.claude/skills/sre/resources/capacity-planning.md +0 -226
- package/.claude/skills/sre/resources/chaos-engineering.md +0 -193
- package/.claude/skills/sre/resources/disaster-recovery.md +0 -232
- package/.claude/skills/sre/resources/incident-management.md +0 -436
- package/.claude/skills/sre/resources/observability-stack.md +0 -240
- package/.claude/skills/sre/resources/on-call-runbooks.md +0 -167
- package/.claude/skills/sre/resources/performance-optimization.md +0 -108
- package/.claude/skills/sre/resources/reliability-patterns.md +0 -183
- package/.claude/skills/sre/resources/slo-sli-sla.md +0 -464
- package/.claude/skills/sre/resources/toil-reduction.md +0 -145
- package/.claude/skills/systems-engineering/SKILL.md +0 -648
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +0 -771
- package/.claude/skills/systems-engineering/resources/configuration-management.md +0 -998
- package/.claude/skills/systems-engineering/resources/linux-administration.md +0 -672
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +0 -982
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +0 -871
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +0 -482
- package/.claude/skills/systems-engineering/resources/security-hardening.md +0 -739
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +0 -915
- package/.claude/skills/systems-engineering/resources/storage-management.md +0 -628
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +0 -787
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +0 -753
- package/.claude/skills/systems-engineering/resources/windows-administration.md +0 -738
- package/.claude/skills/technical-leadership/SKILL.md +0 -728
- package/backend/docs/SECRETS_DOCUMENTATION.md +0 -327
- package/frontend/dist/assets/index-BC-NbKXi.css +0 -32
- package/frontend/dist/assets/index-DqJXZMHY.js +0 -11266
|
@@ -1,771 +0,0 @@
|
|
|
1
|
-
# Automation Patterns
|
|
2
|
-
|
|
3
|
-
Comprehensive guide to automation patterns covering cron jobs, systemd timers, event-driven automation, idempotency, error handling, and testing for reliable operational automation.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Automation Philosophy](#automation-philosophy)
|
|
8
|
-
- [Cron Jobs](#cron-jobs)
|
|
9
|
-
- [systemd Timers](#systemd-timers)
|
|
10
|
-
- [Event-Driven Automation](#event-driven-automation)
|
|
11
|
-
- [Idempotency Patterns](#idempotency-patterns)
|
|
12
|
-
- [Error Handling](#error-handling)
|
|
13
|
-
- [Logging and Notifications](#logging-and-notifications)
|
|
14
|
-
- [Testing Automation](#testing-automation)
|
|
15
|
-
|
|
16
|
-
## Automation Philosophy
|
|
17
|
-
|
|
18
|
-
### When to Automate
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
Automate if:
|
|
22
|
-
â Task is repetitive
|
|
23
|
-
â Task is time-consuming
|
|
24
|
-
â Task is error-prone when manual
|
|
25
|
-
â Task needs to run on schedule
|
|
26
|
-
â Task requires consistency
|
|
27
|
-
|
|
28
|
-
Don't automate if:
|
|
29
|
-
â Task rarely runs
|
|
30
|
-
â Automation time > manual time savings
|
|
31
|
-
â Task requires human judgment
|
|
32
|
-
â One-time operation
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Automation Principles
|
|
36
|
-
|
|
37
|
-
1. **Idempotent**: Safe to run multiple times
|
|
38
|
-
2. **Observable**: Log everything
|
|
39
|
-
3. **Resilient**: Handle failures gracefully
|
|
40
|
-
4. **Testable**: Can be tested before production
|
|
41
|
-
5. **Documented**: Clear purpose and behavior
|
|
42
|
-
|
|
43
|
-
## Cron Jobs
|
|
44
|
-
|
|
45
|
-
### Cron Syntax
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
* * * * * command
|
|
49
|
-
â â â â â
|
|
50
|
-
â â â â ââââ Day of week (0-7, Sunday=0 or 7)
|
|
51
|
-
â â â ââââââ Month (1-12)
|
|
52
|
-
â â ââââââââ Day of month (1-31)
|
|
53
|
-
â ââââââââââ Hour (0-23)
|
|
54
|
-
ââââââââââââ Minute (0-59)
|
|
55
|
-
|
|
56
|
-
Special strings:
|
|
57
|
-
@reboot - Run once at startup
|
|
58
|
-
@yearly - 0 0 1 1 * (Jan 1, midnight)
|
|
59
|
-
@monthly - 0 0 1 * * (1st of month, midnight)
|
|
60
|
-
@weekly - 0 0 * * 0 (Sunday, midnight)
|
|
61
|
-
@daily - 0 0 * * * (Every day, midnight)
|
|
62
|
-
@hourly - 0 * * * * (Every hour)
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Cron Examples
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
# Edit crontab
|
|
69
|
-
crontab -e
|
|
70
|
-
|
|
71
|
-
# List cron jobs
|
|
72
|
-
crontab -l
|
|
73
|
-
|
|
74
|
-
# System-wide cron
|
|
75
|
-
sudo vim /etc/crontab
|
|
76
|
-
ls /etc/cron.d/
|
|
77
|
-
ls /etc/cron.{hourly,daily,weekly,monthly}/
|
|
78
|
-
|
|
79
|
-
# Examples
|
|
80
|
-
# Run every day at 2 AM
|
|
81
|
-
0 2 * * * /usr/local/bin/backup.sh
|
|
82
|
-
|
|
83
|
-
# Run every hour
|
|
84
|
-
0 * * * * /usr/local/bin/cleanup.sh
|
|
85
|
-
|
|
86
|
-
# Run every 15 minutes
|
|
87
|
-
*/15 * * * * /usr/local/bin/monitor.sh
|
|
88
|
-
|
|
89
|
-
# Run on weekdays at 9 AM
|
|
90
|
-
0 9 * * 1-5 /usr/local/bin/report.sh
|
|
91
|
-
|
|
92
|
-
# Run first day of month
|
|
93
|
-
0 0 1 * * /usr/local/bin/monthly-report.sh
|
|
94
|
-
|
|
95
|
-
# Multiple times
|
|
96
|
-
0 0,6,12,18 * * * /usr/local/bin/check.sh
|
|
97
|
-
|
|
98
|
-
# Run every 5 minutes during business hours
|
|
99
|
-
*/5 9-17 * * 1-5 /usr/local/bin/poll.sh
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Production Cron Job
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
#!/bin/bash
|
|
106
|
-
# /usr/local/bin/backup-cron.sh
|
|
107
|
-
# Daily database backup with error handling
|
|
108
|
-
|
|
109
|
-
set -euo pipefail
|
|
110
|
-
|
|
111
|
-
# Configuration
|
|
112
|
-
readonly BACKUP_DIR="/backup/database"
|
|
113
|
-
readonly LOG_FILE="/var/log/backup-cron.log"
|
|
114
|
-
readonly RETENTION_DAYS=7
|
|
115
|
-
readonly DB_NAME="production"
|
|
116
|
-
readonly SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK"
|
|
117
|
-
|
|
118
|
-
# Logging
|
|
119
|
-
log() {
|
|
120
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
notify_slack() {
|
|
124
|
-
local message=$1
|
|
125
|
-
curl -X POST -H 'Content-type: application/json' \
|
|
126
|
-
--data "{\"text\":\"$message\"}" \
|
|
127
|
-
"$SLACK_WEBHOOK" 2>/dev/null || true
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
# Error handling
|
|
131
|
-
trap 'log "ERROR: Backup failed"; notify_slack "â Backup failed"; exit 1' ERR
|
|
132
|
-
|
|
133
|
-
# Main backup
|
|
134
|
-
log "Starting backup"
|
|
135
|
-
|
|
136
|
-
# Create backup directory
|
|
137
|
-
mkdir -p "$BACKUP_DIR"
|
|
138
|
-
|
|
139
|
-
# Backup filename
|
|
140
|
-
BACKUP_FILE="$BACKUP_DIR/db-$DB_NAME-$(date +%Y%m%d-%H%M%S).sql.gz"
|
|
141
|
-
|
|
142
|
-
# Perform backup
|
|
143
|
-
pg_dump "$DB_NAME" | gzip > "$BACKUP_FILE"
|
|
144
|
-
|
|
145
|
-
# Verify backup
|
|
146
|
-
if [ -f "$BACKUP_FILE" ] && [ -s "$BACKUP_FILE" ]; then
|
|
147
|
-
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
|
148
|
-
log "Backup successful: $BACKUP_FILE ($SIZE)"
|
|
149
|
-
notify_slack "â
Backup successful: $(basename $BACKUP_FILE) ($SIZE)"
|
|
150
|
-
else
|
|
151
|
-
log "ERROR: Backup file is empty or missing"
|
|
152
|
-
notify_slack "â Backup failed: Empty or missing file"
|
|
153
|
-
exit 1
|
|
154
|
-
fi
|
|
155
|
-
|
|
156
|
-
# Cleanup old backups
|
|
157
|
-
find "$BACKUP_DIR" -name "db-$DB_NAME-*.sql.gz" -mtime +$RETENTION_DAYS -delete
|
|
158
|
-
log "Cleaned up backups older than $RETENTION_DAYS days"
|
|
159
|
-
|
|
160
|
-
log "Backup completed successfully"
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
# Cron entry
|
|
165
|
-
0 2 * * * /usr/local/bin/backup-cron.sh
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Cron Best Practices
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
# 1. Use absolute paths
|
|
172
|
-
# BAD
|
|
173
|
-
0 2 * * * backup.sh
|
|
174
|
-
|
|
175
|
-
# GOOD
|
|
176
|
-
0 2 * * * /usr/local/bin/backup.sh
|
|
177
|
-
|
|
178
|
-
# 2. Set PATH in crontab
|
|
179
|
-
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|
180
|
-
|
|
181
|
-
# 3. Redirect output
|
|
182
|
-
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup-cron.log 2>&1
|
|
183
|
-
|
|
184
|
-
# 4. Use flock to prevent overlapping
|
|
185
|
-
0 * * * * flock -n /var/lock/hourly-job.lock /usr/local/bin/hourly-job.sh
|
|
186
|
-
|
|
187
|
-
# 5. Set mailto for errors
|
|
188
|
-
MAILTO=admin@example.com
|
|
189
|
-
0 2 * * * /usr/local/bin/backup.sh
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## systemd Timers
|
|
193
|
-
|
|
194
|
-
### Why systemd Timers?
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
Advantages over cron:
|
|
198
|
-
â Better logging (journalctl)
|
|
199
|
-
â Dependencies (wait for network, etc.)
|
|
200
|
-
â Resource limits
|
|
201
|
-
â Separate service/timer units
|
|
202
|
-
â More flexible scheduling
|
|
203
|
-
â Can trigger on system events
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
### Creating systemd Timer
|
|
207
|
-
|
|
208
|
-
**Service File:**
|
|
209
|
-
```ini
|
|
210
|
-
# /etc/systemd/system/backup.service
|
|
211
|
-
[Unit]
|
|
212
|
-
Description=Daily Backup Service
|
|
213
|
-
After=network-online.target
|
|
214
|
-
Wants=network-online.target
|
|
215
|
-
|
|
216
|
-
[Service]
|
|
217
|
-
Type=oneshot
|
|
218
|
-
User=backup
|
|
219
|
-
Group=backup
|
|
220
|
-
ExecStart=/usr/local/bin/backup.sh
|
|
221
|
-
|
|
222
|
-
# Resource limits
|
|
223
|
-
MemoryLimit=2G
|
|
224
|
-
CPUQuota=50%
|
|
225
|
-
|
|
226
|
-
# Logging
|
|
227
|
-
StandardOutput=journal
|
|
228
|
-
StandardError=journal
|
|
229
|
-
SyslogIdentifier=backup
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**Timer File:**
|
|
233
|
-
```ini
|
|
234
|
-
# /etc/systemd/system/backup.timer
|
|
235
|
-
[Unit]
|
|
236
|
-
Description=Daily Backup Timer
|
|
237
|
-
Requires=backup.service
|
|
238
|
-
|
|
239
|
-
[Timer]
|
|
240
|
-
# Run daily at 2 AM
|
|
241
|
-
OnCalendar=*-*-* 02:00:00
|
|
242
|
-
|
|
243
|
-
# Run on boot if missed
|
|
244
|
-
Persistent=true
|
|
245
|
-
|
|
246
|
-
# Random delay up to 30 minutes
|
|
247
|
-
RandomizedDelaySec=30min
|
|
248
|
-
|
|
249
|
-
# Accuracy (default: 1min)
|
|
250
|
-
AccuracySec=1min
|
|
251
|
-
|
|
252
|
-
[Install]
|
|
253
|
-
WantedBy=timers.target
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
**Enable and Start:**
|
|
257
|
-
```bash
|
|
258
|
-
# Reload systemd
|
|
259
|
-
sudo systemctl daemon-reload
|
|
260
|
-
|
|
261
|
-
# Enable timer (starts on boot)
|
|
262
|
-
sudo systemctl enable backup.timer
|
|
263
|
-
|
|
264
|
-
# Start timer now
|
|
265
|
-
sudo systemctl start backup.timer
|
|
266
|
-
|
|
267
|
-
# Check timer status
|
|
268
|
-
sudo systemctl status backup.timer
|
|
269
|
-
systemctl list-timers --all
|
|
270
|
-
|
|
271
|
-
# View logs
|
|
272
|
-
journalctl -u backup.service
|
|
273
|
-
journalctl -u backup.service -f # Follow
|
|
274
|
-
|
|
275
|
-
# Manual run
|
|
276
|
-
sudo systemctl start backup.service
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Timer Schedule Examples
|
|
280
|
-
|
|
281
|
-
```ini
|
|
282
|
-
# Every 15 minutes
|
|
283
|
-
OnCalendar=*:0/15
|
|
284
|
-
|
|
285
|
-
# Every hour
|
|
286
|
-
OnCalendar=hourly
|
|
287
|
-
# Or
|
|
288
|
-
OnCalendar=*:00
|
|
289
|
-
|
|
290
|
-
# Every day at 3 AM
|
|
291
|
-
OnCalendar=daily
|
|
292
|
-
OnCalendar=03:00
|
|
293
|
-
|
|
294
|
-
# Every Monday at 9 AM
|
|
295
|
-
OnCalendar=Mon *-*-* 09:00:00
|
|
296
|
-
|
|
297
|
-
# Weekdays at 9 AM
|
|
298
|
-
OnCalendar=Mon-Fri *-*-* 09:00:00
|
|
299
|
-
|
|
300
|
-
# First day of month at midnight
|
|
301
|
-
OnCalendar=*-*-01 00:00:00
|
|
302
|
-
|
|
303
|
-
# Multiple schedules
|
|
304
|
-
OnCalendar=00:00
|
|
305
|
-
OnCalendar=12:00
|
|
306
|
-
|
|
307
|
-
# 5 minutes after boot
|
|
308
|
-
OnBootSec=5min
|
|
309
|
-
|
|
310
|
-
# 10 minutes after last activation
|
|
311
|
-
OnUnitActiveSec=10min
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### Calendar Event Format
|
|
315
|
-
|
|
316
|
-
```
|
|
317
|
-
DayOfWeek Year-Month-Day Hour:Minute:Second
|
|
318
|
-
|
|
319
|
-
Examples:
|
|
320
|
-
Mon 2024-01-01 00:00:00
|
|
321
|
-
Mon,Fri *-*-* 09:00:00
|
|
322
|
-
Mon..Fri *-*-01 00:00:00
|
|
323
|
-
|
|
324
|
-
# Test calendar expression
|
|
325
|
-
systemd-analyze calendar "Mon,Fri *-*-* 09:00:00"
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Event-Driven Automation
|
|
329
|
-
|
|
330
|
-
### inotify (File System Events)
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
# Install inotify-tools
|
|
334
|
-
sudo apt install inotify-tools
|
|
335
|
-
|
|
336
|
-
# Watch for file changes
|
|
337
|
-
inotifywait -m /var/log/myapp/ -e create -e modify |
|
|
338
|
-
while read path action file; do
|
|
339
|
-
echo "File $file was $action"
|
|
340
|
-
# Process file
|
|
341
|
-
done
|
|
342
|
-
|
|
343
|
-
# Watch and process
|
|
344
|
-
#!/bin/bash
|
|
345
|
-
inotifywait -m -e create --format '%f' /data/incoming/ |
|
|
346
|
-
while read file; do
|
|
347
|
-
echo "Processing $file"
|
|
348
|
-
/usr/local/bin/process-file.sh "/data/incoming/$file"
|
|
349
|
-
mv "/data/incoming/$file" "/data/processed/"
|
|
350
|
-
done
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
**systemd Service for File Watch:**
|
|
354
|
-
```ini
|
|
355
|
-
# /etc/systemd/system/file-processor.service
|
|
356
|
-
[Unit]
|
|
357
|
-
Description=File Processor Service
|
|
358
|
-
After=network.target
|
|
359
|
-
|
|
360
|
-
[Service]
|
|
361
|
-
Type=simple
|
|
362
|
-
User=processor
|
|
363
|
-
ExecStart=/usr/local/bin/file-watcher.sh
|
|
364
|
-
Restart=always
|
|
365
|
-
RestartSec=10
|
|
366
|
-
|
|
367
|
-
[Install]
|
|
368
|
-
WantedBy=multi-user.target
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### systemd Path Units
|
|
372
|
-
|
|
373
|
-
```ini
|
|
374
|
-
# /etc/systemd/system/process-upload.path
|
|
375
|
-
[Unit]
|
|
376
|
-
Description=Monitor upload directory
|
|
377
|
-
|
|
378
|
-
[Path]
|
|
379
|
-
PathChanged=/data/uploads
|
|
380
|
-
Unit=process-upload.service
|
|
381
|
-
|
|
382
|
-
[Install]
|
|
383
|
-
WantedBy=multi-user.target
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
```ini
|
|
387
|
-
# /etc/systemd/system/process-upload.service
|
|
388
|
-
[Unit]
|
|
389
|
-
Description=Process uploaded files
|
|
390
|
-
|
|
391
|
-
[Service]
|
|
392
|
-
Type=oneshot
|
|
393
|
-
ExecStart=/usr/local/bin/process-uploads.sh
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
## Idempotency Patterns
|
|
397
|
-
|
|
398
|
-
### Check Before Action
|
|
399
|
-
|
|
400
|
-
```bash
|
|
401
|
-
# BAD - Not idempotent
|
|
402
|
-
echo "new line" >> /etc/config
|
|
403
|
-
|
|
404
|
-
# GOOD - Check first
|
|
405
|
-
if ! grep -q "new line" /etc/config; then
|
|
406
|
-
echo "new line" >> /etc/config
|
|
407
|
-
fi
|
|
408
|
-
|
|
409
|
-
# BAD - Creates duplicate cron entries
|
|
410
|
-
echo "0 2 * * * /backup.sh" | crontab
|
|
411
|
-
|
|
412
|
-
# GOOD - Check if exists
|
|
413
|
-
(crontab -l 2>/dev/null | grep -F "/backup.sh") || \
|
|
414
|
-
(crontab -l 2>/dev/null; echo "0 2 * * * /backup.sh") | crontab -
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### State Files
|
|
418
|
-
|
|
419
|
-
```bash
|
|
420
|
-
#!/bin/bash
|
|
421
|
-
# Use state file to track completion
|
|
422
|
-
|
|
423
|
-
STATE_FILE="/var/run/myapp-sync.state"
|
|
424
|
-
LOCK_FILE="/var/run/myapp-sync.lock"
|
|
425
|
-
|
|
426
|
-
# Prevent concurrent runs
|
|
427
|
-
exec 200>"$LOCK_FILE"
|
|
428
|
-
flock -n 200 || { echo "Already running"; exit 1; }
|
|
429
|
-
|
|
430
|
-
# Check if already processed today
|
|
431
|
-
if [ -f "$STATE_FILE" ]; then
|
|
432
|
-
LAST_RUN=$(cat "$STATE_FILE")
|
|
433
|
-
TODAY=$(date +%Y-%m-%d)
|
|
434
|
-
|
|
435
|
-
if [ "$LAST_RUN" = "$TODAY" ]; then
|
|
436
|
-
echo "Already processed today"
|
|
437
|
-
exit 0
|
|
438
|
-
fi
|
|
439
|
-
fi
|
|
440
|
-
|
|
441
|
-
# Perform work
|
|
442
|
-
echo "Processing..."
|
|
443
|
-
# ... work here ...
|
|
444
|
-
|
|
445
|
-
# Update state
|
|
446
|
-
date +%Y-%m-%d > "$STATE_FILE"
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### Declarative Configuration
|
|
450
|
-
|
|
451
|
-
```bash
|
|
452
|
-
# Instead of imperative commands
|
|
453
|
-
# Use configuration management (Ansible, etc.)
|
|
454
|
-
|
|
455
|
-
# BAD - Imperative
|
|
456
|
-
useradd myuser
|
|
457
|
-
mkdir /data
|
|
458
|
-
chown myuser:myuser /data
|
|
459
|
-
|
|
460
|
-
# GOOD - Declarative (Ansible)
|
|
461
|
-
- name: Ensure user exists
|
|
462
|
-
user:
|
|
463
|
-
name: myuser
|
|
464
|
-
state: present
|
|
465
|
-
|
|
466
|
-
- name: Ensure directory exists
|
|
467
|
-
file:
|
|
468
|
-
path: /data
|
|
469
|
-
state: directory
|
|
470
|
-
owner: myuser
|
|
471
|
-
group: myuser
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
## Error Handling
|
|
475
|
-
|
|
476
|
-
### Comprehensive Error Handling
|
|
477
|
-
|
|
478
|
-
```bash
|
|
479
|
-
#!/bin/bash
|
|
480
|
-
set -euo pipefail
|
|
481
|
-
|
|
482
|
-
# Error handler
|
|
483
|
-
error_exit() {
|
|
484
|
-
local line=$1
|
|
485
|
-
local cmd=$2
|
|
486
|
-
echo "Error on line $line: Command '$cmd' failed" >&2
|
|
487
|
-
# Cleanup
|
|
488
|
-
cleanup_on_error
|
|
489
|
-
# Notify
|
|
490
|
-
send_alert "Script failed on line $line"
|
|
491
|
-
exit 1
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
trap 'error_exit ${LINENO} "${BASH_COMMAND}"' ERR
|
|
495
|
-
|
|
496
|
-
cleanup_on_error() {
|
|
497
|
-
# Remove partial files
|
|
498
|
-
rm -f /tmp/partial-*
|
|
499
|
-
# Unlock resources
|
|
500
|
-
rm -f /var/lock/mylock
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
# Main logic with error checking
|
|
504
|
-
main() {
|
|
505
|
-
# Check prerequisites
|
|
506
|
-
command -v rsync &>/dev/null || {
|
|
507
|
-
echo "Error: rsync not found" >&2
|
|
508
|
-
exit 1
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
# Check disk space
|
|
512
|
-
AVAILABLE=$(df /backup | tail -1 | awk '{print $4}')
|
|
513
|
-
REQUIRED=1000000 # 1GB in KB
|
|
514
|
-
|
|
515
|
-
if [ "$AVAILABLE" -lt "$REQUIRED" ]; then
|
|
516
|
-
echo "Error: Insufficient disk space" >&2
|
|
517
|
-
send_alert "Backup failed: No disk space"
|
|
518
|
-
exit 1
|
|
519
|
-
fi
|
|
520
|
-
|
|
521
|
-
# Perform backup
|
|
522
|
-
if ! rsync -av /data/ /backup/; then
|
|
523
|
-
echo "Error: rsync failed" >&2
|
|
524
|
-
send_alert "Backup failed: rsync error"
|
|
525
|
-
exit 1
|
|
526
|
-
fi
|
|
527
|
-
|
|
528
|
-
echo "Backup completed successfully"
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
main "$@"
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
### Retries with Exponential Backoff
|
|
535
|
-
|
|
536
|
-
```bash
|
|
537
|
-
#!/bin/bash
|
|
538
|
-
|
|
539
|
-
retry_with_backoff() {
|
|
540
|
-
local max_attempts=5
|
|
541
|
-
local timeout=1
|
|
542
|
-
local attempt=1
|
|
543
|
-
local exit_code=0
|
|
544
|
-
|
|
545
|
-
while [ $attempt -le $max_attempts ]; do
|
|
546
|
-
if "$@"; then
|
|
547
|
-
return 0
|
|
548
|
-
else
|
|
549
|
-
exit_code=$?
|
|
550
|
-
fi
|
|
551
|
-
|
|
552
|
-
echo "Attempt $attempt failed. Retrying in ${timeout}s..." >&2
|
|
553
|
-
sleep $timeout
|
|
554
|
-
attempt=$((attempt + 1))
|
|
555
|
-
timeout=$((timeout * 2))
|
|
556
|
-
done
|
|
557
|
-
|
|
558
|
-
echo "Command failed after $max_attempts attempts" >&2
|
|
559
|
-
return $exit_code
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
# Usage
|
|
563
|
-
retry_with_backoff curl -f https://api.example.com/endpoint
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
## Logging and Notifications
|
|
567
|
-
|
|
568
|
-
### Structured Logging
|
|
569
|
-
|
|
570
|
-
```bash
|
|
571
|
-
#!/bin/bash
|
|
572
|
-
|
|
573
|
-
LOG_FILE="/var/log/myapp/automation.log"
|
|
574
|
-
LOG_LEVEL="${LOG_LEVEL:-INFO}"
|
|
575
|
-
|
|
576
|
-
log() {
|
|
577
|
-
local level=$1
|
|
578
|
-
shift
|
|
579
|
-
local message="$@"
|
|
580
|
-
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
581
|
-
|
|
582
|
-
# Log levels: DEBUG, INFO, WARN, ERROR
|
|
583
|
-
case "$LOG_LEVEL" in
|
|
584
|
-
DEBUG) ;;
|
|
585
|
-
INFO) [[ "$level" == "DEBUG" ]] && return ;;
|
|
586
|
-
WARN) [[ "$level" == "DEBUG" || "$level" == "INFO" ]] && return ;;
|
|
587
|
-
ERROR) [[ "$level" != "ERROR" ]] && return ;;
|
|
588
|
-
esac
|
|
589
|
-
|
|
590
|
-
# JSON log format
|
|
591
|
-
echo "{\"timestamp\":\"$timestamp\",\"level\":\"$level\",\"message\":\"$message\"}" | tee -a "$LOG_FILE"
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
log "INFO" "Starting automation"
|
|
595
|
-
log "DEBUG" "Configuration loaded"
|
|
596
|
-
log "ERROR" "Failed to connect to database"
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
### Notification Strategies
|
|
600
|
-
|
|
601
|
-
```bash
|
|
602
|
-
# Email notification
|
|
603
|
-
send_email() {
|
|
604
|
-
local subject=$1
|
|
605
|
-
local body=$2
|
|
606
|
-
echo "$body" | mail -s "$subject" admin@example.com
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
# Slack notification
|
|
610
|
-
send_slack() {
|
|
611
|
-
local message=$1
|
|
612
|
-
local webhook="https://hooks.slack.com/services/YOUR/WEBHOOK"
|
|
613
|
-
|
|
614
|
-
curl -X POST -H 'Content-type: application/json' \
|
|
615
|
-
--data "{\"text\":\"$message\"}" \
|
|
616
|
-
"$webhook"
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
# PagerDuty alert
|
|
620
|
-
send_pagerduty() {
|
|
621
|
-
local description=$1
|
|
622
|
-
local routing_key="YOUR_ROUTING_KEY"
|
|
623
|
-
|
|
624
|
-
curl -X POST https://events.pagerduty.com/v2/enqueue \
|
|
625
|
-
-H 'Content-Type: application/json' \
|
|
626
|
-
-d "{
|
|
627
|
-
\"routing_key\": \"$routing_key\",
|
|
628
|
-
\"event_action\": \"trigger\",
|
|
629
|
-
\"payload\": {
|
|
630
|
-
\"summary\": \"$description\",
|
|
631
|
-
\"severity\": \"critical\",
|
|
632
|
-
\"source\": \"$(hostname)\"
|
|
633
|
-
}
|
|
634
|
-
}"
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
# Multi-channel notification
|
|
638
|
-
notify() {
|
|
639
|
-
local message=$1
|
|
640
|
-
local severity=${2:-info}
|
|
641
|
-
|
|
642
|
-
log "INFO" "$message"
|
|
643
|
-
|
|
644
|
-
case "$severity" in
|
|
645
|
-
critical)
|
|
646
|
-
send_pagerduty "$message"
|
|
647
|
-
send_slack "đ¨ CRITICAL: $message"
|
|
648
|
-
send_email "CRITICAL Alert" "$message"
|
|
649
|
-
;;
|
|
650
|
-
error)
|
|
651
|
-
send_slack "â ERROR: $message"
|
|
652
|
-
send_email "Error Alert" "$message"
|
|
653
|
-
;;
|
|
654
|
-
warning)
|
|
655
|
-
send_slack "â ī¸ WARNING: $message"
|
|
656
|
-
;;
|
|
657
|
-
info)
|
|
658
|
-
send_slack "âšī¸ INFO: $message"
|
|
659
|
-
;;
|
|
660
|
-
esac
|
|
661
|
-
}
|
|
662
|
-
```
|
|
663
|
-
|
|
664
|
-
## Testing Automation
|
|
665
|
-
|
|
666
|
-
### Testing Framework
|
|
667
|
-
|
|
668
|
-
```bash
|
|
669
|
-
#!/bin/bash
|
|
670
|
-
# test-automation.sh
|
|
671
|
-
|
|
672
|
-
TESTS_PASSED=0
|
|
673
|
-
TESTS_FAILED=0
|
|
674
|
-
|
|
675
|
-
assert_equals() {
|
|
676
|
-
local expected=$1
|
|
677
|
-
local actual=$2
|
|
678
|
-
local message=${3:-"Assertion failed"}
|
|
679
|
-
|
|
680
|
-
if [ "$expected" = "$actual" ]; then
|
|
681
|
-
echo "â PASS: $message"
|
|
682
|
-
((TESTS_PASSED++))
|
|
683
|
-
else
|
|
684
|
-
echo "â FAIL: $message (expected: '$expected', got: '$actual')"
|
|
685
|
-
((TESTS_FAILED++))
|
|
686
|
-
fi
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
assert_file_exists() {
|
|
690
|
-
local file=$1
|
|
691
|
-
if [ -f "$file" ]; then
|
|
692
|
-
echo "â PASS: File exists: $file"
|
|
693
|
-
((TESTS_PASSED++))
|
|
694
|
-
else
|
|
695
|
-
echo "â FAIL: File does not exist: $file"
|
|
696
|
-
((TESTS_FAILED++))
|
|
697
|
-
fi
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
# Setup
|
|
701
|
-
setup() {
|
|
702
|
-
TEST_DIR=$(mktemp -d)
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
# Teardown
|
|
706
|
-
teardown() {
|
|
707
|
-
rm -rf "$TEST_DIR"
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
# Tests
|
|
711
|
-
test_backup_creates_file() {
|
|
712
|
-
setup
|
|
713
|
-
/usr/local/bin/backup.sh --dest "$TEST_DIR"
|
|
714
|
-
assert_file_exists "$TEST_DIR/backup.tar.gz"
|
|
715
|
-
teardown
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
test_cleanup_removes_old_files() {
|
|
719
|
-
setup
|
|
720
|
-
touch -t 202401010000 "$TEST_DIR/old-file"
|
|
721
|
-
/usr/local/bin/cleanup.sh --dir "$TEST_DIR" --days 7
|
|
722
|
-
[ ! -f "$TEST_DIR/old-file" ]
|
|
723
|
-
assert_equals $? 0 "Old file removed"
|
|
724
|
-
teardown
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
# Run tests
|
|
728
|
-
test_backup_creates_file
|
|
729
|
-
test_cleanup_removes_old_files
|
|
730
|
-
|
|
731
|
-
# Summary
|
|
732
|
-
echo ""
|
|
733
|
-
echo "Tests passed: $TESTS_PASSED"
|
|
734
|
-
echo "Tests failed: $TESTS_FAILED"
|
|
735
|
-
|
|
736
|
-
if [ $TESTS_FAILED -gt 0 ]; then
|
|
737
|
-
exit 1
|
|
738
|
-
fi
|
|
739
|
-
```
|
|
740
|
-
|
|
741
|
-
### Integration Testing
|
|
742
|
-
|
|
743
|
-
```bash
|
|
744
|
-
#!/bin/bash
|
|
745
|
-
# integration-test.sh
|
|
746
|
-
|
|
747
|
-
# Test in staging environment
|
|
748
|
-
STAGING_SERVER="staging.example.com"
|
|
749
|
-
|
|
750
|
-
# Deploy automation scripts
|
|
751
|
-
rsync -av /usr/local/bin/ $STAGING_SERVER:/usr/local/bin/
|
|
752
|
-
|
|
753
|
-
# Run automation
|
|
754
|
-
ssh $STAGING_SERVER "/usr/local/bin/automation.sh"
|
|
755
|
-
|
|
756
|
-
# Verify results
|
|
757
|
-
ssh $STAGING_SERVER "test -f /backup/latest.tar.gz" || {
|
|
758
|
-
echo "Integration test failed: No backup file"
|
|
759
|
-
exit 1
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
echo "Integration test passed"
|
|
763
|
-
```
|
|
764
|
-
|
|
765
|
-
---
|
|
766
|
-
|
|
767
|
-
**Related Topics:**
|
|
768
|
-
- See [shell-scripting.md](shell-scripting.md) for scripting patterns
|
|
769
|
-
- See [configuration-management.md](configuration-management.md) for infrastructure automation
|
|
770
|
-
- See [system-monitoring.md](system-monitoring.md) for monitoring automation tasks
|
|
771
|
-
- See [linux-administration.md](linux-administration.md) for system management
|