{"id":13819707,"url":"https://github.com/orange-cloudfoundry/statusetat","last_synced_at":"2026-01-16T18:26:02.724Z","repository":{"id":37079354,"uuid":"276924045","full_name":"orange-cloudfoundry/statusetat","owner":"orange-cloudfoundry","description":"status page with very HA in mind and notifier","archived":false,"fork":false,"pushed_at":"2026-01-12T21:11:48.000Z","size":29156,"stargazers_count":20,"open_issues_count":3,"forks_count":6,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-13T01:44:34.351Z","etag":null,"topics":["high-availability","notifications","status-page"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orange-cloudfoundry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-07-03T14:52:11.000Z","updated_at":"2026-01-12T21:11:43.000Z","dependencies_parsed_at":"2023-02-18T09:16:10.157Z","dependency_job_id":"b78ba63a-3264-4bbd-83d4-0591717d7844","html_url":"https://github.com/orange-cloudfoundry/statusetat","commit_stats":{"total_commits":813,"total_committers":13,"mean_commits":62.53846153846154,"dds":"0.12915129151291516","last_synced_commit":"a8dfc42354c9ada07e0c724ce4928282387b5625"},"previous_names":[],"tags_count":879,"template":false,"template_full_name":null,"purl":"pkg:github/orange-cloudfoundry/statusetat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fstatusetat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fstatusetat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fstatusetat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fstatusetat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orange-cloudfoundry","download_url":"https://codeload.github.com/orange-cloudfoundry/statusetat/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fstatusetat/sbom","scorecard":{"id":711495,"data":{"date":"2025-08-11","repo":{"name":"github.com/orange-cloudfoundry/statusetat","commit":"1de68ee8e82c5f6248783cf427f131d03dba3eae"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Code-Review","score":3,"reason":"Found 2/6 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"21 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/after-merge-dependabot.yml:1","Warn: no topLevel permission defined: .github/workflows/auto-accept-dependabot.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/golangci-lint.yml:10","Warn: no topLevel permission defined: .github/workflows/goreleaser.yml:1","Warn: no topLevel permission defined: .github/workflows/unit-tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2.9.3 not signed: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/239225151","Warn: release artifact v2.9.2 not signed: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/239224452","Warn: release artifact v2.9.1 not signed: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/237513311","Warn: release artifact v2.9.0 not signed: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/237513016","Warn: release artifact v2.8.1 not signed: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/235773275","Warn: release artifact v2.9.3 does not have provenance: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/239225151","Warn: release artifact v2.9.2 does not have provenance: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/239224452","Warn: release artifact v2.9.1 does not have provenance: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/237513311","Warn: release artifact v2.9.0 does not have provenance: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/237513016","Warn: release artifact v2.8.1 does not have provenance: https://api.github.com/repos/orange-cloudfoundry/statusetat/releases/235773275"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/goreleaser.yml:14"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":7,"reason":"SAST tool is not run on all commits -- score normalized to 7","details":["Warn: 20 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0635","Warn: Project is vulnerable to: GO-2022-0646"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/after-merge-dependabot.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/after-merge-dependabot.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/after-merge-dependabot.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/after-merge-dependabot.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/after-merge-dependabot.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/after-merge-dependabot.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/after-merge-dependabot.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/after-merge-dependabot.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/auto-accept-dependabot.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/auto-accept-dependabot.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-accept-dependabot.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/auto-accept-dependabot.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/golangci-lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/golangci-lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/goreleaser.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/goreleaser.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/goreleaser.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/goreleaser.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/goreleaser.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/goreleaser.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/goreleaser.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/goreleaser.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-tests.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/unit-tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-tests.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/unit-tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-tests.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/orange-cloudfoundry/statusetat/unit-tests.yml/master?enable=pin","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-22T08:18:56.425Z","repository_id":37079354,"created_at":"2025-08-22T08:18:56.425Z","updated_at":"2025-08-22T08:18:56.425Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28480749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["high-availability","notifications","status-page"],"created_at":"2024-08-04T08:00:51.955Z","updated_at":"2026-01-16T18:26:02.700Z","avatar_url":"https://github.com/orange-cloudfoundry.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Statusetat [![ginkgo test badge](https://github.com/orange-cloudfoundry/statusetat/workflows/ginkgo-test/badge.svg)](https://github.com/orange-cloudfoundry/statusetat/actions?query=workflow%3Aginkgo-test)\n\nstatus page with very HA in mind and notification system to send information about incident(s) or scheduled task(s) \nto external system like slack, email or whatever plugin you implement.\n\n[![home one incident and maintenance](/screenshots/home_one_incident_and_maintenance.png)](/screenshots/home_one_incident_and_maintenance.png)\n\nFeatures:\n- Easy admin web interface to manage incidents and scheduled tasks\n- Send notifications to external system (slack, email, plugins...) when incident come\n- Full rest api to create/read/update/delete incident/scheduled tasks\n- Subscribes systems\n\n## Why another status page ?\n\nA status page **must** be more resilient than the service you want to be monitored because you need to have the page \nalways available even when your a part of your infra is partially down to give the information to your client.\n\nWhen you're a hosting service be more resilient on your status page become complicated. \nThis implementation allow you to set multiple storage system in same time to ensure you always can store/retrieve incidents and \nscheduled tasks.\n\nStatusetat will replicate in all storage what you write and ensure that the data can be retrieved.\n\n## Getting started\n\n1. Download latest release for your system\n2. Create a `config.yml` file with this content for a dev deployment\n\n```yaml\nlisten: 0.0.0.0:8080 # this will listen in http on port 8080\ntargets:\n  - sqlite://./store.db\nlog:\n  level: debug\ncomponents:\n  - name: my-service\n    description: description of my service\n    group: ~\nnotifiers:\n- type: slack\n  params:\n    endpoint: http://my-mattermost.com/hooks/aj6na7hz5ib1mfs3eggc1bu8tk\n- type: plugin\n  params:\n    path: /path/to/my/plugin.so\nusername: admin\npassword: admin\ncookie_key: encryption-key-for-cookies\nbase_info:\n  base_url: http://localhost:8080\n  support: https://doc.to.my.service.com\n  contact: http://my-mattermost.com/channel/town\n  time_zone: UTC\n```\n\n## Configuration\n\nFor understanding config definition format:\n- `[]` means optional (by default parameter is required)\n- `\u003c\u003e` means type to use\n\n### Root configuration in config.yml\n\n\n```yaml\n# Listen address for listening in http\n# If empty and env var `PORT` set default listen will 0.0.0.0:${PORT}\n[ listen: \u003cstring\u003e | default = 0.0.0.0:8080 ]\n\n# If config tls not set no https will be enabled\n# only set tls if you want https on statusetat\ntls:\n  # Path to cert file\n  [ cert_file: \u003cstring\u003e ]\n  # Path to key file\n  [ key_file: \u003cstring\u003e ]\n\nlog:\n  # log level to use for server\n  # you can chose: `trace`, `debug`, `info`, `warn`, `error`, `fatal` or `panic`\n  [ level: \u003cstring\u003e | default = info ]\n  # Set to true to force not have color when seeing logs\n  [ no_color: \u003cbool\u003e ]\n  # et to true to see logs as json format\n  [ in_json: \u003cbool\u003e ]\n# username for basic authentication to access admin page or api\nusername: \u003cstring\u003e\n# password for basic authentication to access admin page or api\npassword: \u003cstring\u003e\n# cookie key for cookie encryption (generate a random value and set it here)\ncookie_key: \u003cstring\u003e\nbase_info:\n  # Url of your statusetat for forging urls on notifications\n  base_url: \u003cstring\u003e\n  # Title of your status page\n  [ title: \u003cstring\u003e | default = \"Statusetat\" ]\n  # Url for your user to know where they can found support/doc page\n  [ support: \u003cstring\u003e ]\n  # Url for your user to know where they can contact you\n  [ contact: \u003cbool\u003e ]\n  # Default timezone when creating/updating/show incident(s)\n  [ timezone: \u003cstring\u003e | default = \"UTC\" ]\n# customize web page\ntheme:\n  # Markdown content to show before status boxes\n  [ pre_status: \u003cstring\u003e ]\n  # Markdown content to show after status boxes\n  [ post_status: \u003cstring\u003e ]\n  # Markdown content to show before timeline\n  [ pre_timeline: \u003cstring\u003e ]\n  # Markdown content to show after timeline\n  [ post_timeline: \u003cstring\u003e ]\n  # Markdown content to show before maintenance/scheduled tasks box\n  [ pre_maintenance: \u003cstring\u003e ]\n  # Markdown content to show after maintenance/scheduled tasks box\n  [ post_maintenance: \u003cstring\u003e ]\n  # Markdown content to put in footer\n  [ footer: \u003cstring\u003e ]\n  # Persistent name to display, default to Persistent Incident but you could set Known Issues for example\n  [ persistent_display_name: \u003cstring | default = \"Persistent Incident\"\u003e ]\n  # Markdown content to show before persistent incident tasks box\n  [ pre_persistent: \u003cstring\u003e ]\n  # Markdown content to show after persistent incident tasks box\n  [ post_persistent: \u003cstring\u003e ]\n# list of targets store to use, this can be in form of:\n# mysql://user:password@host:3306?options\n# mariadb://user:password@host:3306?options\n# postgres://user:password@host:3306?options\n# sqlite://:memory:\n# sqlite:///a/path\n# s3://access_key_id:access_key_secret@host.com/bucket?region=us-east-1\u0026insecure-skip-verify=false\n# file:///a/path/to/a/folder\ntargets:\n- \u003curi\u003e\nnotifiers:\n[ - \u003cnotifier\u003e ]\n```\n\n### notifiers configuration\n\n```yaml\n# type of notifier to use, you can found them in notifiers section of this doc\ntype: \u003cstring\u003e\n# only trigger for particular component(s)\n[ for: \u003cfor_component\u003e ]\n# map of params for the notifier you use\nparams:\n  [ \u003cstring\u003e: \u003cany\u003e ]\n```\n\n### for_component configurations\n\n```yaml\n# Set to true to mandatory match all filter\n# Think that you want to use an AND condition on true and OR condition on false\n[require_all: \u003cbool\u003e | default = false ]\n# Group which match component(s)\ngroups:\n[ - \u003cstring\u003e ]\n# Names which match component(s)\nnames:\n[ - \u003cstring\u003e ]\n```\n\n## Notifiers\n\n### Slack\n\nNotify on a slack channel or mattermost channel new incidents or scheduled tasks.\n\n- **Type name**: `slack`\n- **Params**:\n\n```yaml\n# incoming endpoint url\nendpoint: \u003cstring\u003e\n# Specify channel to send notif\n[ channel: \u003cstring\u003e ]\n# Specify username to show on message\n[ channel: \u003cstring\u003e ]\n# Specify icon emoji incident to show on message\n[ icon_emoji_incident: \u003cstring\u003e | default = \"bell\" ]\n# Specify icon emoji scheduled tasks to show when planified\n[ icon_emoji_scheduled: \u003cstring\u003e | default = \"clock1\" ]\n# Specify icon emoji scheduled tasks to show when started\n[ icon_emoji_scheduled_started: \u003cstring\u003e | default = \"clock1\" ]\n# Specify icon emoji scheduled tasks to show when finished\n[ icon_emoji_scheduled_finish: \u003cstring\u003e | default = \"clock1\" ]\n# skip ssl verification when sending notification\n[ insecure_skip_verify: \u003cbool\u003e ]\n```\n\n### Grafana annotation\n\nPut a grafana annotation when incident start and when it's finished on a graph.\n\n- **Type name**: `grafana_annotation`\n- **Params**:\n\n```yaml\n# Grafana api endpoint\nendpoint: \u003cstring\u003e\n# Grafana api key to use\napi_key: \u003cstring\u003e\n# Dashboard id to set annotation\ndashboard_id: \u003cstring\u003e\n# Panel id in dashboard to set annotation\npanel_id: \u003cstring\u003e\n# tag used in grafana to filter global annotations\n[ tag: \u003cstring\u003e ]\n# time zone to use when sending annotation\n[ time_zone: \u003cstring\u003e ]\n# skip ssl verification when sending notification\n[ insecure_skip_verify: \u003cbool\u003e ]\n# organization id to use when sending annotation\n[ org_id: \u003cint\u003e ]\n```\n\n### Email\n\nSend incidents and scheduled tasks to subscribers via subscribe api and/or emails in notifier param.\n**Type name**: `email`\n**Params**:\n\n```yaml\n# Email server host\nhost: \u003cstring\u003e\n# Email server port\n[ port: \u003cint\u003e | default = 25 ]\n# Username to use when connect to email server\n[ username: \u003cstring\u003e ]\n# Password to use when connect to email server\n[ password: \u003cstring\u003e ]\n# Set to true to use ssl/tls when connect to email server\n[ use_ssl: \u003cbool\u003e ]\n# Email to insert in from field\n[ From: \u003cstring\u003e | default = \"no-reply@local\" ]\n# List of emails address to send email, e.g.: admins of the monitored service\nsubscribers:\n[ - \u003cstring\u003e ]\n# Go template to use to write subject for incident\n[ subject_incident: \u003cstring\u003e | default = \"[{{ .TitleSite }} {{ .Incident.State | textIncidentState | title }} Incident] {{ .IncidentTitle | title }}\" ]\n# Go template to use to write subject for scheduled tasks\n[ subject_scheduled: \u003cstring\u003e | default = \"[{{ .TitleSite }} Scheduled task] {{ .IncidentTitle | title }}\" ]\n# Go template to use to write content of email when get an incident\n[ txt_incident: \u003cstring | default = \"see https://github.com/orange-cloudfoundry/statusetat/blob/master/notifiers/email/email.go#L26-L38\"]\n# Go template to use to write content of email when get an scheduled task\n[ txt_incident: \u003cstring | default = \"see https://github.com/orange-cloudfoundry/statusetat/blob/master/notifiers/email/email.go#L39-L51\"]\n# skip ssl verification when sending notification\n[ insecure_skip_verify: \u003cbool\u003e ]\n```\n\nFor customize content of email you can see data passed to template at https://github.com/orange-cloudfoundry/statusetat/blob/master/notifiers/email/email.go#L223-L236 \nand template function available at https://github.com/orange-cloudfoundry/statusetat/blob/master/extemplate/template.go#L25-L51\n\n## Plugin\n\nYou can create a plugin for notification for your own need.\n\nPlugin are grpc golang plugin which doc can be found here: https://github.com/hashicorp/go-plugin .\n\nYou must implement [plugin.Notifier](/notifiers/plugin/interface.go).\n\nExample of implementation:\n\n```go\npackage main\n\nimport (\n\tpluginhc \"github.com/hashicorp/go-plugin\"\n\t\"github.com/orange-cloudfoundry/statusetat/config\"\n\t\"github.com/orange-cloudfoundry/statusetat/models\"\n\t\"github.com/orange-cloudfoundry/statusetat/notifiers/plugin\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"strings\"\n)\n\ntype LogNotifier struct {\n}\n\nfunc (n LogNotifier) PreCheck(incident *models.Incident) error {\n\treturn nil\n}\n\nfunc (n *LogNotifier) Init(baseInfo config.BaseInfo, params map[string]interface{}) error {\n\treturn nil\n}\n\nfunc (n LogNotifier) Name() (string, error) {\n\treturn \"log_notifier\", nil\n}\n\nfunc (n LogNotifier) Id() (string, error) {\n\treturn \"log_notifier1\", nil\n}\n\nfunc (n LogNotifier) MetadataFields() ([]models.MetadataField, error) {\n\treturn []models.MetadataField{}, nil\n}\n\nfunc (n LogNotifier) Notify(notifyReq *models.NotifyRequest) error {\n\tlog.\n\t\tWithField(\"subscribers\", strings.Join(notifyReq.Subscribers, \", \")).\n\t\tWithField(\"triggerred_by_user\", notifyReq.TriggerByUser).\n\t\tInfo(notifyReq.Incident)\n\treturn nil\n}\n\nfunc main() {\n\tpluginhc.Serve(\u0026pluginhc.ServeConfig{\n\t\tHandshakeConfig: plugin.Handshake,\n\t\tPlugins: map[string]pluginhc.Plugin{\n\t\t\t\"notifier\": \u0026plugin.NotifierGRPCPlugin{\n\t\t\t\tImpl: \u0026LogNotifier{},\n\t\t\t},\n\t\t},\n\n\t\t// A non-nil value here enables gRPC serving for this plugin...\n\t\tGRPCServer: pluginhc.DefaultGRPCServer,\n\t})\n}\n```\n\nYou can build it with command line `go build -o log-notif .`\n\nYou can now use it in your config with:\n\n- **Type name**: `plugin` or notifier name you have set in func signature `Name() string`\n- **Params**:\n```yaml\n# path to .so to load\n# in our example it would be `./log-notif`\npath: \u003cstring\u003e\n# all remaining arguments will be pass at Init\n```\n\n\n## Api \n\nTo document\n\n## Credits\n\nThis project was heavily inspired by [statusfy](https://github.com/juliomrqz/statusfy) mostly on the design part and \nmodels of incidents/components.\n\n[Cachethq](https://cachethq.io/) is another source of inspiration for some details on the admin design part.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forange-cloudfoundry%2Fstatusetat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forange-cloudfoundry%2Fstatusetat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forange-cloudfoundry%2Fstatusetat/lists"}