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,915 +0,0 @@
|
|
|
1
|
-
# Shell Scripting
|
|
2
|
-
|
|
3
|
-
Comprehensive guide to Bash scripting covering patterns, error handling, functions, input validation, common pitfalls, testing, and best practices for production-ready scripts.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Script Structure](#script-structure)
|
|
8
|
-
- [Error Handling](#error-handling)
|
|
9
|
-
- [Functions and Modularity](#functions-and-modularity)
|
|
10
|
-
- [Input Validation](#input-validation)
|
|
11
|
-
- [Common Pitfalls](#common-pitfalls)
|
|
12
|
-
- [Testing Shell Scripts](#testing-shell-scripts)
|
|
13
|
-
- [Best Practices](#best-practices)
|
|
14
|
-
- [Complete Examples](#complete-examples)
|
|
15
|
-
|
|
16
|
-
## Script Structure
|
|
17
|
-
|
|
18
|
-
### Basic Template
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
#!/usr/bin/env bash
|
|
22
|
-
#
|
|
23
|
-
# Script: backup.sh
|
|
24
|
-
# Description: Automated backup script with error handling
|
|
25
|
-
# Author: DevOps Team
|
|
26
|
-
# Date: 2025-01-01
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
set -euo pipefail # Exit on error, undefined vars, pipe failures
|
|
30
|
-
IFS=$'\n\t' # Set Internal Field Separator
|
|
31
|
-
|
|
32
|
-
# Constants
|
|
33
|
-
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
34
|
-
readonly SCRIPT_NAME="$(basename "$0")"
|
|
35
|
-
readonly BACKUP_DIR="/backup"
|
|
36
|
-
readonly LOG_FILE="/var/log/${SCRIPT_NAME%.sh}.log"
|
|
37
|
-
|
|
38
|
-
# Variables
|
|
39
|
-
VERBOSE=false
|
|
40
|
-
DRY_RUN=false
|
|
41
|
-
|
|
42
|
-
# Cleanup function
|
|
43
|
-
cleanup() {
|
|
44
|
-
local exit_code=$?
|
|
45
|
-
# Cleanup temporary files
|
|
46
|
-
rm -f /tmp/backup-$$-*
|
|
47
|
-
exit "$exit_code"
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
# Set trap for cleanup
|
|
51
|
-
trap cleanup EXIT INT TERM
|
|
52
|
-
|
|
53
|
-
# Main function
|
|
54
|
-
main() {
|
|
55
|
-
log "INFO" "Starting backup process"
|
|
56
|
-
|
|
57
|
-
# Script logic here
|
|
58
|
-
|
|
59
|
-
log "INFO" "Backup completed successfully"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
# Run main function
|
|
63
|
-
main "$@"
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Shebang Best Practices
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# BEST - Portable, uses env to find bash
|
|
70
|
-
#!/usr/bin/env bash
|
|
71
|
-
|
|
72
|
-
# ACCEPTABLE - Direct path (less portable)
|
|
73
|
-
#!/bin/bash
|
|
74
|
-
|
|
75
|
-
# AVOID - Assumes bash is in specific location
|
|
76
|
-
#!/usr/local/bin/bash
|
|
77
|
-
|
|
78
|
-
# FOR sh compatibility (POSIX)
|
|
79
|
-
#!/bin/sh
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Error Handling
|
|
83
|
-
|
|
84
|
-
### set Options
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
# Exit on any error
|
|
88
|
-
set -e
|
|
89
|
-
|
|
90
|
-
# Exit on undefined variable
|
|
91
|
-
set -u
|
|
92
|
-
|
|
93
|
-
# Exit on pipe failure (not just last command)
|
|
94
|
-
set -o pipefail
|
|
95
|
-
|
|
96
|
-
# Combined (recommended for production scripts)
|
|
97
|
-
set -euo pipefail
|
|
98
|
-
|
|
99
|
-
# Debug mode (print each command)
|
|
100
|
-
set -x
|
|
101
|
-
|
|
102
|
-
# Alternative: enable only for debugging
|
|
103
|
-
DEBUG=${DEBUG:-false}
|
|
104
|
-
if [ "$DEBUG" = "true" ]; then
|
|
105
|
-
set -x
|
|
106
|
-
fi
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### Error Handling Patterns
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
|
-
# Pattern 1: Check command success
|
|
113
|
-
if ! command -v docker &> /dev/null; then
|
|
114
|
-
echo "Error: docker not found" >&2
|
|
115
|
-
exit 1
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
# Pattern 2: Or operator
|
|
119
|
-
mkdir -p /backup || {
|
|
120
|
-
echo "Error: Failed to create backup directory" >&2
|
|
121
|
-
exit 1
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
# Pattern 3: Explicit error checking
|
|
125
|
-
cp source.txt dest.txt
|
|
126
|
-
if [ $? -ne 0 ]; then
|
|
127
|
-
echo "Error: Copy failed" >&2
|
|
128
|
-
exit 1
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
# Pattern 4: Command substitution with error check
|
|
132
|
-
output=$(command 2>&1) || {
|
|
133
|
-
echo "Error: Command failed with output: $output" >&2
|
|
134
|
-
exit 1
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### trap for Cleanup
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
#!/bin/bash
|
|
142
|
-
|
|
143
|
-
# Cleanup function
|
|
144
|
-
cleanup() {
|
|
145
|
-
local exit_code=$?
|
|
146
|
-
echo "Cleaning up..."
|
|
147
|
-
|
|
148
|
-
# Remove temporary files
|
|
149
|
-
rm -f "$TEMP_FILE"
|
|
150
|
-
|
|
151
|
-
# Unmount if mounted
|
|
152
|
-
if mountpoint -q "$MOUNT_POINT"; then
|
|
153
|
-
umount "$MOUNT_POINT"
|
|
154
|
-
fi
|
|
155
|
-
|
|
156
|
-
# Kill background processes
|
|
157
|
-
if [ -n "${PID:-}" ]; then
|
|
158
|
-
kill "$PID" 2>/dev/null || true
|
|
159
|
-
fi
|
|
160
|
-
|
|
161
|
-
exit "$exit_code"
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
# Trap on EXIT, INT, TERM
|
|
165
|
-
trap cleanup EXIT INT TERM
|
|
166
|
-
|
|
167
|
-
# Create temp file
|
|
168
|
-
TEMP_FILE=$(mktemp)
|
|
169
|
-
|
|
170
|
-
# Rest of script...
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Logging Functions
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
# Color codes
|
|
177
|
-
readonly RED='\033[0;31m'
|
|
178
|
-
readonly YELLOW='\033[1;33m'
|
|
179
|
-
readonly GREEN='\033[0;32m'
|
|
180
|
-
readonly NC='\033[0m' # No Color
|
|
181
|
-
|
|
182
|
-
# Logging function
|
|
183
|
-
log() {
|
|
184
|
-
local level=$1
|
|
185
|
-
shift
|
|
186
|
-
local message="$@"
|
|
187
|
-
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
188
|
-
|
|
189
|
-
case "$level" in
|
|
190
|
-
ERROR)
|
|
191
|
-
echo -e "${RED}[$timestamp] ERROR: $message${NC}" >&2
|
|
192
|
-
echo "[$timestamp] ERROR: $message" >> "$LOG_FILE"
|
|
193
|
-
;;
|
|
194
|
-
WARN)
|
|
195
|
-
echo -e "${YELLOW}[$timestamp] WARN: $message${NC}" >&2
|
|
196
|
-
echo "[$timestamp] WARN: $message" >> "$LOG_FILE"
|
|
197
|
-
;;
|
|
198
|
-
INFO)
|
|
199
|
-
echo "[$timestamp] INFO: $message"
|
|
200
|
-
echo "[$timestamp] INFO: $message" >> "$LOG_FILE"
|
|
201
|
-
;;
|
|
202
|
-
DEBUG)
|
|
203
|
-
if [ "$VERBOSE" = true ]; then
|
|
204
|
-
echo "[$timestamp] DEBUG: $message"
|
|
205
|
-
fi
|
|
206
|
-
echo "[$timestamp] DEBUG: $message" >> "$LOG_FILE"
|
|
207
|
-
;;
|
|
208
|
-
esac
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
# Die function (log error and exit)
|
|
212
|
-
die() {
|
|
213
|
-
log "ERROR" "$@"
|
|
214
|
-
exit 1
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
# Usage
|
|
218
|
-
log "INFO" "Starting process"
|
|
219
|
-
log "WARN" "Disk space is low"
|
|
220
|
-
log "ERROR" "Failed to connect to database"
|
|
221
|
-
die "Critical error occurred"
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
## Functions and Modularity
|
|
225
|
-
|
|
226
|
-
### Function Basics
|
|
227
|
-
|
|
228
|
-
```bash
|
|
229
|
-
# Function definition
|
|
230
|
-
function_name() {
|
|
231
|
-
local arg1=$1
|
|
232
|
-
local arg2=${2:-"default"} # Default value
|
|
233
|
-
|
|
234
|
-
# Function logic
|
|
235
|
-
echo "Processing $arg1 and $arg2"
|
|
236
|
-
|
|
237
|
-
return 0 # Return status (0-255)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
# Calling function
|
|
241
|
-
function_name "value1" "value2"
|
|
242
|
-
|
|
243
|
-
# Capture output
|
|
244
|
-
result=$(function_name "value1")
|
|
245
|
-
|
|
246
|
-
# Check return status
|
|
247
|
-
if function_name "value1"; then
|
|
248
|
-
echo "Success"
|
|
249
|
-
else
|
|
250
|
-
echo "Failed"
|
|
251
|
-
fi
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### Advanced Function Patterns
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
# Function with named parameters (associative array)
|
|
258
|
-
process_data() {
|
|
259
|
-
local -A params=(
|
|
260
|
-
[input]=""
|
|
261
|
-
[output]=""
|
|
262
|
-
[format]="json"
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
# Parse parameters
|
|
266
|
-
while [[ $# -gt 0 ]]; do
|
|
267
|
-
case $1 in
|
|
268
|
-
--input)
|
|
269
|
-
params[input]="$2"
|
|
270
|
-
shift 2
|
|
271
|
-
;;
|
|
272
|
-
--output)
|
|
273
|
-
params[output]="$2"
|
|
274
|
-
shift 2
|
|
275
|
-
;;
|
|
276
|
-
--format)
|
|
277
|
-
params[format]="$2"
|
|
278
|
-
shift 2
|
|
279
|
-
;;
|
|
280
|
-
*)
|
|
281
|
-
echo "Unknown parameter: $1" >&2
|
|
282
|
-
return 1
|
|
283
|
-
;;
|
|
284
|
-
esac
|
|
285
|
-
done
|
|
286
|
-
|
|
287
|
-
# Validate required parameters
|
|
288
|
-
if [ -z "${params[input]}" ]; then
|
|
289
|
-
echo "Error: --input is required" >&2
|
|
290
|
-
return 1
|
|
291
|
-
fi
|
|
292
|
-
|
|
293
|
-
echo "Processing ${params[input]} in ${params[format]} format"
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
# Usage
|
|
297
|
-
process_data --input "data.csv" --output "result.json" --format "json"
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### Library Pattern
|
|
301
|
-
|
|
302
|
-
```bash
|
|
303
|
-
# lib/common.sh - Shared functions
|
|
304
|
-
#!/bin/bash
|
|
305
|
-
|
|
306
|
-
# Prevent multiple sourcing
|
|
307
|
-
[[ -n "${_COMMON_LIB_LOADED:-}" ]] && return
|
|
308
|
-
readonly _COMMON_LIB_LOADED=1
|
|
309
|
-
|
|
310
|
-
# Shared functions
|
|
311
|
-
is_root() {
|
|
312
|
-
[ "$(id -u)" -eq 0 ]
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
check_command() {
|
|
316
|
-
command -v "$1" &> /dev/null
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
# Export functions (for older bash)
|
|
320
|
-
export -f is_root
|
|
321
|
-
export -f check_command
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
```bash
|
|
325
|
-
# main-script.sh - Use library
|
|
326
|
-
#!/bin/bash
|
|
327
|
-
|
|
328
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
329
|
-
source "$SCRIPT_DIR/lib/common.sh"
|
|
330
|
-
|
|
331
|
-
if ! is_root; then
|
|
332
|
-
echo "This script must be run as root" >&2
|
|
333
|
-
exit 1
|
|
334
|
-
fi
|
|
335
|
-
|
|
336
|
-
if ! check_command "docker"; then
|
|
337
|
-
echo "Docker is not installed" >&2
|
|
338
|
-
exit 1
|
|
339
|
-
fi
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## Input Validation
|
|
343
|
-
|
|
344
|
-
### Argument Parsing with getopts
|
|
345
|
-
|
|
346
|
-
```bash
|
|
347
|
-
#!/bin/bash
|
|
348
|
-
|
|
349
|
-
usage() {
|
|
350
|
-
cat <<EOF
|
|
351
|
-
Usage: $0 [OPTIONS]
|
|
352
|
-
|
|
353
|
-
Options:
|
|
354
|
-
-h, --help Show this help message
|
|
355
|
-
-v, --verbose Enable verbose mode
|
|
356
|
-
-f, --file FILE Input file (required)
|
|
357
|
-
-o, --output DIR Output directory (default: ./output)
|
|
358
|
-
-n, --dry-run Dry run mode
|
|
359
|
-
EOF
|
|
360
|
-
exit 1
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
# Default values
|
|
364
|
-
VERBOSE=false
|
|
365
|
-
DRY_RUN=false
|
|
366
|
-
INPUT_FILE=""
|
|
367
|
-
OUTPUT_DIR="./output"
|
|
368
|
-
|
|
369
|
-
# Parse arguments
|
|
370
|
-
while [[ $# -gt 0 ]]; do
|
|
371
|
-
case $1 in
|
|
372
|
-
-h|--help)
|
|
373
|
-
usage
|
|
374
|
-
;;
|
|
375
|
-
-v|--verbose)
|
|
376
|
-
VERBOSE=true
|
|
377
|
-
shift
|
|
378
|
-
;;
|
|
379
|
-
-f|--file)
|
|
380
|
-
INPUT_FILE="$2"
|
|
381
|
-
shift 2
|
|
382
|
-
;;
|
|
383
|
-
-o|--output)
|
|
384
|
-
OUTPUT_DIR="$2"
|
|
385
|
-
shift 2
|
|
386
|
-
;;
|
|
387
|
-
-n|--dry-run)
|
|
388
|
-
DRY_RUN=true
|
|
389
|
-
shift
|
|
390
|
-
;;
|
|
391
|
-
-*)
|
|
392
|
-
echo "Unknown option: $1" >&2
|
|
393
|
-
usage
|
|
394
|
-
;;
|
|
395
|
-
*)
|
|
396
|
-
echo "Unknown argument: $1" >&2
|
|
397
|
-
usage
|
|
398
|
-
;;
|
|
399
|
-
esac
|
|
400
|
-
done
|
|
401
|
-
|
|
402
|
-
# Validate required arguments
|
|
403
|
-
if [ -z "$INPUT_FILE" ]; then
|
|
404
|
-
echo "Error: --file is required" >&2
|
|
405
|
-
usage
|
|
406
|
-
fi
|
|
407
|
-
|
|
408
|
-
# Validate file exists
|
|
409
|
-
if [ ! -f "$INPUT_FILE" ]; then
|
|
410
|
-
echo "Error: File not found: $INPUT_FILE" >&2
|
|
411
|
-
exit 1
|
|
412
|
-
fi
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
### Input Validation Functions
|
|
416
|
-
|
|
417
|
-
```bash
|
|
418
|
-
# Validate IP address
|
|
419
|
-
is_valid_ip() {
|
|
420
|
-
local ip=$1
|
|
421
|
-
local regex='^([0-9]{1,3}\.){3}[0-9]{1,3}$'
|
|
422
|
-
|
|
423
|
-
if [[ $ip =~ $regex ]]; then
|
|
424
|
-
# Check each octet
|
|
425
|
-
IFS='.' read -r -a octets <<< "$ip"
|
|
426
|
-
for octet in "${octets[@]}"; do
|
|
427
|
-
if [ "$octet" -gt 255 ]; then
|
|
428
|
-
return 1
|
|
429
|
-
fi
|
|
430
|
-
done
|
|
431
|
-
return 0
|
|
432
|
-
fi
|
|
433
|
-
return 1
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
# Validate email
|
|
437
|
-
is_valid_email() {
|
|
438
|
-
local email=$1
|
|
439
|
-
local regex='^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
|
440
|
-
[[ $email =~ $regex ]]
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
# Validate number
|
|
444
|
-
is_number() {
|
|
445
|
-
local value=$1
|
|
446
|
-
[[ $value =~ ^[0-9]+$ ]]
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
# Validate port
|
|
450
|
-
is_valid_port() {
|
|
451
|
-
local port=$1
|
|
452
|
-
is_number "$port" && [ "$port" -ge 1 ] && [ "$port" -le 65535 ]
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
# Usage
|
|
456
|
-
if ! is_valid_ip "$IP_ADDRESS"; then
|
|
457
|
-
die "Invalid IP address: $IP_ADDRESS"
|
|
458
|
-
fi
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
## Common Pitfalls
|
|
462
|
-
|
|
463
|
-
### Quoting Variables
|
|
464
|
-
|
|
465
|
-
```bash
|
|
466
|
-
# BAD - Word splitting and globbing
|
|
467
|
-
file="my file.txt"
|
|
468
|
-
cat $file # Interprets as two arguments: "my" and "file.txt"
|
|
469
|
-
|
|
470
|
-
# GOOD - Quoted
|
|
471
|
-
cat "$file"
|
|
472
|
-
|
|
473
|
-
# BAD - Globbing can expand
|
|
474
|
-
files="*.txt"
|
|
475
|
-
rm $files # May delete unintended files
|
|
476
|
-
|
|
477
|
-
# GOOD - Quoted to prevent globbing
|
|
478
|
-
rm "$files"
|
|
479
|
-
|
|
480
|
-
# Array iteration
|
|
481
|
-
# BAD
|
|
482
|
-
for file in $FILES; do
|
|
483
|
-
echo $file
|
|
484
|
-
done
|
|
485
|
-
|
|
486
|
-
# GOOD
|
|
487
|
-
for file in "${FILES[@]}"; do
|
|
488
|
-
echo "$file"
|
|
489
|
-
done
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
### Word Splitting
|
|
493
|
-
|
|
494
|
-
```bash
|
|
495
|
-
# BAD
|
|
496
|
-
files=$(ls /tmp)
|
|
497
|
-
for file in $files; do
|
|
498
|
-
# Breaks on spaces in filenames
|
|
499
|
-
echo "$file"
|
|
500
|
-
done
|
|
501
|
-
|
|
502
|
-
# GOOD - Use arrays
|
|
503
|
-
mapfile -t files < <(find /tmp -type f)
|
|
504
|
-
for file in "${files[@]}"; do
|
|
505
|
-
echo "$file"
|
|
506
|
-
done
|
|
507
|
-
|
|
508
|
-
# BETTER - Direct loop
|
|
509
|
-
find /tmp -type f | while IFS= read -r file; do
|
|
510
|
-
echo "$file"
|
|
511
|
-
done
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
### Command Substitution
|
|
515
|
-
|
|
516
|
-
```bash
|
|
517
|
-
# BAD - Deprecated
|
|
518
|
-
output=`command`
|
|
519
|
-
|
|
520
|
-
# GOOD - Modern syntax
|
|
521
|
-
output=$(command)
|
|
522
|
-
|
|
523
|
-
# Nested - Modern syntax is easier to read
|
|
524
|
-
result=$(echo "The date is $(date)")
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### Test Command
|
|
528
|
-
|
|
529
|
-
```bash
|
|
530
|
-
# Use [[ ]] instead of [ ]
|
|
531
|
-
|
|
532
|
-
# BAD - [ ] (test)
|
|
533
|
-
if [ $var = "value" ]; then # Fails if var is empty
|
|
534
|
-
echo "Match"
|
|
535
|
-
fi
|
|
536
|
-
|
|
537
|
-
# GOOD - [[ ]]
|
|
538
|
-
if [[ $var = "value" ]]; then
|
|
539
|
-
echo "Match"
|
|
540
|
-
fi
|
|
541
|
-
|
|
542
|
-
# [[ ]] benefits:
|
|
543
|
-
# - No word splitting
|
|
544
|
-
# - Pattern matching with =
|
|
545
|
-
# - Regex matching with =~
|
|
546
|
-
# - && and || operators
|
|
547
|
-
|
|
548
|
-
# Pattern matching
|
|
549
|
-
if [[ $filename = *.txt ]]; then
|
|
550
|
-
echo "Text file"
|
|
551
|
-
fi
|
|
552
|
-
|
|
553
|
-
# Regex
|
|
554
|
-
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
|
|
555
|
-
echo "Valid email"
|
|
556
|
-
fi
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
### Comparison Operators
|
|
560
|
-
|
|
561
|
-
```bash
|
|
562
|
-
# String comparison
|
|
563
|
-
[[ $str1 = $str2 ]] # Equal
|
|
564
|
-
[[ $str1 != $str2 ]] # Not equal
|
|
565
|
-
[[ -z $str ]] # Empty string
|
|
566
|
-
[[ -n $str ]] # Not empty
|
|
567
|
-
|
|
568
|
-
# Numeric comparison
|
|
569
|
-
[[ $num1 -eq $num2 ]] # Equal
|
|
570
|
-
[[ $num1 -ne $num2 ]] # Not equal
|
|
571
|
-
[[ $num1 -lt $num2 ]] # Less than
|
|
572
|
-
[[ $num1 -le $num2 ]] # Less than or equal
|
|
573
|
-
[[ $num1 -gt $num2 ]] # Greater than
|
|
574
|
-
[[ $num1 -ge $num2 ]] # Greater than or equal
|
|
575
|
-
|
|
576
|
-
# File tests
|
|
577
|
-
[[ -f $file ]] # File exists
|
|
578
|
-
[[ -d $dir ]] # Directory exists
|
|
579
|
-
[[ -e $path ]] # Path exists
|
|
580
|
-
[[ -r $file ]] # Readable
|
|
581
|
-
[[ -w $file ]] # Writable
|
|
582
|
-
[[ -x $file ]] # Executable
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
## Testing Shell Scripts
|
|
586
|
-
|
|
587
|
-
### shellcheck
|
|
588
|
-
|
|
589
|
-
```bash
|
|
590
|
-
# Install shellcheck
|
|
591
|
-
sudo apt install shellcheck
|
|
592
|
-
|
|
593
|
-
# Check script
|
|
594
|
-
shellcheck myscript.sh
|
|
595
|
-
|
|
596
|
-
# Ignore specific warnings
|
|
597
|
-
# shellcheck disable=SC2086
|
|
598
|
-
echo $var
|
|
599
|
-
|
|
600
|
-
# Multiple warnings
|
|
601
|
-
# shellcheck disable=SC2086,SC2181
|
|
602
|
-
```
|
|
603
|
-
|
|
604
|
-
### BATS (Bash Automated Testing System)
|
|
605
|
-
|
|
606
|
-
```bash
|
|
607
|
-
# Install bats
|
|
608
|
-
git clone https://github.com/bats-core/bats-core.git
|
|
609
|
-
cd bats-core
|
|
610
|
-
sudo ./install.sh /usr/local
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
**Test File:**
|
|
614
|
-
```bash
|
|
615
|
-
# test/backup.bats
|
|
616
|
-
#!/usr/bin/env bats
|
|
617
|
-
|
|
618
|
-
# Setup runs before each test
|
|
619
|
-
setup() {
|
|
620
|
-
load 'test_helper/bats-support/load'
|
|
621
|
-
load 'test_helper/bats-assert/load'
|
|
622
|
-
|
|
623
|
-
# Create test directory
|
|
624
|
-
TEST_DIR=$(mktemp -d)
|
|
625
|
-
SOURCE_DIR="$TEST_DIR/source"
|
|
626
|
-
BACKUP_DIR="$TEST_DIR/backup"
|
|
627
|
-
|
|
628
|
-
mkdir -p "$SOURCE_DIR" "$BACKUP_DIR"
|
|
629
|
-
echo "test data" > "$SOURCE_DIR/file1.txt"
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
# Teardown runs after each test
|
|
633
|
-
teardown() {
|
|
634
|
-
rm -rf "$TEST_DIR"
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
@test "backup creates archive" {
|
|
638
|
-
run ./backup.sh --source "$SOURCE_DIR" --dest "$BACKUP_DIR"
|
|
639
|
-
|
|
640
|
-
assert_success
|
|
641
|
-
assert [ -f "$BACKUP_DIR/backup-*.tar.gz" ]
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
@test "backup fails without source" {
|
|
645
|
-
run ./backup.sh --dest "$BACKUP_DIR"
|
|
646
|
-
|
|
647
|
-
assert_failure
|
|
648
|
-
assert_output --partial "Error: --source is required"
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
@test "backup preserves file content" {
|
|
652
|
-
run ./backup.sh --source "$SOURCE_DIR" --dest "$BACKUP_DIR"
|
|
653
|
-
|
|
654
|
-
assert_success
|
|
655
|
-
|
|
656
|
-
# Extract and verify
|
|
657
|
-
cd "$BACKUP_DIR"
|
|
658
|
-
tar -xzf backup-*.tar.gz
|
|
659
|
-
assert [ "$(cat source/file1.txt)" = "test data" ]
|
|
660
|
-
}
|
|
661
|
-
```
|
|
662
|
-
|
|
663
|
-
**Run Tests:**
|
|
664
|
-
```bash
|
|
665
|
-
bats test/backup.bats
|
|
666
|
-
```
|
|
667
|
-
|
|
668
|
-
## Best Practices
|
|
669
|
-
|
|
670
|
-
### 1. Script Organization
|
|
671
|
-
|
|
672
|
-
```bash
|
|
673
|
-
#!/usr/bin/env bash
|
|
674
|
-
#
|
|
675
|
-
# Well-organized script structure
|
|
676
|
-
#
|
|
677
|
-
|
|
678
|
-
set -euo pipefail
|
|
679
|
-
|
|
680
|
-
# Constants first
|
|
681
|
-
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
682
|
-
readonly CONFIG_FILE="/etc/myapp/config"
|
|
683
|
-
|
|
684
|
-
# Variables
|
|
685
|
-
DEBUG=false
|
|
686
|
-
|
|
687
|
-
# Functions
|
|
688
|
-
log() { ... }
|
|
689
|
-
validate_input() { ... }
|
|
690
|
-
process_data() { ... }
|
|
691
|
-
|
|
692
|
-
# Main logic
|
|
693
|
-
main() {
|
|
694
|
-
log "INFO" "Starting"
|
|
695
|
-
validate_input "$@"
|
|
696
|
-
process_data
|
|
697
|
-
log "INFO" "Complete"
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
# Run main
|
|
701
|
-
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
|
702
|
-
main "$@"
|
|
703
|
-
fi
|
|
704
|
-
```
|
|
705
|
-
|
|
706
|
-
### 2. Documentation
|
|
707
|
-
|
|
708
|
-
```bash
|
|
709
|
-
#!/usr/bin/env bash
|
|
710
|
-
#
|
|
711
|
-
# Script: deploy.sh
|
|
712
|
-
# Description: Deploy application to production
|
|
713
|
-
# Usage: ./deploy.sh [OPTIONS]
|
|
714
|
-
# Options:
|
|
715
|
-
# -e, --env ENV Environment (staging|production)
|
|
716
|
-
# -v, --version VER Version to deploy
|
|
717
|
-
# -h, --help Show help
|
|
718
|
-
#
|
|
719
|
-
# Examples:
|
|
720
|
-
# ./deploy.sh --env production --version v1.2.3
|
|
721
|
-
# ./deploy.sh -e staging -v latest
|
|
722
|
-
#
|
|
723
|
-
# Author: DevOps Team
|
|
724
|
-
# Date: 2025-01-01
|
|
725
|
-
#
|
|
726
|
-
|
|
727
|
-
# Function documentation
|
|
728
|
-
#
|
|
729
|
-
# backup_database()
|
|
730
|
-
# Creates a database backup before deployment
|
|
731
|
-
#
|
|
732
|
-
# Arguments:
|
|
733
|
-
# $1 - Database name
|
|
734
|
-
# $2 - Backup directory
|
|
735
|
-
#
|
|
736
|
-
# Returns:
|
|
737
|
-
# 0 on success, 1 on failure
|
|
738
|
-
#
|
|
739
|
-
backup_database() {
|
|
740
|
-
local db_name=$1
|
|
741
|
-
local backup_dir=$2
|
|
742
|
-
# ...
|
|
743
|
-
}
|
|
744
|
-
```
|
|
745
|
-
|
|
746
|
-
### 3. Error Messages
|
|
747
|
-
|
|
748
|
-
```bash
|
|
749
|
-
# Good error messages are:
|
|
750
|
-
# - Clear and specific
|
|
751
|
-
# - Include context
|
|
752
|
-
# - Suggest solutions
|
|
753
|
-
|
|
754
|
-
# BAD
|
|
755
|
-
echo "Error" >&2
|
|
756
|
-
|
|
757
|
-
# GOOD
|
|
758
|
-
echo "Error: Failed to connect to database 'production' at localhost:5432" >&2
|
|
759
|
-
echo "Suggestion: Check if PostgreSQL is running and credentials are correct" >&2
|
|
760
|
-
```
|
|
761
|
-
|
|
762
|
-
### 4. Debugging
|
|
763
|
-
|
|
764
|
-
```bash
|
|
765
|
-
# Enable debugging
|
|
766
|
-
bash -x script.sh
|
|
767
|
-
|
|
768
|
-
# Or in script
|
|
769
|
-
set -x # Enable
|
|
770
|
-
set +x # Disable
|
|
771
|
-
|
|
772
|
-
# Conditional debugging
|
|
773
|
-
DEBUG=${DEBUG:-false}
|
|
774
|
-
if [ "$DEBUG" = "true" ]; then
|
|
775
|
-
set -x
|
|
776
|
-
fi
|
|
777
|
-
|
|
778
|
-
# Verbose logging
|
|
779
|
-
VERBOSE=${VERBOSE:-false}
|
|
780
|
-
debug_log() {
|
|
781
|
-
if [ "$VERBOSE" = "true" ]; then
|
|
782
|
-
echo "[DEBUG] $@" >&2
|
|
783
|
-
fi
|
|
784
|
-
}
|
|
785
|
-
```
|
|
786
|
-
|
|
787
|
-
## Complete Examples
|
|
788
|
-
|
|
789
|
-
### System Backup Script
|
|
790
|
-
|
|
791
|
-
```bash
|
|
792
|
-
#!/usr/bin/env bash
|
|
793
|
-
#
|
|
794
|
-
# backup.sh - Automated system backup
|
|
795
|
-
#
|
|
796
|
-
|
|
797
|
-
set -euo pipefail
|
|
798
|
-
|
|
799
|
-
# Configuration
|
|
800
|
-
readonly BACKUP_DIR="/backup"
|
|
801
|
-
readonly RETENTION_DAYS=7
|
|
802
|
-
readonly LOG_FILE="/var/log/backup.log"
|
|
803
|
-
|
|
804
|
-
# Directories to backup
|
|
805
|
-
readonly BACKUP_SOURCES=(
|
|
806
|
-
"/etc"
|
|
807
|
-
"/var/www"
|
|
808
|
-
"/home"
|
|
809
|
-
)
|
|
810
|
-
|
|
811
|
-
# Logging
|
|
812
|
-
log() {
|
|
813
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $@" | tee -a "$LOG_FILE"
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
die() {
|
|
817
|
-
log "ERROR: $@"
|
|
818
|
-
exit 1
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
# Check if running as root
|
|
822
|
-
if [ "$(id -u)" -ne 0 ]; then
|
|
823
|
-
die "This script must be run as root"
|
|
824
|
-
fi
|
|
825
|
-
|
|
826
|
-
# Create backup directory
|
|
827
|
-
mkdir -p "$BACKUP_DIR" || die "Failed to create backup directory"
|
|
828
|
-
|
|
829
|
-
# Backup filename
|
|
830
|
-
BACKUP_FILE="$BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S).tar.gz"
|
|
831
|
-
|
|
832
|
-
log "Starting backup to $BACKUP_FILE"
|
|
833
|
-
|
|
834
|
-
# Create backup
|
|
835
|
-
if tar -czf "$BACKUP_FILE" "${BACKUP_SOURCES[@]}" 2>&1 | tee -a "$LOG_FILE"; then
|
|
836
|
-
log "Backup created successfully"
|
|
837
|
-
log "Size: $(du -h "$BACKUP_FILE" | cut -f1)"
|
|
838
|
-
else
|
|
839
|
-
die "Backup failed"
|
|
840
|
-
fi
|
|
841
|
-
|
|
842
|
-
# Remove old backups
|
|
843
|
-
log "Removing backups older than $RETENTION_DAYS days"
|
|
844
|
-
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
|
|
845
|
-
|
|
846
|
-
log "Backup completed successfully"
|
|
847
|
-
```
|
|
848
|
-
|
|
849
|
-
### Service Health Check
|
|
850
|
-
|
|
851
|
-
```bash
|
|
852
|
-
#!/usr/bin/env bash
|
|
853
|
-
#
|
|
854
|
-
# health-check.sh - Check service health
|
|
855
|
-
#
|
|
856
|
-
|
|
857
|
-
set -euo pipefail
|
|
858
|
-
|
|
859
|
-
# Configuration
|
|
860
|
-
readonly SERVICE_NAME="myapp"
|
|
861
|
-
readonly HEALTH_URL="http://localhost:8080/health"
|
|
862
|
-
readonly MAX_RETRIES=3
|
|
863
|
-
readonly RETRY_DELAY=5
|
|
864
|
-
|
|
865
|
-
check_service() {
|
|
866
|
-
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
|
867
|
-
echo "✓ Service $SERVICE_NAME is running"
|
|
868
|
-
return 0
|
|
869
|
-
else
|
|
870
|
-
echo "✗ Service $SERVICE_NAME is not running"
|
|
871
|
-
return 1
|
|
872
|
-
fi
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
check_http() {
|
|
876
|
-
local url=$1
|
|
877
|
-
local retries=0
|
|
878
|
-
|
|
879
|
-
while [ $retries -lt $MAX_RETRIES ]; do
|
|
880
|
-
if curl -sf "$url" > /dev/null 2>&1; then
|
|
881
|
-
echo "✓ HTTP endpoint $url is healthy"
|
|
882
|
-
return 0
|
|
883
|
-
fi
|
|
884
|
-
|
|
885
|
-
retries=$((retries + 1))
|
|
886
|
-
if [ $retries -lt $MAX_RETRIES ]; then
|
|
887
|
-
echo "Retry $retries/$MAX_RETRIES after $RETRY_DELAY seconds..."
|
|
888
|
-
sleep $RETRY_DELAY
|
|
889
|
-
fi
|
|
890
|
-
done
|
|
891
|
-
|
|
892
|
-
echo "✗ HTTP endpoint $url is unhealthy"
|
|
893
|
-
return 1
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
# Main checks
|
|
897
|
-
echo "Checking service health..."
|
|
898
|
-
check_service
|
|
899
|
-
check_http "$HEALTH_URL"
|
|
900
|
-
|
|
901
|
-
if [ $? -eq 0 ]; then
|
|
902
|
-
echo "All health checks passed"
|
|
903
|
-
exit 0
|
|
904
|
-
else
|
|
905
|
-
echo "Health checks failed"
|
|
906
|
-
exit 1
|
|
907
|
-
fi
|
|
908
|
-
```
|
|
909
|
-
|
|
910
|
-
---
|
|
911
|
-
|
|
912
|
-
**Related Topics:**
|
|
913
|
-
- See [automation-patterns.md](automation-patterns.md) for cron and systemd timers
|
|
914
|
-
- See [troubleshooting-guide.md](troubleshooting-guide.md) for debugging scripts
|
|
915
|
-
- See [linux-administration.md](linux-administration.md) for system management
|