├── README.md ├── homeassistant_ver_switch.sh └── install.sh /README.md: -------------------------------------------------------------------------------- 1 | # 本脚本不再维护,江湖再见! 2 | 3 | # 请参阅官方 supervisor installer 项目获取安装方法 4 | # [supervised-installer](https://github.com/home-assistant/supervised-installer) 5 | 6 | # hassio_install 7 | 8 | hassio 一键安装脚本,实现以下功能。 9 | 10 | 1. 自动更改系统源为清华源。(目前支持 Debian Ubuntu Raspbian 三款系统) 11 | 2. 自动安装 Docker,可以选择切换 Docker 源为国内源,提高容器下载速度。 12 | 13 | ## 目前支持的系统 14 | 15 | - [Raspberry Pi OS Lite](https://www.raspberrypi.org/software/operating-systems/) 测试版本 Raspberry Pi OS Lite 2020年12月2日通过 16 | - [Ubuntu](https://www.ubuntu.com/download/server) 测试版本 12.04 LTS测试通过。 17 | - [Debian](https://www.debian.org/distrib/netinst) 测试版本 >=10 最小化版本测试通过。 18 | 19 | ## 使用方法 20 | 21 | 以 root 身份运行以下命令。 22 | 23 | ```bash 24 | wget https://code.aliyun.com/neroxps/hassio_install/raw/master/install.sh 25 | chmod a+x install.sh 26 | ./install.sh 27 | ``` 28 | 29 | ### 如果安装的是 64 位系统,脚本会自动筛选适配 64 位的设备列表 30 | 31 | ``` 32 | (1). 是否将系统源切换为中科大(USTC)源(目前支持 Debian Ubuntu Raspbian 三款系统) 33 | 请输入 y or n(默认 yes):y 34 | 35 | 36 | (2). 在你系统内找到 nero 用户,是否将其添加至 docker 用户组。 37 | 请输入 yes 或者 no (默认 yes):y 38 | 将nero用户添加至 docker 用户组。 39 | 40 | 41 | (3).是否需要替换 docker 默认源? 42 | 请输入 yes 或者 no(默认:yes):y 43 | 44 | 45 | (4).请选择你设备类型(默认:qemux86-64) 46 | [1]: raspberrypi3-64 47 | [2]: qemuarm-64 48 | [3]: qemux86-64 49 | 输入数字 (1-3): 50 | 你选择了 qemux86-64 51 | ################################################################################ 52 | # 1. 是否将系统源切换为中科大(USTC)源: 是 53 | # 2. 是否将用户添加至 Docker 用户组: 是,添加用户为 nero 54 | # 3. 是否将 Docker 源切换至国内源: 是 55 | # 4. 您的设备类型为: qemux86-64 56 | ################################################################################ 57 | 请确认以上信息,继续请按任意键,如需修改请输入 Ctrl+C 结束任务重新执行脚本。 58 | ``` 59 | 60 | ### 如果安装的是 32 位系统,脚本会自动筛选适配32位的设备列表 61 | 62 | ``` 63 | (1). 是否将系统源切换为中科大(USTC)源(目前支持 Debian Ubuntu Raspbian 三款系统) 64 | 请输入 y or n(默认 yes):y 65 | 66 | 67 | (2). 在你系统内找到 nero 用户,是否将其添加至 docker 用户组。 68 | 请输入 yes 或者 no (默认 yes):y 69 | 将nero用户添加至 docker 用户组。 70 | 71 | 72 | (3).是否需要替换 docker 默认源? 73 | 请输入 yes 或者 no(默认:yes):y 74 | 75 | 76 | (4).请选择你设备类型(默认:qemux86) 77 | [1]: raspberrypi 78 | [2]: raspberrypi2 79 | [3]: raspberrypi3 80 | [4]: qemuarm 81 | [5]: qemux86 82 | [6]: intel-nuc 83 | 输入数字 (1-6): 84 | 你选择了 qemux86 85 | ################################################################################ 86 | # 1. 是否将系统源切换为中科大(USTC)源: 是 87 | # 2. 是否将用户添加至 Docker 用户组: 是,添加用户为 nero 88 | # 3. 是否将 Docker 源切换至国内源: 是 89 | # 4. 您的设备类型为: qemux86 90 | ################################################################################ 91 | 请确认以上信息,继续请按任意键,如需修改请输入 Ctrl+C 结束任务重新执行脚本。 92 | ``` 93 | 94 | ### 设备类型选型说明 95 | - intel-nuc :英特尔的nuc小主机 96 | - odroid-c2 :韩国odroid-c2 97 | - odroid-xu :韩国odroid-xu 98 | - orangepi-prime :香橙派 99 | - qemuarm :通用arm设备(例如斐讯N1) 100 | - qemuarm-64 :通用arm设备(例如斐讯N1) 64位系统 101 | - qemux86 :通用X86 64位系统(普通的PC机电脑) 102 | - qemux86-64 :通用X86(普通的PC机电脑)64位系统 103 | - raspberrypi :树莓派一代 104 | - raspberrypi2 :树莓派二代 105 | - raspberrypi3 :树莓派三代 106 | - raspberrypi4 :树莓派四代 107 | - raspberrypi3-64 :树莓派三代64位系统 108 | - raspberrypi4-64 :树莓派四代64位系统 109 | - tinker :华硕tinker 110 | 111 | ## 操作说明 112 | 113 | ### 停止(但重启依然会自启动) 114 | systemctl stop hassio-supervisor.service 115 | 116 | ### 重启 117 | systemctl restart hassio-supervisor.service 118 | 119 | ### 禁用自启动 120 | `systemctl disable hassio-supervisor.service` 121 | 122 | ### 启用自启动 123 | `systemctl enable hassio-supervisor.service` 124 | 125 | ### 查询当前启动状态 126 | `systemctl status hassio-supervisor.service` 127 | 128 | ### 查询当前是否自启动 129 | `systemctl is-enabled hassio-supervisor.service` 130 | 131 | ### 查询 hassio 日志 132 | `docker logs -f hassio_supervisor` 133 | 134 | ### 查询 hassio 日志最新20行信息 135 | `docker logs -f hassio_supervisor --tail 20` 136 | 137 | ### 查询 ha 日志 138 | `docker logs -f homeassistant` 139 | 140 | ### 查询 ha 日志最新20行信息 141 | `docker logs -f homeassistant --tail 20` 142 | 143 | > systemctl 说明 : [https://linux.cn/article-5926-1.html](https://linux.cn/article-5926-1.html) 144 | > docker logs 命令用法:[https://docs.docker.com/engine/reference/commandline/logs](https://docs.docker.com/engine/reference/commandline/logs) 145 | 146 | # Homeassistant 版本切换脚本 147 | 148 | 此脚本可在宿主中切换homeassistant版本号 149 | 150 | ## 严重警告 151 | 1. 切换版本的 home-assistant 请先备份好配置文件,虽然脚本会自动备份,但最好自己再备份一次,出现丢失配置情况恕不负责。 152 | 2. 切换旧版本启动失败的,请查看 home-assistant 的日志来修复错误配置 153 | 3. 切换过旧的版本会导致 hassio 加载 404,目前已知 0.77 以前版本都无法正常加载 hassio 154 | 4. 启动失败可以到论坛带日志发帖求助,无日志发帖我将会扣分处理 155 | 156 | ## 使用方法 157 | 158 | 使用 root 运行一下命令 159 | 160 | ``` 161 | wget https://code.aliyun.com/neroxps/hassio_install/raw/master/homeassistant_ver_switch.sh 162 | chmod u+x homeassistant_ver_switch.sh 163 | ./homeassistant_ver_switch.sh 0.92.2 164 | ``` 165 | -------------------------------------------------------------------------------- /homeassistant_ver_switch.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | version=$1 3 | if [[ -z ${version} ]]; then 4 | echo '请输入需要切换的 homeassistant 版本号' 5 | exit 1 6 | fi 7 | 8 | # 检查 hassio 运行状态 9 | if ! docker ps --format {{.Names}} | grep hassio_supervisor -q ; then 10 | echo "未在运行容器列表中找到 hassio_supervisor" 11 | docker ps 12 | exit 1 13 | fi 14 | if ! docker ps --format {{.Names}} | grep homeassistant -q ; then 15 | echo "未在运行容器列表中找到 homeassistant" 16 | docker ps 17 | exit 1 18 | fi 19 | 20 | # 获取配置文件目录 21 | config_path=$(jq -r '.data' /etc/hassio.json || echo '未找到hassio.json 停止版本切换脚本' && exit 1) 22 | homeassistant_config_path="${config_path}/homeassistant" 23 | homeassistant_config_backup_path="${homeassistant_config_path}-bak" 24 | 25 | # 获取版本号列表并进行校验 26 | echo "正在校验输入版本号是否正确....." 27 | images_tags="$(wget -q https://registry.hub.docker.com/v1/repositories/homeassistant/qemux86-64-homeassistant/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}')" 28 | if ! echo "${images_tags}" | grep -q ${version};then 29 | echo "输入的版本号错误,请输入正确的版本号,脚本退出." 30 | exit 1 31 | else 32 | echo "输入的版本号正确,开始切换流程...." 33 | fi 34 | 35 | # 设置脚本退出时执行的函数 36 | function exit_fun(){ 37 | # 恢复备份配置文件夹 38 | if [[ -d ${homeassistant_config_backup_path} ]]; then 39 | 40 | # 把自动生成的配置文件夹移动到tmp由系统自动清理 41 | if [[ -d ${homeassistant_config_path} ]]; then 42 | mv "${homeassistant_config_path}" "/tmp/homeassistant-bak2" 43 | fi 44 | 45 | echo "恢复备份配置文件夹...." 46 | mv ${homeassistant_config_backup_path} ${homeassistant_config_path} 47 | fi 48 | # 结束 hassio 日志显示进程 49 | if [[ ! -z ${logger_runing_pid} ]]; then 50 | kill ${logger_runing_pid} 51 | fi 52 | } 53 | trap exit_fun EXIT 54 | 55 | # 显示警告 56 | echo "############################ 警告 ################################" 57 | echo "由于 hassio 带有保护机制" 58 | echo "如当前的配置文件与切换的版本不符会导致 homeassistant 启动失败" 59 | echo "hassio 会自动安装回之前升/降级版本,从而导致版本切换失败" 60 | echo "故此,脚本会先备份您当前的配置文件为 ${homeassistant_config_backup_path}" 61 | echo "脚本会在退出的时候恢复目录结构" 62 | echo "降级后出现 hassio 404 的无解,请更新到最新版本。" 63 | echo '##################################################################' 64 | echo '' 65 | while true;do 66 | echo -e "是否清楚以上说明:" 67 | read -p "请输入 yes 或 no (默认:no):" selected 68 | case ${selected} in 69 | Yes|YES|yes|y|Y) 70 | mv "${homeassistant_config_path}" "${homeassistant_config_backup_path}" 71 | break; 72 | ;; 73 | ''|No|NO|no|n|N) 74 | echo -e "脚本退出...." 75 | exit 1 76 | ;; 77 | *) 78 | echo -e "请输入 Yes 或者 No 后按回车确认。" 79 | ;; 80 | esac 81 | done 82 | 83 | echo "获取 HASSIO_TOKEN" 84 | HASSIO_TOKEN=$(docker exec -t homeassistant bash -c 'echo $HASSIO_TOKEN' | tr -d '\r') 85 | echo "正在执行版本切换到 ${version} 请稍等片刻......" 86 | 87 | # 显示 hassio 日志 88 | docker logs --tail 10 -f hassio_supervisor & 89 | logger_runing_pid=$(echo $!) 90 | 91 | docker exec -t -e version=${version} -e HASSIO_TOKEN=${HASSIO_TOKEN} hassio_supervisor bash -c 'curl -X POST -H "X-HASSIO-KEY:$HASSIO_TOKEN" -d "{\"version\":\"$version\"}" http://hassio/homeassistant/update' 92 | echo '' 93 | 94 | # 还原配置流程 95 | echo '还原配置目录后重启 homeassistant....' 96 | mv "${homeassistant_config_path}" "/tmp/" 97 | mv ${homeassistant_config_backup_path} ${homeassistant_config_path} 98 | docker restart homeassistant 99 | printf "等待 homeassistant 启动" 100 | for ((i=0;i<=300;i++));do 101 | if netstat -napt |grep 8123 > /dev/null ;then 102 | printf "done\n" 103 | echo "homeassistant 启动完成,版本切换成功" 104 | echo "查看 homeassistant 日志命令: docker logs -f homeassistant" 105 | echo "查看 hassio_supervisor 日志命令: docker logs -f hassio_supervisor" 106 | echo "重启 homeassistant 命令:docker restart homeassistant" 107 | echo "不看日志或者不把日志发出来的,请不要在论坛上发帖求助。" 108 | exit 109 | fi 110 | sleep 1 111 | printf "." 112 | done 113 | printf "fail\n" 114 | echo "启动失败,请根据日志报错信息修改配置文件以兼容当前版本" 115 | echo "查看 homeassistant 日志命令: docker logs -f homeassistant" 116 | echo "查看 hassio_supervisor 日志命令: docker logs -f hassio_supervisor" 117 | echo "重启 homeassistant 命令:docker restart homeassistant" 118 | echo "不看日志或者不把日志发出来的,请不要在论坛上发帖求助。" 119 | exit -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 颜色 4 | red='\033[0;31m' 5 | green='\033[0;32m' 6 | yellow='\033[0;33m' 7 | plain='\033[0m' 8 | script_version="2021.04.09.0" 9 | 10 | function info { echo -e "\e[32m[info] $*\e[39m"; } 11 | function warn { echo -e "\e[33m[warn] $*\e[39m"; } 12 | function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; } 13 | 14 | # 变量 15 | ## 安装必备依赖 16 | Ubunt_Debian_Requirements="curl socat jq avahi-daemon net-tools network-manager qrencode apparmor apparmor-utils" 17 | 18 | ## 获取系统用户用作添加至 docker 用户组 19 | users=($(cat /etc/passwd | awk -F: '$3>=500' | cut -f 1 -d :| grep -v nobody)) 20 | users_num=${#users[*]} 21 | 22 | title_num=1 23 | check_massage=() 24 | dns_ipaddress="" 25 | 26 | ## 检查系统架构以区分 machine 27 | if [[ $(getconf LONG_BIT) == "64" ]]; then 28 | machine_map=(intel-nuc odroid-c2 odroid-xu orangepi-prime qemuarm-64 qemux86-64 raspberrypi3-64 raspberrypi4-64 tinker) 29 | machine_info=("英特尔的nuc小主机" "韩国odroid-c2" "韩国odroid-xu" "香橙派" "通用arm设备(例如斐讯N1) 64位系统" "通用X86(普通的PC机电脑)64位系统" "树莓派三代64位系统" "树莓派四代64位系统" "华硕tinker") 30 | default_machine="qemux86-64" 31 | elif [[ $(getconf LONG_BIT) == "32" ]]; then 32 | machine_map=(intel-nuc odroid-c2 odroid-xu orangepi-prime qemuarm qemux86 raspberrypi raspberrypi2 raspberrypi3 raspberrypi4 tinker) 33 | machine_info=("英特尔的nuc小主机" "韩国odroid-c2" "韩国odroid-xu" "香橙派" "通用arm设备(例如斐讯N1)" "通用X86(普通的PC机电脑)" "树莓派一代" "树莓派二代" "树莓派三代" "树莓派四代" "华硕tinker") 34 | default_machine="qemux86" 35 | else 36 | machine_map=(intel-nuc odroid-c2 odroid-xu orangepi-prime qemuarm qemuarm-64 qemux86 qemux86-64 raspberrypi raspberrypi2 raspberrypi3 raspberrypi4 raspberrypi3-64 raspberrypi4-64 tinker) 37 | machine_info=("英特尔的nuc小主机" "韩国odroid-c2" "韩国odroid-xu" "香橙派" "通用arm设备(例如斐讯N1)" "通用arm设备(例如斐讯N1) 64位系统" "通用X86 64位系统(普通的PC机电脑)" "通用X86(普通的PC机电脑)64位系统" "树莓派一代" "树莓派二代" "树莓派三代" "树莓派四代" "树莓派三代64位系统" "树莓派四代64位系统" "华硕tinker") 38 | default_machine="qemux86-64" 39 | fi 40 | machine_num=${#machine_map[*]} 41 | 42 | # Function 43 | 44 | ## 这个方法抄袭自 https://github.com/teddysun/shadowsocks_install 45 | check_sys(){ 46 | if [[ -f /etc/redhat-release ]]; then 47 | release="centos" 48 | systemPackage="yum" 49 | elif grep -Eqi "raspbian" /etc/*-release ; then 50 | kernel_version=$(uname -r | grep -oP '\d+\.\d+\.\d+') 51 | if version_lt "${kernel_version}" "5.4.79";then 52 | error "当前 ${kernel_version} 内核系统暂不支持 apparmor 内核模块需要更新内核(≥ 5.4.79)。" 53 | fi 54 | release="raspbian" 55 | systemPackage="apt" 56 | systemCodename=$(grep "VERSION_CODENAME" /etc/*-release | awk -F '=' '{print $2}') 57 | elif grep -Eqi "ubuntu" /etc/issue; then 58 | release="ubuntu" 59 | systemPackage="apt" 60 | systemCodename=$(grep "VERSION_CODENAME" /etc/*-release | awk -F '=' '{print $2}') 61 | elif grep -Eqi "debian" /etc/issue; then 62 | release="debian" 63 | systemPackage="apt" 64 | systemCodename=$(grep "VERSION_CODENAME" /etc/*-release | awk -F '=' '{print $2}') 65 | elif grep -Eqi "centos|red hat|redhat" /etc/issue; then 66 | release="centos" 67 | systemPackage="yum" 68 | elif grep -Eqi "centos|red hat|redhat" /proc/version; then 69 | release="centos" 70 | systemPackage="yum" 71 | fi 72 | } 73 | 74 | ## 下载文件方法 75 | download_file(){ 76 | local url=$1 77 | local file_name=$2 78 | if [ -z ${file_name} ];then 79 | if which curl > /dev/null 2>&1 ; then 80 | curl -# -O ${url} 81 | else 82 | wget ${url} 83 | fi 84 | else 85 | if which curl > /dev/null 2>&1 ; then 86 | curl -# -o ${file_name} ${url} 87 | else 88 | wget --output-document=${file_name} ${url} 89 | fi 90 | fi 91 | if [[ $? -ne 0 ]];then 92 | error "下载 ${url} 失败,请检查网络与其连接是否正常。" 93 | fi 94 | } 95 | 96 | ## 切换安装源 97 | replace_source(){ 98 | if [[ -z ${systemCodename} ]]; then 99 | error "由于无法确定系统版本,故请手动切换系统源,切换方法参考清华源使用方法:http://mirrors.ustc.edu.cn/help/" 100 | fi 101 | [[ ! -f /etc/apt/sources.list.bak ]] && warn "备份系统源文件为 /etc/apt/sources.list.bak" && mv /etc/apt/sources.list /etc/apt/sources.list.bak 102 | 103 | # 清华源 104 | 105 | case $(uname -m) in 106 | "x86_64" | "i686" | "i386" ) 107 | # debian from x86_64 108 | if [[ ${release} == "debian" ]]; then 109 | { 110 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename} main contrib non-free" 111 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename}-updates main contrib non-free" 112 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename}-backports main contrib non-free" 113 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security ${systemCodename}/updates main contrib non-free" 114 | } > /etc/apt/sources.list 115 | fi 116 | 117 | # Ubuntu from x86_64 118 | if [[ ${release} == "ubuntu" ]]; then 119 | { 120 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${systemCodename} main restricted universe multiverse" 121 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${systemCodename}-updates main restricted universe multiverse" 122 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${systemCodename}-backports main restricted universe multiverse" 123 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${systemCodename}-security main restricted universe multiverse" 124 | } > /etc/apt/sources.list 125 | fi 126 | ;; 127 | "arm" | "armv7l" | "armv6l" | "aarch64" | "armhf" | "arm64" | "ppc64el") 128 | if [[ -f /etc/apt/sources.list.d/armbian.list ]] ;then 129 | warn "发现 armbian 源,替换清华源,如需要恢复请自行到 /etc/apt/sources.list.d/ 文件夹中删除后缀名 \".bak\"" 130 | cp /etc/apt/sources.list.d/armbian.list /etc/apt/sources.list.d/armbian.list.bak 131 | sed -i 's|http[s]*://apt.armbian.com|http://mirrors.tuna.tsinghua.edu.cn/armbian|g' /etc/apt/sources.list.d/armbian.list 132 | fi 133 | 134 | # debian from ARM 135 | if [[ ${release} == "debian" ]]; then 136 | { 137 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename} main contrib non-free" 138 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename}-updates main contrib non-free" 139 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${systemCodename}-backports main contrib non-free" 140 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security ${systemCodename}/updates main contrib non-free" 141 | } > /etc/apt/sources.list 142 | fi 143 | 144 | # Ubuntu from ARM 145 | if [[ ${release} == "ubuntu" ]]; then 146 | { 147 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ ${systemCodename} main restricted universe multiverse" 148 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ ${systemCodename}-updates main restricted universe multiverse" 149 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ ${systemCodename}-backports main restricted universe multiverse" 150 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ ${systemCodename}-security main restricted universe multiverse" 151 | } > /etc/apt/sources.list 152 | fi 153 | 154 | if [[ ${release} == "raspbian" ]]; then 155 | { 156 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ ${systemCodename} main non-free contrib rpi" 157 | echo "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ ${systemCodename} main non-free contrib rpi" 158 | } > /etc/apt/sources.list 159 | if [[ -f "/etc/apt/sources.list.d/raspi.list" ]]; then 160 | echo "deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ ${systemCodename} main" > "/etc/apt/sources.list.d/raspi.list" 161 | fi 162 | fi 163 | ;; 164 | *) error "[ERROR]: 由于无法获取系统架构,故此无法切换系统源,请跳过系统源切换。" 165 | ;; 166 | esac 167 | 168 | apt update 169 | if [[ $? -ne 0 ]]; then 170 | mv /etc/apt/sources.list.bak /etc/apt/sources.list 171 | error "[ERROR]: 系统源切换错误,请检查网络连接是否正常,脚本退出" 172 | fi 173 | } 174 | 175 | ## 更新系统 176 | update_system(){ 177 | if [[ ${release} == "debian" ]] || [[ ${release} == "ubuntu" ]] || [[ ${release} == "raspbian" ]]; then 178 | apt upgrade -y 179 | if [[ $? != 0 ]]; then 180 | error "[ERROR]: 系统更新失败,脚本退出。" 181 | fi 182 | info "系统更新成功。" 183 | fi 184 | if [[ ${release} == "ubuntu" ]] ; then 185 | add-apt-repository main 186 | add-apt-repository universe 187 | add-apt-repository restricted 188 | add-apt-repository multiverse 189 | apt update 190 | fi 191 | } 192 | 193 | ## 安装 docker 194 | docker_install(){ 195 | download_file 'https://get.docker.com' 'get-docker.sh' 196 | sed -i 's/DEFAULT_CHANNEL_VALUE="test"/DEFAULT_CHANNEL_VALUE="stable"/' get-docker.sh 197 | chmod u+x get-docker.sh 198 | ./get-docker.sh --mirror Aliyun 199 | if ! systemctl status docker > /dev/null 2>&1 ;then 200 | error "Docker 安装失败,请检查上方安装错误信息。 你也可以选择通过搜索引擎,搜索你系统安装docker的方法,安装后重新执行脚本。" 201 | else 202 | info "Docker 安装成功。" 203 | fi 204 | if [[ ! -z ${add_User_Docker} ]];then 205 | warn "添加用户 ${add_User_Docker} 到 Docker 用户组" 206 | usermod -aG docker ${add_User_Docker} 207 | fi 208 | } 209 | 210 | ## apt 安装依赖方法 211 | apt_install(){ 212 | apt update 213 | apt install -y ${*} 214 | if [[ $? -ne 0 ]];then 215 | error "安装${*}失败,请将检查上方安装错误信息。" 216 | fi 217 | } 218 | 219 | 220 | ## 修改 docker 源 221 | change_docker_registry(){ 222 | if [ ! -d /etc/docker ];then 223 | mkdir -p /etc/docker 224 | fi 225 | cat << EOF > /etc/docker/daemon.json 226 | { 227 | "log-driver": "journald", 228 | "storage-driver": "overlay2", 229 | "registry-mirrors": [ 230 | "https://hub-mirror.c.163.com", 231 | "https://docker.mirrors.ustc.edu.cn" 232 | ] 233 | } 234 | EOF 235 | systemctl daemon-reload 236 | systemctl restart docker > /dev/null 237 | info "切换国内源完成" 238 | } 239 | 240 | ## hassio 安装 241 | hassio_install(){ 242 | local i=10 243 | while true;do 244 | stable_json=$(curl -Ls https://version.home-assistant.io/stable.json) 245 | if [[ ! -z ${stable_json} ]]; then 246 | break; 247 | fi 248 | if [[ $i -eq 0 ]]; then 249 | error "获取 hassio 版本号失败,请检查你系统网络与 https://version.home-assistant.io 的连接是否正常。" 250 | fi 251 | let i-- 252 | done 253 | hassio_version=$(echo ${stable_json} |jq -r '.supervisor') 254 | homeassistant_version=$(echo ${stable_json} |jq -r '.homeassistant.default') 255 | if [ -z ${hassio_version} ] || [ -z ${homeassistant_version} ];then 256 | error "获取 hassio 版本号失败,请检查你网络与 https://version.home-assistant.io 连接是否畅通。" 257 | fi 258 | local x=1 259 | while true ; do 260 | [[ $x -eq 10 ]] && error "获取 hassio 官方一键脚本失败,请检查你系统网络与 https://code.aliyun.com/ 的连接是否正常。" 261 | warn "下载 hassio_install.sh 官方脚本 第${x}次" 262 | download_file 'https://code.aliyun.com/neroxps/supervised-installer/raw/master/installer.sh' 'hassio_install.sh' 263 | grep -q '#!/usr/bin/env bash' hassio_install.sh && break 264 | ((x++)) 265 | done 266 | chmod u+x hassio_install.sh 267 | sed -i "s/HASSIO_VERSION=.*/HASSIO_VERSION=${hassio_version}/g" ./hassio_install.sh 268 | # 替换链接到阿里云加速 269 | sed -i 's@https://raw.githubusercontent.com/home-assistant/supervised-installer/master/@https://code.aliyun.com/neroxps/supervised-installer/raw/master/@g' ./hassio_install.sh 270 | # interfaces 不替换ip设置 271 | sed -i 's@read answer < /dev/tty@answer=n@' ./hassio_install.sh 272 | # 清除警告等待 273 | sed -i 's/sleep 10//' ./hassio_install.sh 274 | # 等待 NetworkManager 重启完毕 275 | reset_network_line_num=$(grep -n 'systemctl restart "${SERVICE_NM}"' ./hassio_install.sh | awk -F ':' '{print $1}') 276 | add_shell='i=20\ninfo "Wait for networkmanages to start."\nwhile ! systemctl status ${SERVICE_NM} >/dev/null 2>&1; do\n sleep 1\nlet i--\n [[ i -eq 0 ]] && warn "networkmanages failed to start" && break\ndone' 277 | sed -i "${reset_network_line_num} a${add_shell}" ./hassio_install.sh 278 | 279 | warn "从 hub.docker.com 下载 homeassistant/${machine}-homeassistant:${homeassistant_version}......" 280 | local i=10 281 | while true ;do 282 | docker pull homeassistant/${machine}-homeassistant:${homeassistant_version} 283 | if [[ $? -eq 0 ]]; then 284 | docker tag homeassistant/${machine}-homeassistant:${homeassistant_version} homeassistant/${machine}-homeassistant:latest 285 | break; 286 | else 287 | warn "[WARNING]: 从 docker hub 下载 homeassistant/${machine}-homeassistant:${homeassistant_version} 失败,第 ${i} 次重试." 288 | if [[ ${i} -eq 0 ]]; then 289 | error "从 docker 下载 homeassistant/${machine}-homeassistant:${homeassistant_version} 失败,请检查上方失败信息。" 290 | fi 291 | fi 292 | let i-- 293 | done 294 | warn "开始 hassio 安装流程。(如出现 [Warning] 请忽略,无须理会)" 295 | ./hassio_install.sh -m ${machine} --data-share ${data_share_path} 296 | 297 | if ! systemctl status hassio-supervisor > /dev/null ; then 298 | error "安装 hassio 失败,请将上方安装信息发送到论坛询问。脚本退出..." 299 | fi 300 | } 301 | 302 | ubuntu_docker_install(){ 303 | apt install docker.io -y 304 | } 305 | 306 | error(){ 307 | echo -e "${red}" 308 | echo "################# 发到论坛时,请把上方日志也一并粘贴发送 ################" 309 | echo "########################### Script Version: ${script_version}###########################" 310 | echo "########################### System version ###########################" 311 | lsb_release -a 2>/dev/null 312 | echo "########################### System version 2 ###########################" 313 | cat /proc/version 314 | echo "########################### System info ###########################" 315 | uname -a 316 | echo "########################### END ###########################" 317 | echo "${1}" 318 | echo -e "${plain}" 319 | warn " 相关问题可以访问https://bbs.iobroker.cn/t/topic/1404或者加QQ群776817275咨询" 320 | exit 1 321 | } 322 | 323 | wait_homeassistant_run(){ 324 | info "等待 homeassistant 启动(由于 hassio 启动需要从 github pull addons 的库,所以启动速度视 pull 速度而定。)" 325 | while true; do 326 | if docker ps| grep -q hassio_supervisor; then 327 | docker logs -f hassio_supervisor & 328 | logs_pid=$! 329 | break; 330 | fi 331 | done 332 | supervisor_log_file=$(docker inspect --format='{{.LogPath}}' hassio_supervisor) 333 | for ((i=0;i<=3000;i++));do 334 | if netstat -napt |grep 8123 > /dev/null ;then 335 | kill ${logs_pid} 336 | return 0 337 | fi 338 | sleep 1 339 | done 340 | kill ${logs_pid} 341 | return 1 342 | } 343 | 344 | #检查 IP 合法性 345 | check_ip() 346 | { 347 | IP=$1 348 | if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 349 | FIELD1=$(echo $IP|cut -d. -f1) 350 | FIELD2=$(echo $IP|cut -d. -f2) 351 | FIELD3=$(echo $IP|cut -d. -f3) 352 | FIELD4=$(echo $IP|cut -d. -f4) 353 | if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then 354 | return 0 355 | else 356 | return 1 357 | fi 358 | else 359 | return 1 360 | fi 361 | } 362 | 363 | #通过默认网关的网卡接口获取本机有效的IP地址 364 | get_ipaddress(){ 365 | local device_name=$(netstat -rn | grep -e '^0\.0\.0\.0' | awk '{print $8}' | head -n1) 366 | ipaddress=$(ifconfig ${device_name} | grep "inet"| grep -v "inet6" | awk '{ print $2}') 367 | if ! check_ip ${ipaddress} ;then 368 | ipaddress='你的服务器的IP地址' 369 | fi 370 | } 371 | 372 | # 打印赞赏二维码 373 | print_sponsor(){ 374 | local url='https://qr.alipay.com/fkx16030bqmbsoauc8ezmce' 375 | echo '' 376 | warn " [支付宝]: 如果你觉得本脚本帮到您,可以选择请我喝杯咖啡喔~😊 " 377 | qrencode -t UTF8 "${url}" 378 | } 379 | 380 | #更新 github hosts 文件到 coreDNS 的 hosts 文件里加速 addons clone 速度 381 | ## hosts 文件来自 github.com/jianboy/github-host 项目 382 | github_set_hosts_to_coreDNS(){ 383 | info "开始 github hosts 流程" 384 | local hosts_path="${data_share_path}/dns/hosts" 385 | local github_host_url='https://cdn.jsdelivr.net/gh/jianboy/github-host/hosts' 386 | local github_hosts 387 | 388 | # 获取最新的 github 地址 389 | githubHosts_get_hosts(){ 390 | local i=0 391 | while [[ -z ${github_hosts} ]];do 392 | github_hosts=$(curl -sL ${github_host_url}) 393 | ((i=i+1)) 394 | if [[ i -gt 10 ]]; then 395 | warn "尝试 10 次依然无法从 ${github_host_url} 下载 hosts,请检查网络连通性." 396 | warn "跳过 github hosts 设置." 397 | return 1 398 | fi 399 | done 400 | info "github hosts 下载完成." 401 | } 402 | 403 | # 写入 hosts 文件 404 | write_hosts(){ 405 | # 等待 coreDNS 的 hosts 文件生成后再写入 406 | info "等待 coreDNS 的 hosts 文件生成后写入 github hosts" 407 | while true;do 408 | if [[ -f ${hosts_path} ]] && [[ $(wc -l ${hosts_path} 2>/dev/null | awk '{print $1}') -gt 0 ]]; then 409 | info "写入 github ip 到 hosts 文件." 410 | sleep 3 411 | echo "${github_hosts}" >> ${hosts_path} 412 | break; 413 | fi 414 | sleep 1 415 | done 416 | info "github hosts 写入完毕." 417 | } 418 | githubHosts_get_hosts && write_hosts 419 | } 420 | 421 | # 修改 hassio_dns 上游 DNS 设置为本地路由服务器 422 | setting_hassio_dns_option_dns_server(){ 423 | info "开始设置 hassio_dns 上游 DNS 服务器" 424 | while true ; do 425 | if ha dns info > /dev/null 2>&1; then 426 | sleep 3 427 | info "hassio_dns 已启动,正应用 dns 设置" 428 | ha dns option --servers "dns://${dns_ipaddress}" 429 | ha dns restart 430 | break; 431 | fi 432 | sleep 1 433 | done 434 | } 435 | 436 | # 检查出国旅游连通性 437 | check_proxy_status(){ 438 | info "正在通过访问 www.youtube.com 检查旅游环境" 439 | if ! wget -q --connect-timeout 20 --tries 1 --retry-connrefused https://www.youtube.com -O /tmp/youtube ;then 440 | warn "旅游失败,请检查出国旅游环境." 441 | return 1 442 | fi 443 | return 0 444 | } 445 | 446 | # Main 447 | 448 | warn "homeassistant supervisor 安装方式已经改变,请参阅官方 supervisor installer 项目获得安装方法。" 449 | warn "https://github.com/home-assistant/supervised-installer" 450 | warn "本脚本已停止维护,不再更新,谢谢陪伴,江湖再见!" 451 | exit 0 452 | 453 | ## 检查脚本运行环境 454 | if ! id | grep -q 'root' 2>/dev/null ;then 455 | error "请输入 \"sudo -s\" 切换至 root 账户运行本脚本...脚本退出" 456 | fi 457 | 458 | ## 检查环境变量 459 | if ! echo $PATH | grep sbin > /dev/null 2>&1 ;then 460 | error "请使用 sudo -s 切换 root 账号,或者 sudo ./install.sh 运行脚本, su 环境变量不符合脚本要求." 461 | fi 462 | 463 | ## 检查是否运行于 systemd 环境 464 | if ! ps --no-headers -o comm 1 | grep systemd > /dev/null 2>&1 ;then 465 | error "你的系统不是运行在 systemd 环境下,本脚本不支持此系统!(如 android 之类的虚拟 Linux)" 466 | fi 467 | 468 | ## 检查系统版本 469 | check_sys 470 | 471 | ## 配置安装选项 472 | ### 1.警告信息 473 | echo -e "(${title_num}). 你是否有“出国旅游”环境,如果没有建议停止使用 supervisor(hassio)" 474 | echo -e " 由于 supervisor 内的 addons 全部基于 github 存储,而 addons 镜像仓库地址全部改为 ghcr.io" 475 | echo -e " ghcr.io 是 github 推出的容器镜像存储服务,目前国内还没有加速器,所以你安装 addons 将会很慢很慢" 476 | while true; do 477 | read -p "请输入 y or n(默认 no):" selected 478 | case ${selected} in 479 | yes|y|YES|Y|Yes ) 480 | while true; do 481 | read -p "请输入你“出国旅游”路由器的IP地址,作为 hassio_dns 上游 IP:" dns_ipaddress 482 | if check_ip "${dns_ipaddress}" && check_proxy_status ;then 483 | echo -e "你输入IP地址为 ${dns_ipaddress}" 484 | break; 485 | else 486 | warn "你的出国旅游环境不正常,请检查或者更换IP地址." 487 | fi 488 | done 489 | break; 490 | ;; 491 | ''|no|n|NO|N|No) 492 | error "用户选择退出脚本." 493 | ;; 494 | *) 495 | echo "输入错误,请重新输入。" 496 | ;; 497 | esac 498 | done 499 | check_massage+=(" # ${title_num}. 是否有“出国旅游”环境: ${yellow}是${plain}") 500 | let title_num++ 501 | 502 | ## 2. 配置安装源 503 | 504 | echo -e "(${title_num}). 是否将系统源切换为清华源(目前支持 Debian Ubuntu Raspbian 三款系统)" 505 | while true; do 506 | read -p "请输入 y or n(默认 yes):" selected 507 | case ${selected} in 508 | ''|yes|y|YES|Y|Yes ) 509 | apt_sources=true 510 | break; 511 | ;; 512 | no|n|NO|N|No) 513 | apt_sources=false 514 | break; 515 | ;; 516 | *) 517 | echo "输入错误,请重新输入。" 518 | ;; 519 | esac 520 | done 521 | check_massage+=(" # ${title_num}. 是否将系统源切换为清华源: ${yellow}$(if ${apt_sources};then echo "是";else echo "否";fi)${plain}") 522 | let title_num++ 523 | 524 | ### 3. 选择是否更新系统软件到最新 525 | echo '' 526 | echo '' 527 | echo -e "(${title_num}).是否更新系统软件到最新?" 528 | warn "如果系统依赖版本低于 supervisor 要求,会导致 supervisor 显示系统不健康,最终导致无法安装 addons." 529 | while true; do 530 | read -p '请输入 yes 或者 no(默认:no):' selected 531 | case ${selected} in 532 | Yes|YES|yes|y|Y) 533 | is_upgrade_system=true 534 | break; 535 | ;; 536 | ''|No|NO|no|n|N) 537 | is_upgrade_system=false 538 | break; 539 | ;; 540 | *) 541 | echo -e "输入错误,请重新输入。" 542 | esac 543 | done 544 | check_massage+=(" # ${title_num}. 是否更新系统软件到最新: ${yellow}$(if ${is_upgrade_system};then echo "是,更新系统:${chack_massage_text}"; else echo "否";fi)${plain}") 545 | let title_num++ 546 | 547 | ### 4. 是否将用户添加至 docker 用户组 548 | echo '' 549 | echo '' 550 | while true;do 551 | if [[ ${users_num} -ne 1 ]];then 552 | echo -e "($title_num). 找到该系统中有以下用户名" 553 | echo -e "如下方列表未显示你的用户名,请切换回你用户账号后输入 sudo usermod -aG docker \$USER 添加用户到 docker 用户组。" 554 | i=1 555 | while [[ $i -le ${users_num} ]]; do 556 | echo -e " [${i}]: ${users[$((($i-1)))]}" 557 | let i++ 558 | done 559 | echo -e " [s]: 跳过" 560 | read -p '请输入你需要使用 docker 的用户名序号,以加入 docker 用户组:' selected 561 | case ${selected} in 562 | [0-9]*) 563 | if [[ ${users[$(((${selected}-1)))]} != "" ]]; then 564 | echo -e "将${users[$(((${selected}-1)))]}用户添加至 docker 用户组。" 565 | add_User_Docker=${users[$(((${selected}-1)))]} 566 | break; 567 | else 568 | echo -e "输入数字错误请重新选择。" 569 | fi 570 | ;; 571 | s|S) 572 | echo -e "跳过添加用户到 docker 用户组。" 573 | break; 574 | ;; 575 | *) 576 | echo -e "请输入列表中的数字后按回车,如无数字请输入 s 跳过。" 577 | ;; 578 | esac 579 | else 580 | echo -e "(${title_num}). 在你系统内找到 ${users[0]} 用户,是否将其添加至 docker 用户组。" 581 | read -p "请输入 yes 或者 no (默认 yes):" selected 582 | case ${selected} in 583 | ''|Yes|YES|yes|y|Y) 584 | echo -e "将${users[0]}用户添加至 docker 用户组。" 585 | add_User_Docker=${users[0]} 586 | break; 587 | ;; 588 | No|NO|no|n|N) 589 | echo -e "跳过添加用户到 docker 用户组。" 590 | break; 591 | ;; 592 | *) 593 | echo -e "请输入 Yes 或者 No 后按回车确认。" 594 | ;; 595 | esac 596 | fi 597 | done 598 | check_massage+=(" # ${title_num}. 是否将用户添加至 Docker 用户组: ${yellow}$(if [ -z ${add_User_Docker} ];then echo "否";else echo "是,添加用户为 ${add_User_Docker}";fi) ${plain}") 599 | let title_num++ 600 | ### 5. 选择是否切换 Docker 国内源 601 | echo '' 602 | echo '' 603 | echo -e "(${title_num}).是否需要替换 docker 默认源?" 604 | while true; do 605 | read -p '请输入 yes 或者 no(默认:yes):' selected 606 | case ${selected} in 607 | ''|Yes|YES|yes|y|Y) 608 | CDR=true 609 | break; 610 | ;; 611 | No|NO|no|n|N) 612 | CDR=false 613 | break; 614 | ;; 615 | *) 616 | echo -e "输入错误,请重新输入。" 617 | esac 618 | done 619 | check_massage+=(" # ${title_num}. 是否将 Docker 源切换至国内源: ${yellow}$(if ${CDR};then echo "是,切换源选择:${chack_massage_text}"; else echo "否";fi)${plain}") 620 | let title_num++ 621 | 622 | ### 6. 选择设备类型,用于选择 hassio 拉取 homeassistant 容器之用。 623 | echo '' 624 | echo '' 625 | while true;do 626 | echo -e "(${title_num}).请选择你设备类型(默认:${default_machine})" 627 | for (( i = 0; i < ${machine_num}; i++ )); do 628 | echo -e " [$[${i}+1]]: ${machine_map[$i]}: ${machine_info[$i]}" 629 | done 630 | read -p "输入数字 (1-${machine_num}):" selected 631 | case ${selected} in 632 | *[0-9]*) 633 | if [[ ${selected} -le ${machine_num} && ${selected} -gt 0 ]]; then 634 | machine="${machine_map[((${selected}-1))]}" 635 | echo -e "你选择了 ${machine}" 636 | break; 637 | else 638 | echo -e "输入错误,请重新输入" 639 | fi 640 | ;; 641 | '') 642 | machine=${default_machine} 643 | echo -e "你选择了 ${machine}" 644 | break; 645 | ;; 646 | *) 647 | echo -e "输入错误,请重新输入" 648 | ;; 649 | esac 650 | done 651 | check_massage+=(" # ${title_num}. 您的设备类型为: ${yellow}${machine}${plain}") 652 | let title_num++ 653 | 654 | ### 7. 选择 hassio 数据保存路径。 655 | echo '' 656 | echo '' 657 | while true;do 658 | echo -e "(${title_num}).是否需要设置 hassio 数据保存路径(默认:/usr/share/hassio)" 659 | read -p "请输入 yes 或 no (默认:no):" selected 660 | case ${selected} in 661 | Yes|YES|yes|y|Y) 662 | while true; do 663 | read -p "请输入路径:" data_share_path 664 | if [[ ! -d ${data_share_path} ]]; then 665 | mkdir -p ${data_share_path} 666 | if [[ $? -ne 0 ]];then 667 | echo -e "[ERROR] 无法设置改目录为 hassio 数据目录,权限不够。" 668 | else 669 | echo -e "[INFO] 设置路径 ${data_share_path} 成功。" 670 | break; 671 | fi 672 | else 673 | break; 674 | fi 675 | done 676 | break; 677 | ;; 678 | ''|No|NO|no|n|N) 679 | echo -e "hassio 数据路径为默认路径: /usr/share/hassio" 680 | data_share_path="/usr/share/hassio" 681 | break; 682 | ;; 683 | *) 684 | echo -e "请输入 Yes 或者 No 后按回车确认。" 685 | ;; 686 | esac 687 | done 688 | check_massage+=(" # ${title_num}. 您的 hassio 数据路径为: ${yellow}${data_share_path}${plain}") 689 | let title_num++ 690 | 691 | ### 8. 选择是否加入 github hosts 到 coreDNS。 692 | echo '' 693 | echo '' 694 | while true;do 695 | echo -e "(${title_num}).是否将 github hosts 写入 coreDNS" 696 | echo -e "或许有效加快 hassio 第一次启动时 clone addons 速度" 697 | echo -e "hosts 文件来自 https://github.com/jianboy/github-host 项目" 698 | read -p "请输入 yes 或 no (默认:yes):" selected 699 | case ${selected} in 700 | ''|Yes|YES|yes|y|Y) 701 | set_github_hosts_to_coreDNS=true 702 | break; 703 | ;; 704 | No|NO|no|n|N) 705 | set_github_hosts_to_coreDNS=false 706 | break; 707 | ;; 708 | *) 709 | echo -e "请输入 Yes 或者 No 后按回车确认。" 710 | ;; 711 | esac 712 | done 713 | check_massage+=(" # ${title_num}. 是否将 github hosts 写入 coreDNS: ${yellow}$(if ${set_github_hosts_to_coreDNS};then echo "是"; else echo "否";fi)${plain}") 714 | 715 | echo " ################################################################################" 716 | for (( i = 0; i < ${#check_massage[@]}; i++ )); do echo -e "${check_massage[$i]}"; done 717 | echo " ################################################################################" 718 | echo "请确认以上信息,继续请按任意键,如需修改请输入 Ctrl+C 结束任务重新执行脚本。" 719 | 720 | read selected 721 | 722 | ## 切换安装源 723 | if [[ ${apt_sources} == true ]]; then 724 | info "切换系统网络源....." 725 | replace_source 726 | else 727 | info "跳过切换系统源。" 728 | fi 729 | 730 | ## 更新系统至最新 731 | if [[ ${is_upgrade_system} == true ]]; then 732 | info "更新系统至最新....." 733 | update_system 734 | fi 735 | 736 | ## 定义 Ubuntu 和 Debian 依赖 737 | info "安装 hassio 必要依赖....." 738 | apt_install ${Ubunt_Debian_Requirements} 739 | 740 | ## 安装 Docker 引擎 741 | if ! command -v docker;then 742 | info "安装 Docker 引擎....." 743 | if [[ ${release} == "ubuntu" ]]; then 744 | ubuntu_docker_install 745 | else 746 | docker_install 747 | fi 748 | else 749 | info "发现系统已安装 docker,跳过 docker 安装" 750 | fi 751 | 752 | ## 切换 Docker 源为国内源 753 | if [[ ${CDR} == true ]]; then 754 | info "切换 Docker 源为国内源...." 755 | change_docker_registry 756 | else 757 | info "跳过切换 Docker 源...." 758 | fi 759 | get_ipaddress 760 | ## 安装 hassio 761 | info "安装 hassio......" 762 | hassio_install 763 | if [[ ${set_github_hosts_to_coreDNS} == true ]]; then 764 | github_set_hosts_to_coreDNS & 765 | fi 766 | 767 | if wait_homeassistant_run ;then 768 | setting_hassio_dns_option_dns_server 769 | info "hassio 安装完成,请输入 http://${ipaddress}:8123 访问你的 HomeAssistant" 770 | warn " 相关问题可以访问https://bbs.iobroker.cn或者加QQ群776817275咨询" 771 | print_sponsor 772 | else 773 | error "等待 hassio 启动超时!" 774 | fi 775 | --------------------------------------------------------------------------------