diff --git a/README.md b/README.md index dfcde0a5..d2c00ac7 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,27 @@ them to be used as appliances. | | | |---|---| -| 🖥️ **System & Network** | Hostname, uptime, OS info, disk, memory, load, DNS read/update, ping, command execution (exec/shell) | -| ⚡ **Async Job System** | NATS JetStream with KV-first architecture — broadcast, load-balanced, and label-based routing across hosts | -| 💚 **Health & Metrics** | Liveness, readiness, system status endpoints, Prometheus `/metrics` | -| 📋 **Audit Logging** | Structured API audit trail in NATS KV with 30-day retention and admin-only read access | -| 🔐 **Auth & RBAC** | JWT with fine-grained `resource:verb` permissions, built-in and custom roles, direct permission grants | -| 🔍 **Distributed Tracing** | OpenTelemetry with trace context propagation across HTTP and NATS | +| 🖥️ **[Node Management][]** | Hostname, uptime, OS info, disk, memory, load | +| 🌐 **[Network Management][]** | DNS read/update, ping | +| ⚙️ **[Command Execution][]** | Remote exec and shell across managed hosts | +| ⚡ **[Async Job System][]** | NATS JetStream with KV-first architecture — broadcast, load-balanced, and label-based routing across hosts | +| 💚 **[Health][] & [Metrics][]** | Liveness, readiness, system status endpoints, Prometheus `/metrics` | +| 📋 **[Audit Logging][]** | Structured API audit trail in NATS KV with 30-day retention and admin-only read access | +| 🔐 **[Auth & RBAC][]** | JWT with fine-grained `resource:verb` permissions, built-in and custom roles, direct permission grants | +| 🔍 **[Distributed Tracing][]** | OpenTelemetry with trace context propagation across HTTP and NATS | | 🖥️ **CLI Parity** | Every API operation has a CLI equivalent with `--json` for scripting | | 🏢 **Multi-Tenant** | Namespace isolation lets multiple deployments share a single NATS cluster | +[Node Management]: https://osapi-io.github.io/osapi/sidebar/features/node-management +[Network Management]: https://osapi-io.github.io/osapi/sidebar/features/network-management +[Command Execution]: https://osapi-io.github.io/osapi/sidebar/features/command-execution +[Async Job System]: https://osapi-io.github.io/osapi/sidebar/features/job-system +[Health]: https://osapi-io.github.io/osapi/sidebar/features/health-checks +[Metrics]: https://osapi-io.github.io/osapi/sidebar/features/metrics +[Audit Logging]: https://osapi-io.github.io/osapi/sidebar/features/audit-logging +[Auth & RBAC]: https://osapi-io.github.io/osapi/sidebar/features/authentication +[Distributed Tracing]: https://osapi-io.github.io/osapi/sidebar/features/distributed-tracing + ## 📖 Documentation [Features][] | [Architecture][] | [Getting Started][] | [API][] | [Usage][] | [Roadmap][] @@ -46,6 +58,20 @@ them to be used as appliances. [Usage]: https://osapi-io.github.io/osapi/sidebar/usage [Roadmap]: https://osapi-io.github.io/osapi/sidebar/development/roadmap +## 🔗 Sister Projects + +| Project | Description | +| --- | --- | +| [osapi-sdk][] | Go SDK for OSAPI — client library and orchestration primitives | +| [osapi-orchestrator][] | A Go package for orchestrating operations across OSAPI-managed hosts — typed operations, chaining, conditions, and result decoding built on top of the osapi-sdk engine | +| [nats-client][] | A Go package for connecting to and interacting with a NATS server | +| [nats-server][] | A Go package for running an embedded NATS server | + +[osapi-sdk]: https://github.com/osapi-io/osapi-sdk +[osapi-orchestrator]: https://github.com/osapi-io/osapi-orchestrator +[nats-client]: https://github.com/osapi-io/nats-client +[nats-server]: https://github.com/osapi-io/nats-server + ## 📄 License The [MIT][] License. diff --git a/docs/docs/gen/api/create-a-new-job.api.mdx b/docs/docs/gen/api/create-a-new-job.api.mdx index 127a1ef4..7b669c0f 100644 --- a/docs/docs/gen/api/create-a-new-job.api.mdx +++ b/docs/docs/gen/api/create-a-new-job.api.mdx @@ -5,7 +5,7 @@ description: "Submit a new job to the queue for processing." sidebar_label: "Create a new job" hide_title: true hide_table_of_contents: true -api: eJztV11r60YQ/SvLPLUgJXJqp62gD74lgaS0N9w4LTQYs5LG9jrSrrI7G8c1+u9lVrJjx27TC/fhFgJ+sKT5ODPn7MesoUCXW1WTMhpSuPVZpUhIoXEpFiYTZATNUTx69CimxoramhydU3p2AhGQnDlI7+HaZJNfpZYzrFDTZHhzNVmYbGJqtJJDOxhH4DD3VtEK0vs1fEBp0Q49zdl/YbJ0aRUhjJtxBBYfPTr6YIoVpOtXGEdz3EDLLUpCBsIeymIBKVmPEeRGE2pib1nXpcoDjNOF4xBrcPkcK8n/aFUjpGCyBeYEEdSWQZNCx1+3BRwzPYS1NWdwNdqpsVUkpBNSXN9+/E20roxXFoViQ1ne7CRssT/HRtYqzk2BM9QxPpOVcdvpNTzJUhWSGMi25qZhJuwMaTI3jrSscAevI6v07Cje1klsnALB1nhSeia+mUi9isRElmUkjBWuxlxNVb61/pbrwGdZ1SWnYXP4fPBRpfRPPWi4hhcS73c6f1jbOAJSFLL+HBRwbbJPrWQ4UIjkaqNdS+JZ0vtnFS2l62RUCOdz1vbUl+WKi/tCIuKVoIpjjLA+JEEK3qvigKE7rR49ClWgJjVVaAM/vBw3gBcm2ydhMEjwh36SxHj2Yxb3e0U/lt/3zuN+//x8MOj3kyRJoInAkSTv3hbJlVakZClae2GmIf1BWq+7bYHFyN1/Um5/0ShNOEO7W7PSdN4/KstffhebEEL7KkO7l67HclcVOpJV/XYNQSJhTW589sGfJWeDODmPe/1RL0kT/v0Jr+XYcbjt3HEJtqLrNNhPkkPZXemwBkS3w4larkojiy+oNrTW2Le7MhQ7zxtig6+guSRh8txbi8V+ry6lKrHg3c0iWYVP2EnjhHkvkKQq/4OshtvdT3Q+QmbG0wuIo2kLj5xaIy2NfQh8Gk8hNe83R+V2qK62SHbYSzJIkrCPdqxesNUBo0c2kjstPc2NVX9hIWIxvLkSD7gSW/G8E/t/IPa7Q2Ivjc1UUaAWsbjSzk+nKleoiQ/2SjkXrjXv7H797A6ObcQXbbhwNujZ5kh7J/PrJrOJoEKamwJSqI0LnZc8QsDpwmR8PKN9Qsszyc7Accu0tczsjh1bpHOimn2DGaSQBSOIuj+XmxvL9R+jcDFgOXx6GVEuNvD354Vjl/L2ltxEoPTUBARdqcMZ7ywvIxSfIxAB19J2rXeSnISrG5ddySDHLmZ7AXkZ2l53fP0i688f8NoOET7TaV1KpRmCtyVHbTsf7kZ8H+Iq+XG9zqTDO1s2Db9+9GhXLR9P0iqZcb334yaCOcoCbZgGH3DFhbQw4xEnZfPSc/KDldhEG49hnmNN/2o73pHMzcfbEdPazZVVECxYueQJUi4hBYjA1O3Emq7bd2sopZ55OWPbNiaLQO5r6JVmQlXdp3Yw2iBcr1uLkXlA3TQQdaUQP0MzbprmbzsVY5Q= +api: eJztV11r60YQ/SvLPLUgJXJqp62gD74lgaS0N9w4LTQYs5LG9jrSrrI7G8c1+u9lVrJjx27TC/fhFgJ+sKT5ODPn7MesoUCXW1WTMhpSuPVZpUhIoXEpFiYTZATNUTx69CimxoramhydU3p2AhGQnDlI7+HaZJNfpZYzrFDTZHhzNVmYbGJqtJJDOxhH4DD3VtEK0vs1fEBp0Q49zdl/YbJ0aRUhjJtxBBYfPTr6YIoVpOtXGEdz3EDLLUpCBsIeymIBKVmPEeRGE2pib1nXpcoDjNOF4xBrcPkcK8n/aFUjpGCyBeYEEdSWQZNCx1+3BRwzPYS1NWdwNdqpsVUkpBNSXN9+/E20roxXFoViQ1ne7CRssT/HRtYqzk2BM9QxPpOVcdvpNTzJUhWSGMi25qZhJuwMaTI3jrSscAevI6v07Cje1klsnALB1nhSeia+mUi9isRElmUkjBWuxlxNVb61/pbrwGdZ1SWnYXP4fPBRpfRPvSh8mbR4oOGCXhi936HhsNBxBKQoQPg5yOHaZJ9a/XCgEMnVRruW0bOk98+SWkrXaaoQzucs9KkvyxVX+oUUxctCFcfoYbFIghS8V8UBXXdaPXoUqkBNaqrQBrJ4bW4AL0y2z8hgkOAP/SSJ8ezHLO73in4sv++dx/3++flg0O8nSZJAE4EjSd69rZgrrUjJUrT2wkxD+oO0Xnd7BCuTu/+k3P4KUppwhna3ZqXpvH9Uo7/8LjYhhPZVhnYvXY+1ryp0JKv67RqCRMIC3fjsgz9LzgZxch73+qNekib8+xNey7HjcNu54xJsRddpsJ8kh7K70kH2otvuRC1XpZHFF1QbWmvs210Zip3nDbHBV9BckjB57q3FYr9Xl1KVWPBWZ5GswifspHHCvBdIUpX/QVbD7VYoOh8hM+PpBcTRtIVHTq2RlsY+BD6Np5CaN5+jcjtUV1skO+wlGSRJ2FQ7Vi/Y6oDRIxvJnZae5saqv7AQsRjeXIkHXImteN6J/T8Q+90hsZfGZqooUItYXGnnp1OVK9TEp3ylnAt3nHd2v352B8c24os2XDgb9GxzpL2T+XWT2URQIc1NASnUxoXOS54n4HRhMj6e0T6h5QFlZ/q4ZdpaZnZnkC3SOVHNvsEMUsiCEUTdn8vNjeX6j1G4GLAcPr3MKxcb+PvDw7EbentlbiJQemoCgq7U4Yx3lpd5is8RiIBrabvWO0lOwtWNy65kkGMXs72AvExwrzu+fpH15097bYcIn+m0LqXSDMHbkqO2nQ93I74PcZX8uF5n0uGdLZuGXz96tKuWjydplcy43vtxE8EcZYE2jIYPuOJCWpjxiJOyeek5+cFKbKKNxzDPsaZ/tR3vSObm4+2Iae2GzCoIFqxc8jgpl5ACRGDqdnxN1+27NZRSz7ycsW0bk0Ug9zX0SjOhqu5TOyVtEK7XrcXIPKBuGoi6UoifoRk3TfM3CXNotg== sidebar_class_name: "post api-method" info_path: gen/api/agent-management-api custom_edit_url: null @@ -153,7 +153,7 @@ Submit a new job to the queue for processing. required={true} schemaName={"string"} qualifierMessage={undefined} - schema={{"type":"string","description":"The target hostname for routing (_any, _all, or specific hostname).","example":"_any","x-oapi-codegen-extra-tags":{"validate":"required,min=1"}}} + schema={{"type":"string","description":"The target hostname for routing (_any, _all, or specific hostname).","example":"_any","x-oapi-codegen-extra-tags":{"validate":"required,min=1,valid_target"}}} > diff --git a/docs/docs/gen/api/retry-job-by-id.api.mdx b/docs/docs/gen/api/retry-job-by-id.api.mdx index 0b2d80d7..ac69d184 100644 --- a/docs/docs/gen/api/retry-job-by-id.api.mdx +++ b/docs/docs/gen/api/retry-job-by-id.api.mdx @@ -5,7 +5,7 @@ description: "Create a new job using the same operation data as an existing job. sidebar_label: "Retry a job" hide_title: true hide_table_of_contents: true -api: eJztWG1rIzcQ/itCn1pYJ+vUTltDPziXO3BKuSPntNBgwuxqbMvZlfakWSeu2f9eRvLacezeXeGgDQQC2Zd5fZ5HsmbXUqHPna5IWyMH8o1DIBQgDD6Ihc1E7bWZCZqj8FCisBU6YFuhgECAF2AEPmpPbLaw2YkYz1FYp2faQBFCaC8qhx7dEtWJuEaqnfEhZJtkdHkiE0kw83JwK69sdvcbGJhhiYbuhh9Gdwub3W1TezlJ5PZupORAXiO51ZXNLlajS5lIj3ntNK3k4HYtLxAcumFNcw6+sNngwWlCOWkmiazAQYmEzgdbAyXKgdRKJlIzHhXQXCbS4adaO1RyQK7G5BloNzejS2GnoSVuh6xwXBA35fM5liAHa0mrimN7ctrMZCKn1pVAciDrOuR77FiodCe3CmdoOvhIDjoRk7VcQqEVEAdoa0mCX9NwG/wMPV1YtWLrXblTKDwmMreG0BC/g6oqdB6gO114rn99WKTNFpiTTGTlGGjSGKogcDOku7n1FJE67GofmfdLdE4rFNFTtJ5ial2Ai3HSqKJyLnEKdUGeAbwDsxJ6Kowl4SvM9VSjYkDxEcqq4Jxs8i9ws6UmLCtaJaU2v3QZuUSSphCrFdB1BJJfNgyrr6zxsfmztMv/9hscb3pYBeIfwIs8rCAlfJ3n6P20LooghG9EAa8Erb5GT880avSnGoVWaIixdFsK2oKZgj18+/0Uf+qlaQfPfs46va7qdeDH7nmn1zs/7/d7vTRNU9kk0hNQ7b8shpHRpKEQ0f7JgtlPW5vKWYYOlQwcLLXXEaRNfG0IZ+ie9qwNnfcOMjI7v/4u2hDC1GWGbi9dN4igRE9QVl/uIeyPHGrrs1/8WXrW76TnnW5v3E0HKf/9KaOU2iV523K4RW6y02Hcf4MQo/Q2Suyl6aH4RibIW2xWv9htZt9QcOicdV8GZiie3LfcBl9BcyBh87x27vkSfge6QNVumBqXuFHHCVOvkEAXX6GsoVKaL6EQGx8Bma1pV8TRtKpGTm2QHqy7D5TamkJq3k2OKu5QYLFJdthL0k/TpxvMW7Y6IPXIjnJjoKa5dfovVKIjhh9G4h5XYqufV2JfArE/HBL7zrpMK4VGdMTI+Ho61blGQ6JCV2rvw8nmld2XwG7vkN0rm4WzytTWRr1uvy+Bx/6x39RgGI907UTzSub/nswmkSXS3PIsWFkfkOfJbSBPFzY7XWvVnAZOw3DolnHem+wmxY/MYCTp6by4LXpOVLXTHN9nwUgmm4t37Tn06o9xOO6xMq53Q9nbtpMjM1ScYxoeOKc2WGzaHM7412E3CfNZQCaSi4+IdU/Sk3AC55ZLCFLcxAzzjADW73Og1zs1/7fjfkSW8JFOqwK04U5qV3CFkbxwUpaJHITDcuRvkkiGjl+u1xl4vHFF0/DjTzW6VWR1CU5DxiDerqXSnq93w/A/ovHd9eaQ9b343Eh/tPDNwziSLqGo+U4m8h5X8YNCM2kSOUdQ6EJZ8cWbmLwzZved48Em0yStxzDPsaLP2k6erIYP7z+OWaabLwNlWIvSwQMjCg+xSFvF7yr86YCfrWUBZlbDjG1jTBY17K+JZ2sgdHUUhvU6WoztPZqm2aJCfM/ANM3fav9l1A== +api: eJztWG1rIzcQ/itiPrWwTtapnbaGfvBd7sAp5Y6c00KDMdrV2JazK+1Js05cs/+9jOS149i9u8JBexAIZLUazcvzPJI1uwGFPne6Im0NDOC1Q0kopDD4IJY2E7XXZi5ogcLLEoWt0Em2FUqSFNILaQQ+ak9strTZmRgvUFin59rIIrjQXlQOPboVqjNxg1Q744PLNsjo6gwSIDn3MLiDa5tNf5NGzrFEQ9Ph+9F0abPpLrSHSQK70UjBAG6Q3PraZq/WoytIwGNeO01rGNxt4BVKh25Y04KdL202eHCaECbNJIFKOlkiofPB1sgSYQBaQQKa8agkLSABhx9r7VDBgFyNyTPQbm9HV8LOQklcDlnhOCEuyucLLCUMNkDrin17ctrMIYGZdaUkGEBdh3iPHSsr3cmtwjmaDj6Sk52IyQZWstBKEjtoc0nCuqbhMvgdenpl1Zqt9+nOZOExgdwaQkM8J6uq0HmA7nzpOf/NcZI2W2JOkEDlGGjSGLIg6eZI04X1FJE6ruoQmXcrdE4rFHGlaFeKmXUBLsZJo4rKucKZrAvyDOBUmrXQM2EsCV9hrmcaFQOKj7KsCo7JJv8CN1tqwrKidVJq80s3CVPTmBjDmABpCo5bNd1EVHmyYYx9ZY2PSFykXf53WO14W9A6qOBBepGH7aSEr/McvZ/VRRFU8ZX44G2h1ZeI65lgjf5Yo9AKDTGwbsdHmzDzcQB2v5/iT7007eDFz1mn11W9jvyxe9np9S4v+/1eL03TFJoEPEmq/eeVMTKatCxEtH+yew7D1qZylqFDBYGDlfY6grT1rw3hHN3TmrWhy95RRGbn199F60KYuszQHYTrBhGU6EmW1edrCIclu9qtOUz+Ir3od9LLTrc37qaDlP/+hCildn/etRzukJvsdRgP4yDEKL2tEntpeiy+kQmCFtujQOxPtq8oOHTOus8DMxRPxi23Ya2ghSRh87x27vl+fit1gao9PTWucKuOM6ZeIUldfIGyhkppfpSF2K4RMrM17ZM4GVbVyKEN0oN194FSW1MIzUfLScUdCywWyQsOgvTT9OkB84atjkg9caLcGlnTwjr9FyrREcP3I3GPa7HTzwux3wKxPxwT+9a6TCuFRnTEyPh6NtO5RkOiQldq78M154Xdb4Hd3jG71zYLF5eZrY16OX6/BR77p35Tg2G80rXtzQuZ/3symwRKpIXlxrCyPiDPbdwAzpc2O99o1ZwHTkOn6Fax+Zvs28YPzGAk6WnzuEt6QVS1rR2Ps2AEyfbhbXsPvf5jHK57rIybfYf2pq3kREMVm5qGu8+ZDRbbModz/nXYt8V8F4AEOPmIWPcsPQs3cC65lEGKW5+hnxGS9fsc6M1ezf9t7x+RJXyk86qQ2nAltSs4w0heuClDAoNwWY78TRJg6Hhys8mkx1tXNA2//lijW0dWV9JpmTGIdxtQ2vPzvjP+RzS+u9lesr4Xn+rvTya+fRn705Usah5BAve4jl8XmkmTwAKlQhfSihOvY/DOmJfvFx4dMk3SrhjmOVb0SdvJk93w/t2HMct0+5mgDHsRnHxgROVDTNJW8SMLf0fgdxsopJnXcs620SeLWh7uiWd7IFR1EobNJlqM7T2aptmhQjxmYJrmbwCYavY= sidebar_class_name: "post api-method" info_path: gen/api/agent-management-api custom_edit_url: null @@ -109,7 +109,7 @@ Create a new job using the same operation data as an existing job. The original required={false} schemaName={"string"} qualifierMessage={undefined} - schema={{"type":"string","description":"Override target hostname for the retried job. Defaults to _any if not specified.","example":"_any","x-oapi-codegen-extra-tags":{"validate":"omitempty,min=1"}}} + schema={{"type":"string","description":"Override target hostname for the retried job. Defaults to _any if not specified.","example":"_any","x-oapi-codegen-extra-tags":{"validate":"omitempty,min=1,valid_target"}}} >