├── .mdlrc ├── .github ├── autolabeler.yml ├── CODEOWNERS ├── PULL_REQUEST_TEMPLATE.md ├── invite-contributors.yml ├── ISSUE_TEMPLATE.md ├── potential-duplicates.yml ├── move.yml ├── lock.yml ├── no-response.yml ├── support.yml ├── stale.yml ├── config.yml └── settings.yml ├── .gitignore ├── images └── homeassistant.png ├── addons └── .gitkeep ├── backup └── .gitkeep ├── config └── .gitkeep ├── share └── .gitkeep ├── ssl └── .gitkeep ├── .codeclimate.yml ├── configuration.yml ├── LICENSE.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md ├── provision.sh ├── Vagrantfile └── README.md /.mdlrc: -------------------------------------------------------------------------------- 1 | rules "~MD024" -------------------------------------------------------------------------------- /.github/autolabeler.yml: -------------------------------------------------------------------------------- 1 | --- 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vagrant/* 2 | addons/* 3 | backup/* 4 | config/* 5 | share/* 6 | ssl/* 7 | *.log 8 | !.gitkeep 9 | -------------------------------------------------------------------------------- /images/homeassistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassio-addons/hassio-vagrant/HEAD/images/homeassistant.png -------------------------------------------------------------------------------- /addons/.gitkeep: -------------------------------------------------------------------------------- 1 | Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) -------------------------------------------------------------------------------- /backup/.gitkeep: -------------------------------------------------------------------------------- 1 | Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) -------------------------------------------------------------------------------- /config/.gitkeep: -------------------------------------------------------------------------------- 1 | Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) -------------------------------------------------------------------------------- /share/.gitkeep: -------------------------------------------------------------------------------- 1 | Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) -------------------------------------------------------------------------------- /ssl/.gitkeep: -------------------------------------------------------------------------------- 1 | Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Require maintainer's :+1: for changes to the .github/ repo-config files 2 | # mainly due to https://github.com/probot/settings privilege escalation 3 | .github/* @frenck 4 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Proposed Changes 2 | 3 | > (Describe the changes and rationale behind them) 4 | 5 | ## Related Issues 6 | 7 | > ([Github link][autolink-references] to related issues or pull requests) 8 | 9 | [autolink-references]: https://help.github.com/articles/autolinked-references-and-urls/ -------------------------------------------------------------------------------- /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | markdownlint: 4 | enabled: true 5 | rubocop: 6 | enabled: true 7 | shellcheck: 8 | enabled: true 9 | ratings: 10 | paths: 11 | - "**.md" 12 | - "**.sh" 13 | - "Vagrantfile" 14 | exclude_paths: [ 15 | ".vagrant/**", 16 | "addons/**", 17 | "backup/**", 18 | "config/**", 19 | "share/**", 20 | "ssl/**", 21 | ] 22 | -------------------------------------------------------------------------------- /.github/invite-contributors.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # If true, this will add new contributors as outside collaborators 3 | # to the repo their PR was merged in. Team name is ignored if this 4 | # flag is set to true. 5 | isOutside: false 6 | 7 | # Specify team name to add new contributors to a specific team 8 | # within your organization. 9 | # Use team name or team-name-slug 10 | team: Contributors 11 | -------------------------------------------------------------------------------- /configuration.yml: -------------------------------------------------------------------------------- 1 | --- 2 | memory: 1024 3 | cpus: 2 4 | hostname: hassio 5 | post_up_message: Hass.io starting... wait a couple of minutes! 6 | box: ubuntu/bionic64 7 | bridge: ~ 8 | keep_config: false 9 | shares: 10 | addons: /usr/share/hassio/addons/local 11 | backup: /usr/share/hassio/backup 12 | config: /usr/share/hassio/homeassistant 13 | share: /usr/share/hassio/share 14 | ssl: /usr/share/hassio/ssl 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Problem/Motivation 2 | 3 | > (Why the issue was filed) 4 | 5 | ## Expected behavior 6 | 7 | > (What you expected to happen) 8 | 9 | ## Actual behavior 10 | 11 | > (What actually happened) 12 | 13 | ## Steps to reproduce 14 | 15 | > (How can someone else make/see it happen) 16 | 17 | ## Proposed changes 18 | 19 | > (If you have a proposed change, workaround or fix, 20 | > describe the rationale behind it) 21 | -------------------------------------------------------------------------------- /.github/potential-duplicates.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Label name and color to set, when potential duplicates are detected 3 | issueLabel: "Potential duplicate" 4 | labelColor: e6e6e6 5 | 6 | # If similarity is higher than this threshold, issue will be marked as duplicate 7 | threshold: 0.70 8 | 9 | # Comment to post when potential duplicates are detected 10 | referenceComment: > 11 | Potential duplicates found: 12 | {{#issues}} 13 | - [#{{ number }}] {{ title }} ({{ accuracy }}%) 14 | {{/issues}} 15 | -------------------------------------------------------------------------------- /.github/move.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Delete the command comment when it contains no other content 3 | deleteCommand: true 4 | 5 | # Close the source issue after moving 6 | closeSourceIssue: true 7 | 8 | # Lock the source issue after moving 9 | lockSourceIssue: true 10 | 11 | # Mention issue and comment authors 12 | mentionAuthors: true 13 | 14 | # Preserve mentions in the issue content 15 | keepContentMentions: false 16 | 17 | # Set custom aliases for targets 18 | # aliases: 19 | # r: repo 20 | # or: owner/repo 21 | -------------------------------------------------------------------------------- /.github/lock.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configuration for lock-threads - https://github.com/dessant/lock-threads 3 | # Number of days of inactivity before a closed issue or pull request is locked 4 | daysUntilLock: 30 5 | 6 | # Comment to post before locking. Set to `false` to disable 7 | lockComment: > 8 | This thread has been automatically locked because it has not had recent 9 | activity. Please open a new issue for related bugs and link to relevant 10 | comments in this thread. 11 | 12 | # Issues or pull requests with these labels will not be locked 13 | # exemptLabels: 14 | # - no-locking 15 | 16 | # Limit to only `issues` or `pulls` 17 | # only: issues 18 | 19 | # Add a label when locking. Set to `false` to disable 20 | lockLabel: false 21 | -------------------------------------------------------------------------------- /.github/no-response.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configuration for probot-no-response - https://github.com/probot/no-response 3 | # Number of days of inactivity before an Issue is closed for lack of response 4 | daysUntilClose: 14 5 | # Label requiring a response 6 | responseRequiredLabel: "Status: Awaiting response" 7 | # Comment to post when closing an Issue for lack of response. Set to `false` to disable 8 | closeComment: > 9 | This issue has been automatically closed because there has been no response 10 | to our request for more information from the original author. With only the 11 | information that is currently in the issue, we don't have enough information 12 | to take action. Please reach out if you have or find the answers we need so 13 | that we can investigate further. 14 | -------------------------------------------------------------------------------- /.github/support.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configuration for support-requests - https://github.com/dessant/support-requests 3 | 4 | # Label used to mark issues as support requests 5 | supportLabel: "Type: Support" 6 | 7 | # Comment to post on issues marked as support requests. Add a link 8 | # to a support page, or set to `false` to disable 9 | supportComment: > 10 | :wave: We use the issue tracker exclusively for bug reports and feature requests. 11 | However, this issue appears to be a support request. Please use our 12 | support channels to get help with the project. 13 | 14 | Head over to the [Home Assistant community forum](https://community.home-assistant.io/?u=frenck) 15 | or join our [Discord](https://discord.gg/c5DvZ4e) chat. 16 | 17 | # Close issues marked as support requests 18 | close: true 19 | 20 | # Lock issues marked as support requests 21 | lock: false 22 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) 2017 Franck Nijhof 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish 4 | to make via issue, email, or any other method with the owners of this repository 5 | before making a change. 6 | 7 | Please note we have a code of conduct, please follow it in all your interactions 8 | with the project. 9 | 10 | ## Issues and feature requests 11 | 12 | You've found a bug in the source code, a mistake in the documentation or maybe 13 | you'd like a new feature? You can help us by submitting an issue to our 14 | [GitHub Repository][github]. Before you create an issue, make sure you search 15 | the archive, maybe your question was already answered. 16 | 17 | Even better: You could submit a pull request with a fix / new feature! 18 | 19 | ## Pull request process 20 | 21 | 1. Search our repository for open or closed [pull requests][prs] that relates 22 | to your submission. You don't want to duplicate effort. 23 | 24 | 1. You may merge the pull request in once you have the sign-off of two other 25 | developers, or if you do not have permission to do that, you may request 26 | the second reviewer to merge it for you. 27 | 28 | [github]: https://github.com/hassio-addons/hassio-vagrant/issues 29 | [prs]: https://github.com/hassio-addons/hassio-vagrant/pulls -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configuration for probot-stale - https://github.com/probot/stale 3 | 4 | # Number of days of inactivity before an Issue or Pull Request becomes stale 5 | daysUntilStale: 60 6 | 7 | # Number of days of inactivity before a stale Issue or Pull Request is closed. 8 | # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. 9 | daysUntilClose: 7 10 | 11 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable 12 | exemptLabels: 13 | - "Status: On hold" 14 | - "Status: In progress" 15 | - "Status: Awaiting response" 16 | - "Status: Blocked" 17 | - "Idea" 18 | - "Security" 19 | 20 | # Set to true to ignore issues in a project (defaults to false) 21 | exemptProjects: false 22 | 23 | # Set to true to ignore issues in a milestone (defaults to false) 24 | exemptMilestones: false 25 | 26 | # Label to use when marking as stale 27 | staleLabel: "Status: Stale" 28 | 29 | # Comment to post when marking as stale. Set to `false` to disable 30 | markComment: > 31 | This issue has been automatically marked as stale because it has not had 32 | recent activity. It will be closed if no further activity occurs. Thank you 33 | for your contributions. 34 | 35 | # Comment to post when removing the stale label. 36 | # unmarkComment: > 37 | # Your comment here. 38 | unmarkComment: false 39 | 40 | # Comment to post when closing a stale Issue or Pull Request. 41 | # closeComment: > 42 | # Your comment here. 43 | closeComment: false 44 | 45 | # Limit the number of actions per hour, from 1-30. Default is 30 46 | limitPerRun: 30 47 | 48 | # Limit to only `issues` or `pulls` 49 | only: issues 50 | 51 | # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': 52 | # pulls: 53 | # daysUntilStale: 30 54 | # markComment: > 55 | # This pull request has been automatically marked as stale because it has not had 56 | # recent activity. It will be closed if no further activity occurs. Thank you 57 | # for your contributions. 58 | 59 | # issues: 60 | # exemptLabels: 61 | # - confirmed 62 | -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configuration for request-info - https://github.com/behaviorbot/request-info 3 | 4 | # *OPTIONAL* Comment to reply with 5 | # Can be either a string : 6 | requestInfoReplyComment: 7 | - "We would appreciate it if you could provide us with more info about this issue/pr!" 8 | - "Hmmm... That issue/PR is kinda low on text. Could you please provide some more content?" 9 | 10 | # *OPTIONAL* default titles to check against for lack of descriptiveness 11 | # MUST BE ALL LOWERCASE 12 | requestInfoDefaultTitles: [] 13 | 14 | # *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given 15 | requestInfoLabelToAdd: "Incomplete" 16 | 17 | # *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template 18 | # Will fail if the pull request's body is equal to the provided template 19 | checkPullRequestTemplate: true 20 | 21 | # *OPTIONAL* Only warn about insufficient information on these events type 22 | # Keys must be lowercase. Valid values are 'issue' and 'pullRequest' 23 | requestInfoOn: 24 | pullRequest: true 25 | issue: true 26 | 27 | # *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on 28 | # keys must be GitHub usernames 29 | requestInfoUserstoExclude: [] 30 | 31 | # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome 32 | 33 | # Comment to be posted to on first time issues 34 | newIssueWelcomeComment: > 35 | :wave: Thanks for opening your first issue here! 36 | If you're reporting a :bug: bug, please make sure you include steps to reproduce it. 37 | Also, logs, error messages and information about your hardware might be usefull. 38 | 39 | # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome 40 | 41 | # Comment to be posted to on PRs from first time contributors in your repository 42 | newPRWelcomeComment: > 43 | :sparkling_heart: Thanks for opening this pull request! :sparkling_heart: 44 | If your PR gets accepted and merged in, we will invite you to the project :tada: 45 | 46 | # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge 47 | 48 | # Comment to be posted to on pull requests merged by a first time user 49 | firstPRMergeComment: > 50 | Congrats on merging your first pull request! :tada::tada::tada: 51 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of conduct 2 | 3 | ## Our pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention 26 | or advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or 30 | electronic address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate 32 | in a professional setting 33 | 34 | ## Our responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project lead at frenck@addons.community. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project lead is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 71 | version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /provision.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # ============================================================================== 3 | # 4 | # Community Hass.io Add-ons: Vagrant 5 | # 6 | # Provisions a Vagrant guest with Hass.io 7 | # 8 | # ============================================================================== 9 | set -o errexit # Exit script when a command exits with non-zero status 10 | set -o errtrace # Exit on error inside any functions or sub-shells 11 | set -o nounset # Exit script on use of an undefined variable 12 | set -o pipefail # Return exit status of the last command in the pipe that failed 13 | 14 | # ============================================================================== 15 | # GLOBALS 16 | # ============================================================================== 17 | readonly EX_OK=0 18 | readonly HASSIO_INSTALLER="https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh" 19 | readonly DOCKER_DOWNLOAD="https://download.docker.com/linux" 20 | readonly APT_REQUIREMENTS=( 21 | apparmor-utils 22 | apt-transport-https 23 | avahi-daemon 24 | ca-certificates 25 | curl 26 | dbus 27 | dkms 28 | jq 29 | network-manager 30 | socat 31 | software-properties-common 32 | ) 33 | 34 | # ============================================================================== 35 | # SCRIPT LOGIC 36 | # ============================================================================== 37 | 38 | # ------------------------------------------------------------------------------ 39 | # Installs all required software packages and tools 40 | # 41 | # Arguments: 42 | # None 43 | # Returns: 44 | # None 45 | # ------------------------------------------------------------------------------ 46 | install_requirements() { 47 | apt-get update 48 | DEBIAN_FRONTEND=noninteractive apt-get install -y "${APT_REQUIREMENTS[@]}" 49 | } 50 | 51 | # ------------------------------------------------------------------------------ 52 | # Installs the Docker engine 53 | # 54 | # Arguments: 55 | # None 56 | # Returns: 57 | # None 58 | # ------------------------------------------------------------------------------ 59 | install_docker() { 60 | local os 61 | local lsb_release 62 | 63 | os=$(. /etc/os-release; echo "${ID}") 64 | lsb_release=$(lsb_release -cs) 65 | 66 | curl -fsSL "${DOCKER_DOWNLOAD}/${os}/gpg" | sudo apt-key add - 67 | 68 | add-apt-repository \ 69 | "deb [arch=amd64] ${DOCKER_DOWNLOAD}/${os} ${lsb_release} stable" 70 | 71 | apt-get update 72 | DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce 73 | 74 | usermod -aG docker ubuntu 75 | } 76 | 77 | # ------------------------------------------------------------------------------ 78 | # Installs and starts Hass.io 79 | # 80 | # Arguments: 81 | # None 82 | # Returns: 83 | # None 84 | # ------------------------------------------------------------------------------ 85 | install_hassio() { 86 | curl -sL "${HASSIO_INSTALLER}" | bash -s 87 | } 88 | 89 | # ------------------------------------------------------------------------------ 90 | # Shows a message on how to connect to Home Assistant, including the 91 | # dynamic IP the guest was given. 92 | # 93 | # Arguments: 94 | # None 95 | # Returns: 96 | # None 97 | # ------------------------------------------------------------------------------ 98 | show_post_up_message() { 99 | local ip_public 100 | local ip_private 101 | 102 | ip_public=$(ip -4 -o addr s enp0s9|head -1|cut -d\ -f 7|cut -d/ -f 1) 103 | ip_private=$(ip -4 -o addr s enp0s8|head -1|cut -d\ -f 7|cut -d/ -f 1) 104 | 105 | echo '=====================================================================' 106 | echo ' Community Hass.io Add-ons: Vagrant' 107 | echo '' 108 | echo ' Hass.io is installed & started! It may take a couple of minutes' 109 | echo ' before it is actually responding/available.' 110 | echo '' 111 | echo ' Home Assistant is running on the following links:' 112 | echo " - http://${ip_private}:8123" 113 | echo " - http://${ip_public}:8123" 114 | echo '=====================================================================' 115 | } 116 | 117 | # ============================================================================== 118 | # RUN LOGIC 119 | # ------------------------------------------------------------------------------ 120 | main() { 121 | install_requirements 122 | install_docker 123 | install_hassio 124 | show_post_up_message 125 | exit "${EX_OK}" 126 | } 127 | main "$@" 128 | -------------------------------------------------------------------------------- /.github/settings.yml: -------------------------------------------------------------------------------- 1 | --- 2 | repository: 3 | description: "Vagrant box running Hass.io / Home Assistant" 4 | homepage: https://addons.community 5 | topics: vagrant, home-automation, home-assistant, hassio, hass, virtualbox, virtual-machine 6 | private: false 7 | has_issues: true 8 | has_projects: false 9 | has_wiki: false 10 | has_downloads: false 11 | default_branch: master 12 | allow_squash_merge: true 13 | allow_merge_commit: false 14 | allow_rebase_merge: true 15 | labels: 16 | # Priority labels 17 | - name: "Priority: Critical" 18 | color: ee0701 19 | description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." 20 | - name: "Priority: High" 21 | color: b60205 22 | description: "After critical issues are fixed, these should be dealt with before any further issues." 23 | - name: "Priority: Medium" 24 | color: 0e8a16 25 | description: "This issue may be useful, and needs some attention." 26 | - name: "Priority: Low" 27 | color: e4ea8a 28 | description: "Nice addition, maybe... someday..." 29 | 30 | # Type labels 31 | - name: "Type: Bug" 32 | color: ee0701 33 | description: "Inconsistencies or issues which will cause a problem for users or implementors." 34 | - name: "Type: Documentation" 35 | color: 0052cc 36 | description: "Solely about the documentation of the project." 37 | - name: "Type: Enhancement" 38 | color: 1d76db 39 | description: "Enhancement of the code, not introducing new features." 40 | - name: "Type: Feature" 41 | color: 0e8a16 42 | description: "New features or options." 43 | - name: "Type: Support" 44 | color: 5319e7 45 | description: "Marks an issue as an support ticket." 46 | - name: "Type: Discussion" 47 | color: d4c5f9 48 | description: "Marks an issue as an generic discussion ticket." 49 | - name: "Type: Maintaince" 50 | color: 2af79e 51 | description: "Generic maintaince tasks, e.g., package updates." 52 | 53 | # Additional markers 54 | - name: "Security" 55 | color: ee0701 56 | description: "Marks an security issues that needs to be resolved asap." 57 | - name: "Idea" 58 | color: fef2c0 59 | description: "Marks an idea, which might be excepted and implemented." 60 | - name: "Incomplete" 61 | color: fef2c0 62 | description: "Marks an PR or issue that is missing information." 63 | - name: "Pull request" 64 | color: fbca04 65 | description: "There is an PR opened for this issue." 66 | - name: "Accepted" 67 | color: c2e0c6 68 | description: "This issue or PR has been accepted." 69 | - name: "Declined" 70 | color: f9d0c4 71 | description: "This issue or PR has been declined." 72 | - name: "Potential duplicate" 73 | color: e6e6e6 74 | description: "This issue has been automatically marked as a potential duplicate." 75 | 76 | # Ongoing Status labels 77 | - name: "Status: Triage" 78 | color: fbca04 79 | description: "This issue needs to be triaged." 80 | - name: "Status: On hold" 81 | color: cccccc 82 | description: "Issue or PR that has been placed on hold for now." 83 | - name: "Status: In progress" 84 | color: fbca04 85 | description: "Issue is currently being resolved by a developer." 86 | - name: "Status: Stale" 87 | color: fef2c0 88 | description: "There has not been activity on this issue or PR for quite some time." 89 | - name: "Status: Awaiting response" 90 | color: fef2c0 91 | description: "Issue or PR awaits response from the creator." 92 | - name: "Status: Blocked" 93 | color: fef2c0 94 | description: "Progress on this issue is currently not possible." 95 | 96 | # Closing status labels 97 | - name: "Closed: Known limitation" 98 | color: e6e6e6 99 | description: "Issue is closed, it is a known limitation." 100 | - name: "Closed: Expected behavior" 101 | color: e6e6e6 102 | description: "Issues is closed, it is expected behavior." 103 | - name: "Closed: Duplicate" 104 | color: e6e6e6 105 | description: "Issue is closed, duplicate of an existing issue." 106 | - name: "Closed: Invalid" 107 | color: e6e6e6 108 | description: "Issue is closed, marked as not a valid issue (e.g., an user error)." 109 | - name: "Closed: Wrong repository" 110 | color: e6e6e6 111 | description: "Issue is closed, was created in the wrong repository." 112 | - name: "Closed: Won't Fix" 113 | color: e6e6e6 114 | description: "Issue is closed, it won't be fixed." 115 | - name: "Closed: Done" 116 | color: c2e0c6 117 | description: "Issue closed, work on this issue has been marked complete." 118 | 119 | # Others 120 | - name: "Beginner Friendly" 121 | color: 0e8a16 122 | description: "Good first issue for people wanting to contribute to the project." 123 | - name: "Help wanted" 124 | color: 0e8a16 125 | description: "We need some extra helping hands or expertise in order to resolve this." 126 | - name: "Hacktoberfest" 127 | description: "Issues/PRs are participating in the Hacktoberfest" 128 | color: fbca04 129 | 130 | branches: 131 | - name: master 132 | protection: 133 | required_pull_request_reviews: 134 | # required_approving_review_count: 1 135 | dismiss_stale_reviews: true 136 | require_code_owner_reviews: true 137 | dismissal_restrictions: 138 | users: [] 139 | teams: 140 | - Admins 141 | - Masters 142 | required_status_checks: 143 | strict: false 144 | contexts: [] 145 | enforce_admins: false 146 | restrictions: 147 | users: [] 148 | teams: 149 | - Admins 150 | - Masters 151 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | # ============================================================================== 2 | # 3 | # Community Hass.io Add-ons: Vagrant 4 | # 5 | # ============================================================================== 6 | # MIT License 7 | # 8 | # Copyright (c) 2017 Franck Nijhof 9 | # 10 | # Permission is hereby granted, free of charge, to any person obtaining a copy 11 | # of this software and associated documentation files (the "Software"), to deal 12 | # in the Software without restriction, including without limitation the rights 13 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | # copies of the Software, and to permit persons to whom the Software is 15 | # furnished to do so, subject to the following conditions: 16 | # 17 | # The above copyright notice and this permission notice shall be included in all 18 | # copies or substantial portions of the Software. 19 | # 20 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | # SOFTWARE. 27 | # ============================================================================== 28 | 29 | require 'English' 30 | require 'fileutils' 31 | require 'vagrant' 32 | require 'yaml' 33 | require 'pp' 34 | 35 | ::Vagrant.require_version '>= 2.1.0' 36 | 37 | module HassioCommunityAddons 38 | # rubocop:disable Metrics/ClassLength 39 | # Manages the Vagrant configuration 40 | # @author Franck Nijhof 41 | class Vagrant 42 | # Class constructor 43 | def initialize 44 | unless `vboxmanage list extpacks`.include? \ 45 | 'Oracle VM VirtualBox Extension Pack' 46 | raise ::Vagrant::Errors::VagrantError.new, \ 47 | 'Could not find VirtualBox Extension Pack! Did you install it?' 48 | end 49 | 50 | @config = YAML.load_file( 51 | File.join(File.dirname(__FILE__), 'configuration.yml') 52 | ) 53 | end 54 | 55 | # Simple CLI Yes / No question 56 | # Only used by Windows Setup 57 | # @param [String] message Question to ask 58 | # @param [Boolean] default True, to default to yes, false to default to no 59 | # @return [Boolean] True if answered yes, false if answered no 60 | def confirm(message, default) 61 | print "#{message} [#{(default ? 'Y/n' : 'y/N')}]: " 62 | 63 | result = $stdin.gets.chomp.strip.downcase 64 | return default if result.empty? 65 | return true if %w[y yes].include? result 66 | return false if %w[n no].include? result 67 | 68 | print "\nInvalid input. Try again...\n" 69 | confirm(message, default) 70 | end 71 | 72 | # Check for addon on Windows for NFS as SMB is slow 73 | # rubocop:disable Metrics/MethodLength 74 | def require_nfs_plugin 75 | return if ::Vagrant.has_plugin?('vagrant-winnfsd') 76 | 77 | print "It is recommended to use the following plugin on Windows \ 78 | (SMB is slow): vagrant-winnfsd\n" 79 | if confirm 'Shall I go ahead and install it?', true 80 | raise ::Vagrant::Errors::VagrantError.new, 'Plugin Install failed' \ 81 | unless system 'vagrant plugin install vagrant-winnfsd' 82 | 83 | print "Restarting Vagrant to reload plugin changes...\n" 84 | system 'vagrant ' + ARGV.join(' ') 85 | exit! $CHILD_STATUS.exitstatus 86 | else 87 | print "Recommended plugin missing, continuing with SMB...\n" \ 88 | end 89 | end 90 | 91 | # rubocop:enable Metrics/MethodLength 92 | # Configures generic Vagrant options 93 | # 94 | # @param [Vagrant::Config::V2::Root] config Vagrant root config 95 | def vagrant_config(config) 96 | config.vm.box = @config['box'] 97 | config.vm.post_up_message = @config['post_up_message'] 98 | end 99 | 100 | # Defines a Vagrant virtual machine 101 | # 102 | # @param [Vagrant::Config::V2::Root] config Vagrant root config 103 | # @param [String] name Name of the machine to define 104 | def machine(config, name) 105 | config.vm.define name do |machine| 106 | machine_config machine 107 | machine_provider_virtualbox machine 108 | machine_shares machine 109 | machine_provision machine 110 | machine_cleanup_on_destroy machine unless @config['keep_config'] 111 | end 112 | end 113 | 114 | # Configures a VM's generic options 115 | # 116 | # @param [Vagrant::Config::V2::Root] machine Vagrant VM root config 117 | def machine_config(machine) 118 | machine.vm.hostname = @config['hostname'] 119 | machine.vm.network 'private_network', type: 'dhcp' 120 | machine.vm.network( 121 | 'public_network', 122 | type: 'dhcp', 123 | bridge: @config['bridge'] 124 | ) 125 | end 126 | 127 | # Configures the Virtualbox provider 128 | # 129 | # @param [Vagrant::Config::V2::Root] machine Vagrant VM root config 130 | # rubocop:disable Metrics/MethodLength 131 | def machine_provider_virtualbox(machine) 132 | machine.vm.provider :virtualbox do |vbox| 133 | vbox.name = @config['hostname'] 134 | vbox.cpus = @config['cpus'] 135 | vbox.customize ['modifyvm', :id, '--memory', @config['memory']] 136 | vbox.customize ['modifyvm', :id, '--nictype1', 'virtio'] 137 | vbox.customize ['modifyvm', :id, '--nictype2', 'virtio'] 138 | vbox.customize ['modifyvm', :id, '--nictype3', 'virtio'] 139 | vbox.customize ['modifyvm', :id, '--natdnshostresolver1', 'on'] 140 | vbox.customize ['modifyvm', :id, '--natdnsproxy1', 'on'] 141 | vbox.customize ['modifyvm', :id, '--usb', 'on', '--usbehci', 'on'] 142 | end 143 | end 144 | # rubocop:enable Metrics/MethodLength 145 | # Configures a VM's shares 146 | # 147 | # @param [Vagrant::Config::V2::Root] machine Vagrant VM root config 148 | 149 | def machine_shares(machine) 150 | @config['shares'].each do |src, dst| 151 | machine.vm.synced_folder( 152 | src, 153 | dst, 154 | create: true, 155 | type: share_type, 156 | SharedFoldersEnableSymlinksCreate: false 157 | ) 158 | end 159 | end 160 | 161 | # Determines the type of filesharing. SMB for windows (without nfs plugin) 162 | # else NFS. 163 | # rubocop:disable Style/MultilineTernaryOperator 164 | def share_type 165 | ::Vagrant::Util::Platform.windows? && 166 | !::Vagrant.has_plugin?('vagrant-winnfsd') ? 'smb' : 'nfs' 167 | end 168 | 169 | # rubocop:enable Style/MultilineTernaryOperator 170 | # Configures a VM's provisioning 171 | # 172 | # @param [Vagrant::Config::V2::Root] machine Vagrant VM root config 173 | def machine_provision(machine) 174 | machine.vm.provision 'fix-no-tty', type: 'shell' do |shell| 175 | shell.path = 'provision.sh' 176 | end 177 | end 178 | 179 | # Define cleanup command based on OS 180 | def os_cleanup_task 181 | config_directory = File.join(File.dirname(__FILE__), 'config') 182 | if ::Vagrant::Util::Platform.windows? 183 | "gci '#{config_directory}' -depth 1 " \ 184 | ' -exclude ".gitkeep" | Remove-Item -recurse' 185 | else 186 | "find '#{config_directory}' -mindepth 1 -maxdepth 1" \ 187 | ' -not -name ".gitkeep" -exec rm -rf {} \;' 188 | end 189 | end 190 | 191 | # Defines a VM cleanup task when destroying the VM 192 | # 193 | # @param [Vagrant::Config::V2::Root] machine Vagrant VM root config 194 | def machine_cleanup_on_destroy(machine) 195 | machine.trigger.after :destroy do |trigger| 196 | trigger.name = 'Cleanup' 197 | trigger.info = 'Cleaning up Home Assistant configuration' 198 | trigger.run = { 199 | inline: os_cleanup_task 200 | } 201 | end 202 | end 203 | 204 | # Run this thing! 205 | def run 206 | ::Vagrant.configure('2') do |config| 207 | require_nfs_plugin if ::Vagrant::Util::Platform.windows? 208 | vagrant_config(config) 209 | machine(config, 'hassio') 210 | end 211 | end 212 | end 213 | # rubocop:enable Metrics/ClassLength 214 | end 215 | 216 | # Create a instance 217 | hassio = HassioCommunityAddons::Vagrant.new 218 | 219 | # Go! 220 | hassio.run 221 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Community Hass.io Add-ons: Vagrant 2 | 3 | [![GitHub Release][releases-shield]][releases] 4 | ![Project Stage][project-stage-shield] 5 | [![License][license-shield]](LICENSE.md) 6 | 7 | [![Code Climate][codeclimate-shield]][codeclimate] 8 | ![Project Maintenance][maintenance-shield] 9 | [![GitHub Activity][commits-shield]][commits] 10 | 11 | [![Discord][discord-shield]][discord] 12 | [![Community Forum][forum-shield]][forum] 13 | 14 | This Vagrant box contains [Home Assistant][home-assistant], which is 15 | based on Hass.io. 16 | 17 | ## Deprecation notice 18 | 19 | This Vagrant box has been a great help for me (and many others) during the 20 | beginning of the Home Assistant add-ons journey. Nowadays, this solution 21 | isn't needed anymore. 22 | 23 | Add-ons can be developed more easy now, directly on a existing machine, 24 | and even in Visual Studio Remote Development containers. 25 | 26 | Therefore, the need to maintain this repository is not longer there (as I am 27 | not using it myself anymore either). 28 | 29 | This project has been archived for that reason and is no longer maintained. 30 | 31 | ## About 32 | 33 | This Vagrant virtual machine allows you to test and play with Hass.io and 34 | Home Assistant, and is a great environment for add-on developers. A simple 35 | `vagrant up` command gives you a fully-installed Hass.io system 36 | in a couple of minutes. 37 | 38 | ![Home Assistant](images/homeassistant.png) 39 | 40 | ## System requirements 41 | 42 | This setup does not require a lot. Sure it does cost some CPU & memory, but 43 | to be honest, Google Chrome eats more memory these days. 44 | 45 | This setup is tested on MacOS but should work fine on Linux as well. Windows 46 | 10 has been tested and is still experimental (please see notes below). 47 | 48 | When following the installation instructions of the tools mentioned in the 49 | following chapter, please be sure to check the system requirements of each of 50 | those tools. 51 | 52 | ## Getting started 53 | 54 | Before launching your Hass.io environment, you must install 55 | [VirtualBox][virtualbox] 5.1 or higher INCLUDING the VirtualBox Extension Pack, 56 | as well as [Vagrant][vagrant] 2.1.0 or higher. These software packages provide 57 | easy-to-use visual installers for all popular operating systems 58 | and are open source. 59 | 60 | Once [VirtualBox][virtualbox] and [Vagrant][vagrant] have been installed, 61 | install `hassio-vagrant` by simply cloning this repository. Consider cloning 62 | the repository into a folder within your "home" directory. 63 | 64 | In case you are running this on a Linux system, you'll need to install `nfsd`. 65 | For example, on Ubuntu: `sudo apt-get install nfs-common nfs-kernel-server`. 66 | 67 | Now the installation of this Vagrant machine: 68 | 69 | ```bash 70 | # Goto your home directory 71 | cd ~ 72 | 73 | # Clone this repository into a folder called `hassio` 74 | git clone https://github.com/hassio-addons/hassio-vagrant.git hassio 75 | ``` 76 | 77 | You should check out a tagged version of `hassio-vagrant` since the `master` 78 | branch may not always be stable. You can find the latest stable version on the 79 | [GitHub Release Page][releases]: 80 | 81 | ```bash 82 | # Change the directory to `hassio` 83 | cd hassio 84 | 85 | # Checkout the desired release 86 | git checkout v1.2.0 87 | ```` 88 | 89 | Once you have cloned the `hassio-vagrant` repository, use the following 90 | command to start Hass.io: 91 | 92 | ```bash 93 | vagrant up hassio 94 | ``` 95 | 96 | After 10 minutes or so, the process should finish and the following messages 97 | will appear on your screen: 98 | 99 | ```txt 100 | ==> hassio: [INFO] Start services 101 | ==> hassio: ===================================================================== 102 | ==> hassio: Community Hass.io Add-ons: Vagrant 103 | ==> hassio: 104 | ==> hassio: Hass.io is installed & started! It may take a couple of minutes 105 | ==> hassio: before it is actually responding/available. 106 | ==> hassio: 107 | ==> hassio: Home Assitant is running on the following links: 108 | ==> hassio: - http://172.28.128.11:8123 109 | ==> hassio: - http://192.168.1.2:8123 110 | ==> hassio: ===================================================================== 111 | ==> hassio: 112 | ==> hassio: Machine 'hassio' has a post `vagrant up` message. This is a message 113 | ==> hassio: from the creator of the Vagrantfile, and not from Vagrant itself: 114 | ==> hassio: 115 | ==> hassio: Hass.io starting... wait a couple of minutes! 116 | ``` 117 | 118 | :tada: Congratulations! Happy testing/developing :smile: 119 | 120 | Note: _The links and IP addresses are examples, yours may differ and change 121 | each time you run this virtual machine_ 122 | 123 | ## Managing the virtual machine 124 | 125 | If you followed the above procedure, you have Hass.io up and running. 126 | But there may be a time where you need to shut it down, start up again or 127 | maybe start over again. 128 | 129 | Shutting down the virtual machine: 130 | 131 | ```bash 132 | vagrant halt hassio 133 | ``` 134 | 135 | Starting/Resuming the virtual machine again: 136 | 137 | ```bash 138 | vagrant up hassio 139 | ``` 140 | 141 | Destroying/Deleting the virtual machine: 142 | 143 | ```bash 144 | vagrant destroy hassio 145 | ``` 146 | 147 | After you've destroyed your Hass.io virtual machine, you can use the 148 | start command to create a fresh one. 149 | 150 | Note: _Please, be aware! Destroying the machine would make you lose your 151 | configuration of Home Assistant!_ 152 | 153 | You can also SSH into the virtual machine, giving you direct access 154 | to the Docker host: 155 | 156 | ```bash 157 | vagrant ssh hassio 158 | ``` 159 | 160 | ## Shared folders 161 | 162 | After starting the Hass.io virtual machine, some folders on your hard drive 163 | will be made available. These are shared folders with your Hass.io virtual 164 | machine. As files within these folders are changed, they will be kept in 165 | sync between your local machine and the Hass.io virtual environment. 166 | 167 | The following folders are provided within the location where you have cloned 168 | this repository to: 169 | 170 | - `addons` - May contain local add-on (e.g. for development). 171 | - `backup` - May contain snapshots made with Hass.io. 172 | - `config` - Contains the Home Assistant configuration. 173 | - `share` - Cross add-on shared folder. 174 | - `ssl` - May contain SSL certificate files. 175 | 176 | Note: _When destroying the Hass.io virtual machine, the contents of the 177 | `config` folder WILL BE DELETED. All other folders are left untouched._ 178 | 179 | ## Configuration 180 | 181 | This Vagrant box ships with a small configuration file, `configuration.yml`, 182 | that allows you to tweak some settings of the virtual machine. 183 | 184 | ### `memory` 185 | 186 | The number of megabytes of memory you want to give to the virtual machine. 187 | By default, this has been set to 1024Mb. This number is pretty low, but 188 | enough for most add-on development and ensures this setup can be run on 189 | almost any machine. Feel free to upgrade the memory if you have spare. 190 | 191 | ### `cpus` 192 | 193 | The number of CPU cores to give to the virtual machine. Defaults to 2. 194 | 195 | ### `hostname` 196 | 197 | The hostname of the virtual Hass.io machine. Defaults to `hassio`. It might 198 | be wise to change this, in case you already have a Hass.io device in your 199 | network. 200 | 201 | ### `bridge` 202 | 203 | Allows you to define the specific network interface to bridge to. By default, this 204 | is set to `~`, which is the same as _nothing set_ and causes Vagrant 205 | to ask you for the network interface to use each time you start the virtual 206 | machine. 207 | 208 | ### `keep_config` 209 | 210 | By default, if you destroy the virtual machine, the Home Assistant 211 | configuration is removed automatically as well. This is to ensure you 212 | have a fresh start each time you start the virtual machine. 213 | 214 | However, if you need to keep the configuration on the destruction of 215 | the virtual machine, you can simply set this option to `true`. 216 | 217 | ## Notes for Windows Users 218 | 219 | Please ensure you run all vagrant commands from Powershell. The `Vagrant up` 220 | command will prompt you to install the NFS addon, which is highly recommended. 221 | You can continue using SMB, but will likely encounter performance issues. 222 | This has only been tested using Windows 10 (1803), previous Windows versions 223 | may work, feedback is welcomed. 224 | 225 | When using the NFS addon, the winnfsd.exe process may not terminate on a halt 226 | command. This should be killed manually (Task Manager or your preferred method) 227 | prior to issuing a `Vagrant Up`. 228 | 229 | ## Changelog & Releases 230 | 231 | This repository keeps a change log using [GitHub's releases][releases] 232 | functionality. The format of the log is based on 233 | [Keep a Changelog][keepchangelog]. 234 | 235 | Releases are based on [Semantic Versioning][semver], and use the format 236 | of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented 237 | based on the following: 238 | 239 | - ``MAJOR``: Incompatible or major changes. 240 | - ``MINOR``: Backwards-compatible new features and enhancements. 241 | - ``PATCH``: Backwards-compatible bugfixes and package updates. 242 | 243 | ## Support 244 | 245 | Got questions? 246 | 247 | You have several options to get them answered: 248 | 249 | - The Home Assistant [Community Forum][forum], we have a 250 | [dedicated topic][forum] on that forum regarding this repository. 251 | - The Home Assistant [Discord Chat Server][discord] for general Home Assistant 252 | discussions and questions. 253 | - Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] 254 | 255 | You could also [open an issue here][issue] GitHub. 256 | 257 | ## Contributing 258 | 259 | This is an active open-source project. We are always open to people who want to 260 | use the code or contribute to it. 261 | 262 | We have set up a separate document containing our 263 | [contribution guidelines](CONTRIBUTING.md). 264 | 265 | Thank you for being involved! :heart_eyes: 266 | 267 | ## Authors & contributors 268 | 269 | The original setup of this repository is by [Franck Nijhof][frenck]. 270 | 271 | For a full list of all authors and contributors, 272 | check [the contributor's page][contributors]. 273 | 274 | ## We have got some Hass.io add-ons for you 275 | 276 | Want some more functionality to your Hass.io Home Assistant instance? 277 | 278 | We have created multiple add-ons for Hass.io. For a full list, check out 279 | our [GitHub Repository][repository]. 280 | 281 | ## License 282 | 283 | MIT License 284 | 285 | Copyright (c) 2017 Franck Nijhof 286 | 287 | Permission is hereby granted, free of charge, to any person obtaining a copy 288 | of this software and associated documentation files (the "Software"), to deal 289 | in the Software without restriction, including without limitation the rights 290 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 291 | copies of the Software, and to permit persons to whom the Software is 292 | furnished to do so, subject to the following conditions: 293 | 294 | The above copyright notice and this permission notice shall be included in all 295 | copies or substantial portions of the Software. 296 | 297 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 298 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 299 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 300 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 301 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 302 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 303 | SOFTWARE. 304 | 305 | [codeclimate-shield]: https://img.shields.io/badge/code%20climate-protected-brightgreen.svg 306 | [codeclimate]: https://codeclimate.com/github/hassio-addons/hassio-vagrant 307 | [commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-ssh.svg 308 | [commits]: https://github.com/hassio-addons/addon-ssh/commits/master 309 | [contributors]: https://github.com/hassio-addons/hassio-vagrant/graphs/contributors 310 | [discord-shield]: https://img.shields.io/discord/330944238910963714.svg 311 | [discord]: https://discord.gg/c5DvZ4e 312 | [downloads-shield]: https://img.shields.io/github/downloads/hassio-addons/hassio-vagrant/total.svg 313 | [forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg 314 | [forum]: https://community.home-assistant.io/t/repository-community-hass-io-add-ons/24705?u=frenck 315 | [frenck]: https://github.com/frenck 316 | [home-assistant]: https://home-assistant.io/ 317 | [issue]: https://github.com/hassio-addons/hassio-vagrant/issues 318 | [keepchangelog]: http://keepachangelog.com/en/1.0.0/ 319 | [license-shield]: https://img.shields.io/github/license/hassio-addons/hassio-vagrant.svg 320 | [maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg 321 | [project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg 322 | [reddit]: https://reddit.com/r/homeassistant 323 | [releases-shield]: https://img.shields.io/github/release/hassio-addons/hassio-vagrant.svg 324 | [releases]: https://github.com/hassio-addons/hassio-vagrant/releases 325 | [repository]: https://github.com/hassio-addons/repository 326 | [semver]: http://semver.org/spec/v2.0.0.html 327 | [vagrant]: https://www.vagrantup.com/ 328 | [virtualbox]: https://www.virtualbox.org/ 329 | --------------------------------------------------------------------------------