diff --git a/.editorconfig b/.editorconfig new file mode 100755 index 0000000..7a12570 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +ident_size = 4 + +[*.md] +ident_size = 2 +trim_trailing_whitespace = false + +[*.json] +ident_size = 2 + +[{.gitignore,.gitkeep,.editorconfig}] +ident_size = 2 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..3fbad49 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# Require maintainer's :+1: for changes to the .github/ repo-config files +# mainly due to https://github.com/probot/settings privilege escalation +.github/* @frenck +.gitlab-ci.yml @frenck diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000..544da8f --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +# Problem/Motivation + +> (Why the issue was filed) + +## Expected behavior + +> (What you expected to happen) + +## Actual behavior + +> (What actually happened) + +## Steps to reproduce + +> (How can someone else make/see it happen) + +## Proposed changes + +> (If you have a proposed change, workaround or fix, +> describe the rationale behind it) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000..cbd529a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +# Proposed Changes + +> (Describe the changes and rationale behind them) + +## Related Issues + +> ([Github link][autolink-references] to related issues or pull requests) + +[autolink-references]: https://help.github.com/articles/autolinked-references-and-urls/ \ No newline at end of file diff --git a/.github/autolabeler.yml b/.github/autolabeler.yml new file mode 100644 index 0000000..3ce5703 --- /dev/null +++ b/.github/autolabeler.yml @@ -0,0 +1,2 @@ +--- +"Type: Documentation": ["*.md", "*.j2"] diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 0000000..71d2f6d --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,50 @@ +--- +# Configuration for request-info - https://github.com/behaviorbot/request-info + +# *OPTIONAL* Comment to reply with +# Can be either a string : +requestInfoReplyComment: + - "We would appreciate it if you could provide us with more info about this issue/pr!" + - "Hmmm... That issue/PR is kinda low on text. Could you please provide some more content?" + +# *OPTIONAL* default titles to check against for lack of descriptiveness +# MUST BE ALL LOWERCASE +requestInfoDefaultTitles: [] + +# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given +requestInfoLabelToAdd: "Incomplete" + +# *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template +# Will fail if the pull request's body is equal to the provided template +checkPullRequestTemplate: true + +# *OPTIONAL* Only warn about insufficient information on these events type +# Keys must be lowercase. Valid values are 'issue' and 'pullRequest' +requestInfoOn: + pullRequest: true + issue: true + +# *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on +# keys must be GitHub usernames +requestInfoUserstoExclude: [] + +# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome + +# Comment to be posted to on first time issues +newIssueWelcomeComment: > + :wave: Thanks for opening your first issue here! + If you're reporting a :bug: bug, please make sure you include steps to reproduce it. + Also, logs, error messages and information about your hardware might be usefull. + +# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome + +# Comment to be posted to on PRs from first time contributors in your repository +newPRWelcomeComment: > + :sparkling_heart: Thanks for opening this pull request! :sparkling_heart: + If your PR gets accepted and merged in, we will invite you to the project :tada: + +# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge + +# Comment to be posted to on pull requests merged by a first time user +firstPRMergeComment: > + Congrats on merging your first pull request! :tada::tada::tada: diff --git a/.github/invite-contributors.yml b/.github/invite-contributors.yml new file mode 100644 index 0000000..25eb31a --- /dev/null +++ b/.github/invite-contributors.yml @@ -0,0 +1,10 @@ +--- +# If true, this will add new contributors as outside collaborators +# to the repo their PR was merged in. Team name is ignored if this +# flag is set to true. +isOutside: false + +# Specify team name to add new contributors to a specific team +# within your organization. +# Use team name or team-name-slug +team: Contributors diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 0000000..4b1e816 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,20 @@ +--- +# Configuration for lock-threads - https://github.com/dessant/lock-threads +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 30 + +# Comment to post before locking. Set to `false` to disable +lockComment: > + This thread has been automatically locked because it has not had recent + activity. Please open a new issue for related bugs and link to relevant + comments in this thread. + +# Issues or pull requests with these labels will not be locked +# exemptLabels: +# - no-locking + +# Limit to only `issues` or `pulls` +# only: issues + +# Add a label when locking. Set to `false` to disable +lockLabel: false diff --git a/.github/move.yml b/.github/move.yml new file mode 100644 index 0000000..0c2276a --- /dev/null +++ b/.github/move.yml @@ -0,0 +1,20 @@ +--- +# Delete the command comment when it contains no other content +deleteCommand: true + +# Close the source issue after moving +closeSourceIssue: true + +# Lock the source issue after moving +lockSourceIssue: true + +# Mention issue and comment authors +mentionAuthors: true + +# Preserve mentions in the issue content +keepContentMentions: false + +# Set custom aliases for targets +# aliases: +# r: repo +# or: owner/repo diff --git a/.github/no-response.yml b/.github/no-response.yml new file mode 100644 index 0000000..bb9f0f2 --- /dev/null +++ b/.github/no-response.yml @@ -0,0 +1,13 @@ +--- +# Configuration for probot-no-response - https://github.com/probot/no-response +# Number of days of inactivity before an Issue is closed for lack of response +daysUntilClose: 14 +# Label requiring a response +responseRequiredLabel: "Status: Awaiting response" +# Comment to post when closing an Issue for lack of response. Set to `false` to disable +closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. Please reach out if you have or find the answers we need so + that we can investigate further. diff --git a/.github/potential-duplicates.yml b/.github/potential-duplicates.yml new file mode 100644 index 0000000..00c7c0f --- /dev/null +++ b/.github/potential-duplicates.yml @@ -0,0 +1,14 @@ +--- +# Label name and color to set, when potential duplicates are detected +issueLabel: "Potential duplicate" +labelColor: e6e6e6 + +# If similarity is higher than this threshold, issue will be marked as duplicate +threshold: 0.70 + +# Comment to post when potential duplicates are detected +referenceComment: > + Potential duplicates found: + {{#issues}} + - [#{{ number }}] {{ title }} ({{ accuracy }}%) + {{/issues}} diff --git a/.github/settings.yml b/.github/settings.yml new file mode 100644 index 0000000..41b63b1 --- /dev/null +++ b/.github/settings.yml @@ -0,0 +1,150 @@ +--- +repository: + description: "Glances - Community Hass.io Add-on for Home Assistant" + homepage: https://addons.community + topics: glances, monitoring, system, hassio-addons, hassio, hass, home-assistant, homeassistant + private: false + has_issues: true + has_projects: false + has_wiki: false + has_downloads: false + default_branch: master + allow_squash_merge: true + allow_merge_commit: false + allow_rebase_merge: true +labels: + # Priority labels + - name: "Priority: Critical" + color: ee0701 + description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." + - name: "Priority: High" + color: b60205 + description: "After critical issues are fixed, these should be dealt with before any further issues." + - name: "Priority: Medium" + color: 0e8a16 + description: "This issue may be useful, and needs some attention." + - name: "Priority: Low" + color: e4ea8a + description: "Nice addition, maybe... someday..." + + # Type labels + - name: "Type: Bug" + color: ee0701 + description: "Inconsistencies or issues which will cause a problem for users or implementors." + - name: "Type: Documentation" + color: 0052cc + description: "Solely about the documentation of the project." + - name: "Type: Enhancement" + color: 1d76db + description: "Enhancement of the code, not introducing new features." + - name: "Type: Feature" + color: 0e8a16 + description: "New features or options." + - name: "Type: Support" + color: 5319e7 + description: "Marks an issue as an support ticket." + - name: "Type: Discussion" + color: d4c5f9 + description: "Marks an issue as an generic discussion ticket." + - name: "Type: Maintaince" + color: 2af79e + description: "Generic maintaince tasks, e.g., package updates." + + # Additional markers + - name: "Security" + color: ee0701 + description: "Marks an security issues that needs to be resolved asap." + - name: "Idea" + color: fef2c0 + description: "Marks an idea, which might be excepted and implemented." + - name: "Incomplete" + color: fef2c0 + description: "Marks an PR or issue that is missing information." + - name: "Pull request" + color: fbca04 + description: "There is an PR opened for this issue." + - name: "Accepted" + color: c2e0c6 + description: "This issue or PR has been accepted." + - name: "Declined" + color: f9d0c4 + description: "This issue or PR has been declined." + - name: "Potential duplicate" + color: e6e6e6 + description: "This issue has been automatically marked as a potential duplicate." + + # Ongoing Status labels + - name: "Status: Triage" + color: fbca04 + description: "This issue needs to be triaged." + - name: "Status: On hold" + color: cccccc + description: "Issue or PR that has been placed on hold for now." + - name: "Status: In progress" + color: fbca04 + description: "Issue is currently being resolved by a developer." + - name: "Status: Stale" + color: fef2c0 + description: "There has not been activity on this issue or PR for quite some time." + - name: "Status: Awaiting response" + color: fef2c0 + description: "Issue or PR awaits response from the creator." + - name: "Status: Blocked" + color: fef2c0 + description: "Progress on this issue is currently not possible." + + # Closing status labels + - name: "Closed: Known limitation" + color: e6e6e6 + description: "Issue is closed, it is a known limitation." + - name: "Closed: Expected behavior" + color: e6e6e6 + description: "Issues is closed, it is expected behavior." + - name: "Closed: Duplicate" + color: e6e6e6 + description: "Issue is closed, duplicate of an existing issue." + - name: "Closed: Invalid" + color: e6e6e6 + description: "Issue is closed, marked as not a valid issue (e.g., an user error)." + - name: "Closed: Wrong repository" + color: e6e6e6 + description: "Issue is closed, was created in the wrong repository." + - name: "Closed: Won't Fix" + color: e6e6e6 + description: "Issue is closed, it won't be fixed." + - name: "Closed: Done" + color: c2e0c6 + description: "Issue closed, work on this issue has been marked complete." + + # Others + - name: "Beginner Friendly" + color: 0e8a16 + description: "Good first issue for people wanting to contribute to the project." + - name: "Help wanted" + color: 0e8a16 + description: "We need some extra helping hands or expertise in order to resolve this." + - name: "Hacktoberfest" + description: "Issues/PRs are participating in the Hacktoberfest" + color: fbca04 + +branches: + - name: master + protection: + required_pull_request_reviews: + # required_approving_review_count: 1 + dismiss_stale_reviews: true + require_code_owner_reviews: true + dismissal_restrictions: + users: [] + teams: + - Admins + - Masters + required_status_checks: + strict: false + contexts: [] + enforce_admins: false + restrictions: + users: [] + teams: + - Admins + - Masters diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..36938bb --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,61 @@ +--- +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale Issue or Pull Request is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - "Status: On hold" + - "Status: In progress" + - "Status: Awaiting response" + - "Status: Blocked" + - "Idea" + - "Security" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Label to use when marking as stale +staleLabel: "Status: Stale" + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. +unmarkComment: false + +# Comment to post when closing a stale Issue or Pull Request. +# closeComment: > +# Your comment here. +closeComment: false + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request has been automatically marked as stale because it has not had +# recent activity. It will be closed if no further activity occurs. Thank you +# for your contributions. + +# issues: +# exemptLabels: +# - confirmed diff --git a/.github/support.yml b/.github/support.yml new file mode 100644 index 0000000..27e688f --- /dev/null +++ b/.github/support.yml @@ -0,0 +1,22 @@ +--- +# Configuration for support-requests - https://github.com/dessant/support-requests + +# Label used to mark issues as support requests +supportLabel: "Type: Support" + +# Comment to post on issues marked as support requests. Add a link +# to a support page, or set to `false` to disable +supportComment: > + :wave: We use the issue tracker exclusively for bug reports and feature requests. + However, this issue appears to be a support request. Please use our + support channels to get help with the project. + + Head over to the + [Home Assistant community forum](https://community.home-assistant.io/?u=frenck) + or join our [Discord](https://discord.me/hassioaddons) chat. + +# Close issues marked as support requests +close: true + +# Lock issues marked as support requests +lock: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..e9b4c52 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,14 @@ +--- +include: https://raw.githubusercontent.com/hassio-addons/organization/master/gitlabci/addon.yml + +variables: + ADDON_GITHUB_REPO: "hassio-addons/addon-glances" + ADDON_SLUG: "glances" + ADDON_TARGET: "glances" + + ADDON_ARMV7: "false" + + ADDON_AARCH64_BASE: "hassioaddons/base-aarch64:2.3.1" + ADDON_AMD64_BASE: "hassioaddons/base-amd64:2.3.1" + ADDON_ARMHF_BASE: "hassioaddons/base-armhf:2.3.1" + ADDON_I386_BASE: "hassioaddons/base-i386:2.3.1" diff --git a/.mdlrc b/.mdlrc new file mode 100644 index 0000000..2b0128d --- /dev/null +++ b/.mdlrc @@ -0,0 +1 @@ +rules "~MD024" \ No newline at end of file diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..f4bc5a4 --- /dev/null +++ b/.yamllint @@ -0,0 +1,66 @@ +--- +rules: + braces: + level: error + min-spaces-inside: 0 + max-spaces-inside: 1 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + level: error + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + level: error + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: error + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + level: error + require-starting-space: true + min-spaces-from-content: 2 + comments-indentation: + level: error + document-end: + level: error + present: false + document-start: + level: error + present: true + empty-lines: + level: error + max: 1 + max-start: 0 + max-end: 1 + hyphens: + level: error + max-spaces-after: 1 + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: false + key-duplicates: + level: error + line-length: + ignore: | + .github/support.yml + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: + level: error + new-lines: + level: error + type: unix + trailing-spaces: + level: error + truthy: + level: error diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..0ac232b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Code of conduct + +## Our pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention + or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or + electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate + in a professional setting + +## Our responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project lead at frenck@addons.community. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project lead is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ef4aac1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish +to make via issue, email, or any other method with the owners of this repository +before making a change. + +Please note we have a code of conduct, please follow it in all your interactions +with the project. + +## Issues and feature requests + +You've found a bug in the source code, a mistake in the documentation or maybe +you'd like a new feature? You can help us by submitting an issue to our +[GitHub Repository][github]. Before you create an issue, make sure you search +the archive, maybe your question was already answered. + +Even better: You could submit a pull request with a fix / new feature! + +## Pull request process + +1. Search our repository for open or closed [pull requests][prs] that relates + to your submission. You don't want to duplicate effort. + +1. You may merge the pull request in once you have the sign-off of two other + developers, or if you do not have permission to do that, you may request + the second reviewer to merge it for you. + +[github]: https://github.com/hassio-addons/addon-glances/issues +[prs]: https://github.com/hassio-addons/addon-glances/pulls diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..05c00f7 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2019 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2d07d38 --- /dev/null +++ b/README.md @@ -0,0 +1,285 @@ +# Community Hass.io Add-ons: Glances + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +[![GitLab CI][gitlabci-shield]][gitlabci] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +[![Support my work on Patreon][patreon-shield]][patreon] + +Glances is a cross-platform system monitoring tool written in Python. + +![The Glances Hass.io add-on](images/screenshot.png) + +## About + +Glances is a cross-platform monitoring tool which aims to present a maximum of +information in a minimum of space through a Web-based interface. + +Glances can export all system statistics to InfluxDB, allowing you to look +at all your system information and its behavior over time. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add our Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install the "Glances" add-on. +1. Disable "Protection mode" in the add-on panel. +1. Start the "Glances" add-on. +1. Check the logs of the "Glances" to see if everything went well. +1. Click the "OPEN WEB UI" button take a glance at Glances. + +**NOTE**: Do not add this repository to Hass.io, please use: +`https://github.com/hassio-addons/repository`. + +## Docker status + +![Supports armhf Architecture][armhf-shield] +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports i386 Architecture][i386-shield] + +[![Docker Layers][layers-shield]][microbadger] +[![Docker Pulls][pulls-shield]][dockerhub] + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "log_level": "info", + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "influxdb": { + "enabled": false, + "host": "a0d7b954-influxdb", + "port": 8086, + "username": "glances", + "password": "!secret glances_influxdb_password", + "database": "glances", + "interval": 60 + } +} +``` + +**Note**: _This is just an example, don't copy and paste it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `ssl` + +Enables/Disables SSL (HTTPS) on the Glances Web UI. Set it `true` to enable it, +`false` otherwise. + +### Option: `certfile` + +The certificate file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is default for Hass.io_ + +### Option: `keyfile` + +The private key file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is default for Hass.io_ + +### Option group `influxdb` + +--- + +The following options are for the option group: `influxdb`. These settings +only apply to the Glances InfluxDB data export. + +#### Option `influxdb`: `enabled` + +Enables/Disables the Glances data export to InfluxDB. + +#### Option `influxdb`: `host` + +The hostname where InfluxDB is running. + +**Note**: _If you are using the Community InfluxDB add-on, +use `a0d7b954-influxdb` as the hostname._ + +#### Option `influxdb`: `port` + +The port on which InfluxDB is listening. + +#### Option `influxdb`: `username` + +The username that you have created for Glances to authenticate against +InfluxDB. + +#### Option `influxdb`: `password` + +The password for the above username option. + +#### Option `influxdb`: `database` + +The name of the database to store all Glances information into. + +**Note**: _It is strongly recommended to create a separate database for glances +and not store this in the same database name as Home Assistant._ + +#### Option `influxdb`: `interval` + +Defines the interval (in seconds) on how often Glances exports data to InfluxDB. + +## Embedding into Home Assistant + +It is possible to embed Glances directly into Home Assistant, allowing +you to access Glances through the Home Assistant frontend. + +Home Assistant provides the `panel_iframe` component, for these purposes. + +Example configuration: + +```yaml +panel_iframe: + glances: + title: Glances + icon: mdi:speedometer + url: http://hassio.local:61208 +``` + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. The format of the log is based on +[Keep a Changelog][keepchangelog]. + +Releases are based on [Semantic Versioning][semver], and use the format +of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented +based on the following: + +- ``MAJOR``: Incompatible or major changes. +- ``MINOR``: Backwards-compatible new features and enhancements. +- ``PATCH``: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Community Hass.io Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Contributing + +This is an active open-source project. We are always open to people who want to +use the code or contribute to it. + +We have set up a separate document containing our +[contribution guidelines](CONTRIBUTING.md). + +Thank you for being involved! :heart_eyes: + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## We have got some Hass.io add-ons for you + +Want some more functionality to your Hass.io Home Assistant instance? + +We have created multiple add-ons for Hass.io. For a full list, check out +our [GitHub Repository][repository]. + +## License + +MIT License + +Copyright (c) 2019 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/frenck +[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-glances.svg +[commits]: https://github.com/hassio-addons/addon-glances/commits/master +[contributors]: https://github.com/hassio-addons/addon-glances/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[dockerhub]: https://hub.docker.com/r/hassioaddons/glances +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/t/community-hass-io-add-on-glances/68836?u=frenck +[frenck]: https://github.com/frenck +[gitlabci-shield]: https://gitlab.com/hassio-addons/addon-glances/badges/master/pipeline.svg +[gitlabci]: https://gitlab.com/hassio-addons/addon-glances/pipelines +[home-assistant]: https://home-assistant.io +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[issue]: https://github.com/hassio-addons/addon-glances/issues +[keepchangelog]: http://keepachangelog.com/en/1.0.0/ +[layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/glances.svg +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-glances.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg +[microbadger]: https://microbadger.com/images/hassioaddons/glances +[patreon-shield]: https://www.frenck.nl/images/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/glances.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-glances.svg +[releases]: https://github.com/hassio-addons/addon-glances/releases +[repository]: https://github.com/hassio-addons/repository +[semver]: http://semver.org/spec/v2.0.0.htm diff --git a/glances/.README.j2 b/glances/.README.j2 new file mode 100644 index 0000000..949e6de --- /dev/null +++ b/glances/.README.j2 @@ -0,0 +1,77 @@ +# Community Hass.io Add-ons: Glances + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +[![Support my work on Patreon][patreon-shield]][patreon] + +Glances is a cross-platform system monitoring tool written in Python. + +## About + +Glances is a cross-platform monitoring tool which aims to present a maximum of +information in a minimum of space through a Web-based interface. + +Glances can export all system statistics to InfluxDB, allowing you to look +at all your system information and its behavior over time. + +[Click here for the full documentation][docs] + +![Glances screenshot][screenshot] + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds +add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Hass.io Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/frenck +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[docs]: {{ repo }}/blob/{{ version }}/README.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg +[patreon-shield]: https://www.frenck.nl/images/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} +[screenshot]: https://github.com/hassio-addons/addon-glances/raw/master/images/screenshot.png diff --git a/glances/Dockerfile b/glances/Dockerfile new file mode 100755 index 0000000..d92aa48 --- /dev/null +++ b/glances/Dockerfile @@ -0,0 +1,57 @@ +ARG BUILD_FROM=hassioaddons/base:2.3.1 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Copy Python requirements file +COPY requirements.txt /tmp/ + +# Setup base +RUN \ + apk add --no-cache --virtual .build-dependencies \ + automake=1.16.1-r0 \ + gcc=6.4.0-r9 \ + linux-headers=4.4.6-r2 \ + musl-dev=1.1.19-r10 \ + python3-dev=3.6.6-r0 \ + \ + && apk add --no-cache \ + lua-resty-http=0.12-r1 \ + nginx-mod-http-lua=1.14.2-r0 \ + nginx=1.14.2-r0 \ + py3-bottle=0.12.13-r2 \ + py3-psutil=5.4.6-r0 \ + python3=3.6.6-r0 \ + \ + && pip3 install --no-cache-dir -r /tmp/requirements.txt \ + \ + && apk del --purge .build-dependencies + +# Copy root filesystem +COPY rootfs / + +# Build arguments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="Glances" \ + io.hass.description="Lorem ipsum" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Franck Nijhof " \ + org.label-schema.description="Lorem ipsum" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="Glances" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://community.home-assistant.io/?u=frenck" \ + org.label-schema.usage="https://github.com/hassio-addons/addon-glances/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-glances" \ + org.label-schema.vendor="Community Hass.io Add-ons" diff --git a/glances/build.json b/glances/build.json new file mode 100644 index 0000000..7763a2a --- /dev/null +++ b/glances/build.json @@ -0,0 +1,9 @@ +{ + "build_from": { + "aarch64": "hassioaddons/base-aarch64:2.3.1", + "amd64": "hassioaddons/base-amd64:2.3.1", + "armhf": "hassioaddons/base-armhf:2.3.1", + "i386": "hassioaddons/base-i386:2.3.1" + }, + "args": {} +} diff --git a/glances/config.json b/glances/config.json new file mode 100755 index 0000000..b2e50f1 --- /dev/null +++ b/glances/config.json @@ -0,0 +1,64 @@ +{ + "name": "Glances", + "version": "dev", + "slug": "glances", + "description": "A cross-platform system monitoring tool", + "url": "https://github.com/hassio-addons/addon-glances", + "webui": "[PROTO:ssl]://[HOST]:[PORT:61208]", + "startup": "services", + "arch": [ + "aarch64", + "amd64", + "armhf", + "i386" + ], + "map": [ + "addons", + "backup", + "config:rw", + "share", + "ssl" + ], + "boot": "auto", + "hassio_api": true, + "hassio_role": "default", + "auth_api": true, + "docker_api": true, + "host_network": true, + "host_pid": true, + "apparmor": false, + "options": { + "log_level": "info", + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "influxdb": { + "enabled": false, + "host": "a0d7b954-influxdb", + "port": 8086, + "username": "glances", + "password": "", + "database": "glances", + "interval": 60 + } + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "ssl": "bool", + "certfile": "str", + "keyfile": "str", + "influxdb": { + "enabled": "bool", + "host": "str", + "port": "port", + "username": "str", + "password": "str", + "database": "str", + "interval": "int" + }, + "leave_front_door_open": "bool?" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } +} diff --git a/glances/icon.png b/glances/icon.png new file mode 100644 index 0000000..a4fe9cd Binary files /dev/null and b/glances/icon.png differ diff --git a/glances/logo.png b/glances/logo.png new file mode 100644 index 0000000..3288f59 Binary files /dev/null and b/glances/logo.png differ diff --git a/glances/requirements.txt b/glances/requirements.txt new file mode 100644 index 0000000..15e4415 --- /dev/null +++ b/glances/requirements.txt @@ -0,0 +1,10 @@ +docker==3.7.0 +glances==3.0.2 +influxdb==5.2.1 +netifaces==0.10.9 +paho-mqtt==1.4.0 +py-cpuinfo==4.0.0 +requests==2.21.0 +scandir==1.9.0 +wifi==0.3.8 +zeroconf==0.21.3 diff --git a/glances/rootfs/bin/s6-nuke b/glances/rootfs/bin/s6-nuke new file mode 100755 index 0000000..466dde1 --- /dev/null +++ b/glances/rootfs/bin/s6-nuke @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# This file turns s6-nuke into a NOOP to prevent total termination +# of the host system since the add-on runs in the same PID namespace. +# ============================================================================== +echo "S6-NUKE: NOOP" +exit 0 diff --git a/glances/rootfs/etc/cont-init.d/10-requirements.sh b/glances/rootfs/etc/cont-init.d/10-requirements.sh new file mode 100644 index 0000000..a5a4a07 --- /dev/null +++ b/glances/rootfs/etc/cont-init.d/10-requirements.sh @@ -0,0 +1,26 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# This files check if all user configuration requirements are met +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Check SSL requirements, if enabled +if hass.config.true 'ssl'; then + if ! hass.config.has_value 'certfile'; then + hass.die 'SSL is enabled, but no certfile was specified' + fi + + if ! hass.config.has_value 'keyfile'; then + hass.die 'SSL is enabled, but no keyfile was specified' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'certfile')"; then + hass.die 'The configured certfile is not found' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + hass.die 'The configured keyfile is not found' + fi +fi diff --git a/glances/rootfs/etc/cont-init.d/11-docker.sh b/glances/rootfs/etc/cont-init.d/11-docker.sh new file mode 100644 index 0000000..394ce5d --- /dev/null +++ b/glances/rootfs/etc/cont-init.d/11-docker.sh @@ -0,0 +1,33 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Unprotects this add-on in order to gain access to the Docker socket +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Break in case the API is unreachable +if ! hass.api.supervisor.ping; then + hass.die "Could you contact the HassIO API" +fi + +# Docker support is enabled! +if [[ -S "/var/run/docker.sock" ]]; then + hass.log.info 'Docker support has been enabled.' + exit "${EX_OK}" +fi + +hass.log.fatal "PROTECTION MODE ENABLED!" +hass.log.fatal "" +hass.log.fatal "To be able to use this add-on, you'll need to disable" +hass.log.fatal "protection mode on this add-on. Without it, the add-on" +hass.log.fatal "is unable to access Docker." +hass.log.fatal "" +hass.log.fatal "Steps:" +hass.log.fatal " - Go to the Hass.io Panel." +hass.log.fatal " - Click on the 'Glances' add-on." +hass.log.fatal " - Set the 'Protection mode' switch to off." +hass.log.fatal " - Restart the add-on." +hass.log.fatal "" + +exit "${EX_NOK}" diff --git a/glances/rootfs/etc/cont-init.d/20-config.sh b/glances/rootfs/etc/cont-init.d/20-config.sh new file mode 100644 index 0000000..f66525c --- /dev/null +++ b/glances/rootfs/etc/cont-init.d/20-config.sh @@ -0,0 +1,19 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Ensure the configuration exists +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +if hass.file_exists '/config/glances/glances.conf'; then + cp -f /config/glances/glances.conf /etc/glances.conf + exit "${EX_OK}" +fi + +# Ensure configuration exists +mkdir -p /config/glances \ + || hass.die "Failed to create the Glances configuration directory" + +# Copy in template file +cp /etc/glances.conf /config/glances/ diff --git a/glances/rootfs/etc/cont-init.d/30-influxdb.sh b/glances/rootfs/etc/cont-init.d/30-influxdb.sh new file mode 100644 index 0000000..bec203b --- /dev/null +++ b/glances/rootfs/etc/cont-init.d/30-influxdb.sh @@ -0,0 +1,21 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Export Glances data to InfluxDB +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +if hass.config.false 'influxdb.enabled'; then + exit "${EX_OK}" +fi + +# Modify the configuration +{ + echo "[influxdb]" + echo "host=$(hass.config.get 'influxdb.host')" + echo "port=$(hass.config.get 'influxdb.port')" + echo "user=$(hass.config.get 'influxdb.username')" + echo "password=$(hass.config.get 'influxdb.password')" + echo "db=$(hass.config.get 'influxdb.database')" +} >> /etc/glances.conf diff --git a/glances/rootfs/etc/cont-init.d/70-nginx.sh b/glances/rootfs/etc/cont-init.d/70-nginx.sh new file mode 100644 index 0000000..96b814e --- /dev/null +++ b/glances/rootfs/etc/cont-init.d/70-nginx.sh @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Configure the use of SSL in NGINX +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +if hass.config.true 'ssl'; then + certfile=$(hass.config.get 'certfile') + keyfile=$(hass.config.get 'keyfile') + + sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx-ssl.conf + sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx-ssl.conf +fi diff --git a/glances/rootfs/etc/glances.conf b/glances/rootfs/etc/glances.conf new file mode 100644 index 0000000..ecbe50c --- /dev/null +++ b/glances/rootfs/etc/glances.conf @@ -0,0 +1,315 @@ +############################################################################## +# Globals Glances parameters +############################################################################## + +[global] +# Does Glances should check if a newer version is available on PyPI ? +check_update=false +# History size (maximum number of values) +# Default is 28800: 1 day with 1 point every 3 seconds (default refresh time) +history_size=28800 + +############################################################################## +# User interface +############################################################################## + +[outputs] +# Theme name for the Curses interface: black or white +curse_theme=black +# Limit the number of processes to display in the WebUI +max_processes_display=30 + +############################################################################## +# plugins +############################################################################## + +[quicklook] +# Define CPU, MEM and SWAP thresholds in % +cpu_careful=50 +cpu_warning=70 +cpu_critical=90 +mem_careful=50 +mem_warning=70 +mem_critical=90 +swap_careful=50 +swap_warning=70 +swap_critical=90 + +[cpu] +# Default values if not defined: 50/70/90 (except for iowait) +user_careful=50 +user_warning=70 +user_critical=90 +#user_log=False +#user_critical_action=echo {{user}} {{value}} {{max}} > /tmp/cpu.alert +system_careful=50 +system_warning=70 +system_critical=90 +steal_careful=50 +steal_warning=70 +steal_critical=90 +#steal_log=True +# I/O wait percentage should be lower than 1/# (Logical CPU cores) +# Leave commented to just use the default config (1/#-20% / 1/#-10% / 1/#) +#iowait_careful=30 +#iowait_warning=40 +#iowait_critical=50 +# Context switch limit (core / second) +# Leave commented to just use the default config (critical is 50000*# (Logical CPU cores) +#ctx_switches_careful=10000 +#ctx_switches_warning=12000 +#ctx_switches_critical=14000 + +[percpu] +# Define CPU thresholds in % +# Default values if not defined: 50/70/90 +user_careful=50 +user_warning=70 +user_critical=90 +iowait_careful=50 +iowait_warning=70 +iowait_critical=90 +system_careful=50 +system_warning=70 +system_critical=90 + +[gpu] +# Default processor values if not defined: 50/70/90 +proc_careful=50 +proc_warning=70 +proc_critical=90 +# Default memory values if not defined: 50/70/90 +mem_careful=50 +mem_warning=70 +mem_critical=90 + +[mem] +# Define RAM thresholds in % +# Default values if not defined: 50/70/90 +careful=50 +#careful_action_repeat=echo {{percent}} >> /tmp/memory.alert +warning=70 +critical=90 + +[memswap] +# Define SWAP thresholds in % +# Default values if not defined: 50/70/90 +careful=50 +warning=70 +critical=90 + +[load] +# Define LOAD thresholds +# Value * number of cores +# Default values if not defined: 0.7/1.0/5.0 per number of cores +# Source: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages +# http://www.linuxjournal.com/article/9001 +careful=0.7 +warning=1.0 +critical=5.0 +#log=False + +[network] +# Default bitrate thresholds in % of the network interface speed +# Default values if not defined: 70/80/90 +rx_careful=70 +rx_warning=80 +rx_critical=90 +tx_careful=70 +tx_warning=80 +tx_critical=90 +# Define the list of hidden network interfaces (comma-separated regexp) +#hide=docker.*,lo +# WLAN 0 alias +#wlan0_alias=Wireless IF +# It is possible to overwrite the bitrate thresholds per interface +# WLAN 0 Default limits (in bits per second aka bps) for interface bitrate +#wlan0_rx_careful=4000000 +#wlan0_rx_warning=5000000 +#wlan0_rx_critical=6000000 +#wlan0_rx_log=True +#wlan0_tx_careful=700000 +#wlan0_tx_warning=900000 +#wlan0_tx_critical=1000000 +#wlan0_tx_log=True + +[wifi] +# Define the list of hidden wireless network interfaces (comma-separated regexp) +hide=lo,docker.* +# Define SIGNAL thresholds in db (lower is better...) +# Based on: http://serverfault.com/questions/501025/industry-standard-for-minimum-wifi-signal-strength +careful=-65 +warning=-75 +critical=-85 + +[diskio] +# Define the list of hidden disks (comma-separated regexp) +#hide=sda2,sda5,loop.* +hide=loop.* +# Alias for sda1 +#sda1_alias=IntDisk + +[fs] +# Define the list of hidden file system (comma-separated regexp) +#hide=/boot.* +# Define filesystem space thresholds in % +# Default values if not defined: 50/70/90 +# It is also possible to define per mount point value +# Example: /_careful=40 +careful=50 +warning=70 +critical=90 +# Allow additional file system types (comma-separated FS type) +#allow=zfs + +[folders] +# Define a folder list to monitor +# The list is composed of items (list_#nb <= 10) +# An item is defined by: +# * path: absolute path +# * careful: optional careful threshold (in MB) +# * warning: optional warning threshold (in MB) +# * critical: optional critical threshold (in MB) +folder_1_path=/config +folder_1_careful=4096 +folder_1_warning=8196 +folder_1_critical=12228 +folder_2_path=/share +folder_2_careful=4096 +folder_2_warning=8196 +folder_2_critical=12228 +folder_3_path=/backup +folder_3_careful=4096 +folder_3_warning=8196 +folder_3_critical=12228 + +[sensors] +# Sensors core thresholds (in Celsius...) +# Default values if not defined: 60/70/80 +temperature_core_careful=60 +temperature_core_warning=70 +temperature_core_critical=80 +# Temperatures threshold in °C for hddtemp +# Default values if not defined: 45/52/60 +temperature_hdd_careful=45 +temperature_hdd_warning=52 +temperature_hdd_critical=60 +# Battery threshold in % +battery_careful=80 +battery_warning=90 +battery_critical=95 +# Sensors alias +#temp1_alias=Motherboard 0 +#temp2_alias=Motherboard 1 +#core 0_alias=CPU Core 0 +#core 1_alias=CPU Core 1 + +[processlist] +# Define CPU/MEM (per process) thresholds in % +# Default values if not defined: 50/70/90 +cpu_careful=50 +cpu_warning=70 +cpu_critical=90 +mem_careful=50 +mem_warning=70 +mem_critical=90 +# +# Nice priorities range from -20 to 19. +# Configure nice levels using a comma separated list. +# +# Nice: Example 1, non-zero is warning (default behavior) +nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 +# +# Nice: Example 2, low priority processes escalate from careful to critical +#nice_careful=1,2,3,4,5,6,7,8,9 +#nice_warning=10,11,12,13,14 +#nice_critical=15,16,17,18,19 + +[ports] +# Ports scanner plugin configuration +# Interval in second between two scans +refresh=30 +# Set the default timeout (in second) for a scan (can be overwritten in the scan list) +timeout=3 +# If port_default_gateway is True, add the default gateway on top of the scan list +port_default_gateway=True +# +# Define the scan list (1 < x < 255) +# port_x_host (name or IP) is mandatory +# port_x_port (TCP port number) is optional (if not set, use ICMP) +# port_x_description is optional (if not set, define to host:port) +# port_x_timeout is optional and overwrite the default timeout value +# port_x_rtt_warning is optional and defines the warning threshold in ms +# +#port_1_host=192.168.0.1 +#port_1_port=80 +#port_1_description=Home Box +#port_1_timeout=1 +#port_2_host=www.free.fr +#port_2_description=My ISP +#port_3_host=www.google.com +#port_3_description=Internet ICMP +#port_3_rtt_warning=1000 +#port_4_description=Internet Web +#port_4_host=www.google.com +#port_4_port=80 +#port_4_rtt_warning=1000 +# +# Define Web (URL) monitoring list (1 < x < 255) +# web_x_url is the URL to monitor (example: http://my.site.com/folder) +# web_x_description is optional (if not set, define to URL) +# web_x_timeout is optional and overwrite the default timeout value +# web_x_rtt_warning is optional and defines the warning respond time in ms (approximatively) +# +#web_1_url=https://blog.nicolargo.com +#web_1_description=My Blog +#web_1_rtt_warning=3000 +#web_2_url=https://github.com +#web_3_url=http://www.google.fr +#web_3_description=Google Fr +#web_4_url=https://blog.nicolargo.com/nonexist +#web_4_description=Intranet + +[docker] +# Thresholds for CPU and MEM (in %) +cpu_careful=50 +cpu_warning=70 +cpu_critical=90 +mem_careful=20 +mem_warning=50 +mem_critical=70 +# +# Per container thresholds +#containername_cpu_careful=10 +#containername_cpu_warning=20 +#containername_cpu_critical=30 +# +# By default, Glances only display running containers +# Set the following key to True to display all containers +all=False + +############################################################################## +# Client/server +############################################################################## + +[serverlist] +# Define the static servers list +#server_1_name=localhost +#server_1_alias=My local PC +#server_1_port=61209 +#server_2_name=localhost +#server_2_port=61235 +#server_3_name=192.168.0.17 +#server_3_alias=Another PC on my network +#server_3_port=61209 +#server_4_name=pasbon +#server_4_port=61237 + +[passwords] +# Define the passwords list +# Syntax: host=password +# Where: host is the hostname +# password is the clear password +# Additionally (and optionally) a default password could be defined +#localhost=abc +#default=defaultpassword diff --git a/glances/rootfs/etc/nginx/ha-auth.lua b/glances/rootfs/etc/nginx/ha-auth.lua new file mode 100644 index 0000000..4c9ca91 --- /dev/null +++ b/glances/rootfs/etc/nginx/ha-auth.lua @@ -0,0 +1,83 @@ +local http = require "resty.http" +local auths = ngx.shared.auths + +function authenticate() + + --- Test Authentication header is set and with a value + local header = ngx.req.get_headers()['Authorization'] + if header == nil or header:find(" ") == nil then + return false + end + + local divider = header:find(' ') + if header:sub(0, divider-1) ~= 'Basic' then + return false + end + + local auth = ngx.decode_base64(header:sub(divider+1)) + if auth == nil or auth:find(':') == nil then + return false + end + + divider = auth:find(':') + local username = auth:sub(0, divider-1) + local password = auth:sub(divider+1) + + --- Check if authentication is cached + if auths:get(username) == password then + ngx.log(ngx.DEBUG, "Authenticated user against Home Assistant (cache).") + return true + end + + --- HTTP request against Hassio API + local httpc = http.new() + local res, err = httpc:request_uri("http://hassio/auth", { + method = "POST", + body = ngx.encode_args({["username"]=username, ["password"]=password}), + headers = { + ["Content-Type"] = "application/x-www-form-urlencoded", + ["X-HASSIO-KEY"] = os.getenv("HASSIO_TOKEN"), + }, + keepalive_timeout = 60, + keepalive_pool = 10 + }) + + --- Error during API request + if err then + ngx.log(ngx.WARN, "Error during Hassio user authentication.", err) + return false + end + + --- No result? Something went wrong... + if not res then + ngx.log(ngx.WARN, "Error during Hassio user authentication.") + return false + end + + --- Valid response, the username/password is valid + if res.status == 200 then + ngx.log(ngx.INFO, "Authenticated user against Home Assistant.") + auths:set(username, password, 60) + return true + end + + --- Whatever the response is, it is invalid + ngx.log(ngx.WARN, "Authentication against Home Assistant failed!") + return false +end + +-- Only authenticate if its not disabled +if not os.getenv('DISABLE_HA_AUTHENTICATION') then + + --- Try to authenticate against HA + local authenticated = authenticate() + + --- If authentication failed, throw a basic auth + if not authenticated then + ngx.header.content_type = 'text/plain' + ngx.header.www_authenticate = 'Basic realm="Home Assistant"' + ngx.status = ngx.HTTP_UNAUTHORIZED + ngx.say('401 Access Denied') + ngx.exit(ngx.HTTP_UNAUTHORIZED) + end +end diff --git a/glances/rootfs/etc/nginx/nginx-ssl.conf b/glances/rootfs/etc/nginx/nginx-ssl.conf new file mode 100644 index 0000000..5a72de7 --- /dev/null +++ b/glances/rootfs/etc/nginx/nginx-ssl.conf @@ -0,0 +1,80 @@ +worker_processes 1; +pid /var/run/nginx.pid; +error_log /dev/stdout info; +daemon off; +env HASSIO_TOKEN; +env DISABLE_HA_AUTHENTICATION; +load_module "/usr/lib/nginx/modules/ndk_http_module.so"; +load_module "/usr/lib/nginx/modules/ngx_http_lua_module.so"; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + proxy_read_timeout 1200; + gzip on; + gzip_disable "msie6"; + lua_shared_dict auths 16k; + resolver 172.30.32.2; + + upstream glances { + ip_hash; + server 127.0.0.1:61209; + } + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 61208 default_server ssl; + + server_name _; + access_log /dev/stdout combined; + + client_max_body_size 4G; + keepalive_timeout 5; + + ssl on; + ssl_certificate /ssl/%%certfile%%; + ssl_certificate_key /ssl/%%keyfile%%; + ssl_protocols TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Robots-Tag none; + + root /dev/null; + + location / { + access_by_lua_file /etc/nginx/ha-auth.lua; + + proxy_redirect off; + proxy_pass http://glances; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + } + } +} diff --git a/glances/rootfs/etc/nginx/nginx.conf b/glances/rootfs/etc/nginx/nginx.conf new file mode 100644 index 0000000..6485130 --- /dev/null +++ b/glances/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,63 @@ +worker_processes 1; +pid /var/run/nginx.pid; +error_log /dev/stdout info; +daemon off; +env HASSIO_TOKEN; +env DISABLE_HA_AUTHENTICATION; +load_module "/usr/lib/nginx/modules/ndk_http_module.so"; +load_module "/usr/lib/nginx/modules/ngx_http_lua_module.so"; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + proxy_read_timeout 1200; + gzip on; + gzip_disable "msie6"; + lua_shared_dict auths 16k; + resolver 172.30.32.2; + + upstream glances { + ip_hash; + server 127.0.0.1:61209; + } + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 61208 default_server; + + server_name _; + access_log /dev/stdout combined; + + client_max_body_size 4G; + keepalive_timeout 5; + + root /dev/null; + + location / { + access_by_lua_file /etc/nginx/ha-auth.lua; + + proxy_redirect off; + proxy_pass http://glances; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + } + } +} diff --git a/glances/rootfs/etc/services.d/glances/finish b/glances/rootfs/etc/services.d/glances/finish new file mode 100644 index 0000000..caf50f2 --- /dev/null +++ b/glances/rootfs/etc/services.d/glances/finish @@ -0,0 +1,10 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Take down the S6 supervision tree when Glances fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services + \ No newline at end of file diff --git a/glances/rootfs/etc/services.d/glances/run b/glances/rootfs/etc/services.d/glances/run new file mode 100644 index 0000000..d8cf614 --- /dev/null +++ b/glances/rootfs/etc/services.d/glances/run @@ -0,0 +1,23 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Runs Glances +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +declare -a options + +hass.log.info 'Starting Glances' + +options+=(-C /etc/glances.conf) +options+=(-w) +options+=(--port 61209) +options+=(--bind 127.0.0.1) + +if hass.debug; then + options+=(--debug) +fi + +# Run Glances +exec glances "${options[@]}" diff --git a/glances/rootfs/etc/services.d/influxdb/finish b/glances/rootfs/etc/services.d/influxdb/finish new file mode 100644 index 0000000..8e8f0aa --- /dev/null +++ b/glances/rootfs/etc/services.d/influxdb/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Take down the S6 supervision tree when Glances fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/glances/rootfs/etc/services.d/influxdb/run b/glances/rootfs/etc/services.d/influxdb/run new file mode 100644 index 0000000..d0cfd6a --- /dev/null +++ b/glances/rootfs/etc/services.d/influxdb/run @@ -0,0 +1,28 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Runs Glances InfluxDB Export +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +declare -a options + +if hass.config.false 'influxdb.enabled'; then + exec sleep 86400 +fi + +options+=(-C /etc/glances.conf) +options+=(--export influxdb) +options+=(--quiet) + +if hass.debug; then + options+=(--debug) +fi + +# Interval +sleep "$(hass.config.get 'influxdb.interval')" + +# Run Glances +exec glances "${options[@]}" + diff --git a/glances/rootfs/etc/services.d/nginx/finish b/glances/rootfs/etc/services.d/nginx/finish new file mode 100644 index 0000000..ecf8783 --- /dev/null +++ b/glances/rootfs/etc/services.d/nginx/finish @@ -0,0 +1,10 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Take down the S6 supervision tree when the nginx daemon fails +# ============================================================================== +# Disabled to allow for some testing +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/glances/rootfs/etc/services.d/nginx/run b/glances/rootfs/etc/services.d/nginx/run new file mode 100644 index 0000000..e2a7907 --- /dev/null +++ b/glances/rootfs/etc/services.d/nginx/run @@ -0,0 +1,23 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: Glances +# Runs the nginx daemon +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +hass.log.info 'Starting the NGINX daemon' + +# Wait for Glances to become available +s6-svwait -u -t 5000 /var/run/s6/services/glances + +# Disable HA Authentication if front door is open +if hass.config.true 'leave_front_door_open'; then + export DISABLE_HA_AUTHENTICATION=true +fi + +if hass.config.true 'ssl'; then + exec nginx -c /etc/nginx/nginx-ssl.conf +else + exec nginx -c /etc/nginx/nginx.conf +fi diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000..0887951 Binary files /dev/null and b/images/screenshot.png differ