From b59bf19da0067a62dbd7e8a2f2b6cd415a30231a Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Wed, 17 Jul 2019 16:43:11 +0800 Subject: [PATCH 01/10] Add files via upload --- install.py | 960 ++++++++++++++++++----------------------------------- 1 file changed, 316 insertions(+), 644 deletions(-) diff --git a/install.py b/install.py index 4563e20..a9c77f1 100644 --- a/install.py +++ b/install.py @@ -1,644 +1,316 @@ -import getopt -import subprocess -import sys -import time -import locale -import os -from pathlib import Path - -language = locale.getdefaultlocale()[0] - - -class Logger: - OKBLUE = '\033[94m' - WARNING = '\033[93m' - FAIL = '\033[31m' - ENDC = '\033[0m' - - @staticmethod - def info(info): - try: - print(Logger.OKBLUE + info + Logger.ENDC) - except UnicodeEncodeError: - Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") - - @staticmethod - def warn(info): - try: - print(Logger.WARNING + info + Logger.ENDC) - except UnicodeEncodeError: - Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") - - @staticmethod - def error(info): - try: - print(Logger.FAIL + info + Logger.ENDC) - except UnicodeEncodeError: - Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") - - -class Service: - def __init__(self): - self.pip_source_path = "/etc/pip.conf" - self.apt_source_path = "/etc/apt/sources.list" - self.auto_start_conf_add = "/etc/systemd/system/home-assistant@pi.service" - self.smb_conf_path = "/etc/samba/smb.conf" - self.wifi_conf_path = "/etc/wpa_supplicant/wpa_supplicant.conf" - self.mosquitto_config_path = "/etc/mosquitto/mosquitto.conf" - - # 配置wifi - def set_wifi(self): - if language == 'zh_CN': - Logger.info("[INFO] 增加wifi配置,请输入你的用户名和密码...") - else: - Logger.info("[INFO] add wifi config, please input your user name and password...") - SSID = input("SSID>") - PASSWORD = input("PASSWORD>") - - if SSID != "": - if language == 'zh_CN': - Logger.info("[INFO] 确认你的wifi配置.(y or n)") - else: - Logger.info("[INFO] please confirm your wifi config") - confirm = input(">") - if confirm == "y" or confirm == "Y": - with open(self.wifi_conf_path, "w+") as f: - f.write("country=CN\n" - "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev\n" - "update_config=1\n" - "network={\n" - "\tssid=\"" + SSID + "\"\n" + - "\tpsk=\"" + PASSWORD + "\"\n" + - "\tkey_mgmt=WPA-PSK\n" - "\tpriority=1}") - if language == 'zh_CN': - Logger.info("[INFO] 配置成功!") - else: - Logger.info("[INFO] config success!") - elif confirm == "n" or confirm == "N": - self.set_wifi() - else: - if language == 'zh_CN': - Logger.warn("[WARNING] SSID不能为空") - else: - Logger.warn("[WARNING] SSID is None! Please input again") - self.set_wifi() - - # 获取当前Python版本 - @staticmethod - def get_python_version(): - if language == 'zh_CN': - Logger.info("[INFO] Python3 版本") - else: - Logger.info("[INFO] Python3 version") - code = subprocess.run("python3 -V", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 未找到Python3") - else: - Logger.error("[ERROR] can't find python3") - if language == 'zh_CN': - Logger.info("[INFO] Python2 版本") - else: - Logger.info("[INFO] Python3 version") - code = subprocess.run("python -V", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 未找到Python2") - else: - Logger.error("[ERROR] can't find python2") - - # 获取当前HA版本 - @staticmethod - def get_ha_version(): - code = subprocess.run("hass --version", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 未安装HomeAssistant") - else: - Logger.error("[ERROR] No HomeAssistant installed") - - # 换源 更换清华源 pip同步时间 5min - def change_pip_source(self): - code = subprocess.run("sudo mv /etc/pip.conf /etc/pip.conf.bak", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 没有找到pip文件,准备建立pip文件") - else: - Logger.error("[ERROR] can't find pip file, we will create this file") - time.sleep(2) - with open(self.pip_source_path, 'w+') as f: - f.write("[global]\n" - "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") - if language == 'zh_CN': - Logger.info("[INFO] 写入pip文件成功") - else: - Logger.info("[INFO] write pip file success") - elif code.returncode == 0: - with open(self.pip_source_path, 'w+') as f: - f.write("[global]\n" - "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") - if language == 'zh_CN': - Logger.info("[INFO] 写入pip文件成功") - else: - Logger.info("[INFO] write pip file success") - - def change_apt_source(self): - code = subprocess.run("sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[INFO] 找不到apt文件,准备建立apt文件") - else: - Logger.info("[INFO] can't find apt file, we will create apt file") - time.sleep(2) - with open(self.apt_source_path, 'w+') as f: - f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" - "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") - if language == 'zh_CN': - Logger.info("[INFO] 写入apt文件成功") - else: - Logger.info("[INFO] write apt file success") - elif code.returncode == 0: - with open(self.apt_source_path, 'w+') as f: - f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" - "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") - if language == 'zh_CN': - Logger.info("[INFO] 写入apt文件成功") - else: - Logger.info("[INFO] write apt file success") - self.prepare() - - # 更新源与软件 - def prepare(self): - if language == 'zh_CN': - Logger.info("[INFO] 准备更新软件包列表") - else: - Logger.info("[INFO] Prepare update software list") - code = subprocess.run("sudo apt-get update", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 更新软件包列表失败,请检查网络连接,两秒后准备重新更新") - else: - Logger.info("[ERROR] update software list fail, please check the internet, we will prepare " - "to start this job after 2 seconds") - time.sleep(2) - self.prepare() - elif code.returncode == 0: - if language == 'zh_CN': - Logger.info("[INFO] 软件包列表更新完毕") - Logger.info("\n") - Logger.info("[INFO] 是否更新软件?(y or n)") - else: - Logger.info("[INFO] software list is already update") - Logger.info("\n") - Logger.info("[INFO] will you want to upgrade the software?(y or n)") - confirm = input(">") - if confirm == "y" or confirm == "Y": - code = subprocess.run("sudo apt-get upgrade", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 更新软件失败,请检查网络连接") - else: - Logger.error("[ERROR] Update software failed, please check network connection") - else: - if language == 'zh_CN': - Logger.info("[INFO] 更新软件完毕") - else: - Logger.info("[INFO] Update software completed") - elif confirm == "n" or confirm == "N": - pass - else: - pass - - # 更新HomeAssistant - def upgrade_ha(self): - if language == 'zh_CN': - Logger.info("[INFO] 准备更新HomeAssistant") - else: - Logger.info("[INFO] Prepare upgrade HomeAssistant") - code = subprocess.run("sudo pip3 install -U homeassistant", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 更新HomeAssistant失败,请检查网络, 两秒后准备重新安装...") - else: - Logger.error("[ERROR] Updating HomeAssistant failed. Please check the network and prepare " - "for reinstallation in two seconds....") - time.sleep(2) - self.upgrade_ha() - - # 更新指定版本HA - def upgrade_specific_ha(self): - if language == 'zh_CN': - Logger.info("[INFO] 请输入HA版本号") - else: - Logger.info("[INFO] Please enter HA version number") - ha_version = input(">") - code = subprocess.run("sudo pip3 install -U homeassistant=={}".format(ha_version), shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 安装{}版本HomeAssistant失败,请检查版本号与网络连接," - "两秒后准备重新安装...".format(ha_version)) - else: - Logger.error("[ERROR] Installation of {} version HomeAssistant failed. " - "Please check the version number for " - "network connection and prepare for reinstallation in two seconds....".format(ha_version)) - time.sleep(2) - self.upgrade_specific_ha() - elif code.returncode == 0: - if language == 'zh_CN': - Logger.info("[INFO] 安装{}版本HomeAssistant成功".format(ha_version)) - else: - Logger.info("[INFO] Installation of {} version HomeAssistant succeed.".format(ha_version)) - - # 安装HomeAssistant - def install_ha(self): - if language == 'zh_CN': - Logger.info("[INFO] 开始安装HomeAssistant") - else: - Logger.info("[INFO] Start installation HomeAssistant") - - code = subprocess.run("sudo pip3 install homeassistant", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 安装HomeAssistant失败,请检查网络连接,两秒后准备重新安装") - else: - Logger.error("[ERROR] Installation HomeAssistant failed. " - "Please check the version number for " - "network connection and prepare for reinstallation in two seconds....") - time.sleep(2) - self.install_ha() - elif code.returncode == 0: - self.start_ha() - self.ha_auto_start() - # 安装完成后提示用户是否打印HA运行日志 - if language == 'zh_CN': - confirm = input("是否查看HomeAssistant日志?(y or n)..") - if confirm == "y" or confirm == "Y": - self.print_ha_log() - elif confirm == "n" or confirm == "n": - pass - else: - confirm = input("Do you want to see HomeAssistant log?(y or n)..") - if confirm == "y" or confirm == "Y": - self.print_ha_log() - elif confirm == "n" or confirm == "n": - pass - - # HA 自启动 - def ha_auto_start(self): - if language == 'zh_CN': - Logger.info("[INFO] 准备配置HomeAssistant自启动") - else: - Logger.info("[INFO] Prepare to configure HomeAssistant self-startup") - try: - with open(self.auto_start_conf_add, "w+") as f: - f.write("[Unit]\n" - "Description=Home Assistant\n" - "After=network.target\n\n" - "[Service]\n" - "Type=simple\n" - "User=%i\n" - "ExecStart=/usr/local/bin/hass\n\n" - "[Install]\n" - "WantedBy=multi-user.target\n") - if language == 'zh_CN': - Logger.info("[INFO] HomeAssistant自启动建立成功") - else: - Logger.info("[INFO] HomeAssistant Self-Start Establishment Successful") - except FileNotFoundError: - if language == 'zh_CN': - Logger.error("[ERROR] 自启动建立失败,请检查自启动配置路径.") - else: - Logger.error("[ERROR] Self-startup setup failed. Check the self-startup configuration path.") - - # samba安装 TODO - def install_samba(self): - if language == 'zh_CN': - Logger.info("[INFO] 准备安装Samba") - else: - Logger.info("[INFO] Prepare to install Samba") - subprocess.run("sudo apt-get install samba samba-common", shell=True) - subprocess.run("sudo smbpasswd -a pi", shell=True) - subprocess.run("sudo rm " + self.smb_conf_path, shell=True) - with open(self.smb_conf_path, "w") as f: - f.write("[global]\n" - "netbios name = raspberrypi\n" - "server string = The Pi File Center\n" - "workgroup = WORKGROUP\n" - "hosts allow =\n" - "remote announce =\n" - "remote browse sync =\n" - "[HOME ASSISTANT]\n" - "path = /home/pi\n" - "comment = No comment\n" - "browsable = yes\n" - "read only = no\n" - "valid users =\n" - "writable = yes\n" - "guest ok = yes\n" - "public = yes\n" - "create mask = 0777\n" - "directory mask = 0777\n" - "force user = root\n" - "force create mode = 0777\n" - "force directory mode = 0777\n" - "hosts allow =\n") - subprocess.run("sudo systemctl restart smbd", shell=True) - - # 安装 mosquitto - def install_mosquitto(self): - if language == 'zh_CN': - Logger.info("[INFO] 准备安装Mosquitto`") - else: - Logger.info("[INFO] Prepare to install Mosquitto") - self.prepare() - code = subprocess.run("sudo apt-get install mosquitto", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 安装mosquitto失败,请检查网络连接,两秒后准备重新安装") - else: - Logger.error("[ERROR] Installation of mosquitto failed. Please check the network " - "connection and prepare for reinstallation in two seconds") - time.sleep(2) - self.install_mosquitto() - elif code.returncode == 0: - try: - with open(self.mosquitto_config_path, "w+") as f: - f.write("allow_anonymous false\n" - "password_file /etc/mosquitto/pwfile\n" - "listener 1883\n") - if language == 'zh_CN': - Logger.info("[INFO] 写入MQTT配置成功!") - else: - Logger.info("[INFO] Write MQTT Configuration Successful!") - except FileNotFoundError: - if language == 'zh_CN': - Logger.error("[ERROR] MQTT configuration could not be found. Check the path.") - else: - Logger.error("[ERROR] ") - if language == 'zh_CN': - mqtt_user_name = input("请输入MQTT用户名:") - else: - mqtt_user_name = input("Please input mqtt user name:") - subprocess.run("sudo mosquitto_passwd -c /etc/mosquitto/pwfile {}".format(mqtt_user_name), shell=True) - subprocess.run("sudo systemctl start mosquitto.service", shell=True) - - # 重启HA - @staticmethod - def restart_ha(): - code = subprocess.run("sudo systemctl restart home-assistant@pi", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 重启HomeAssistant失败") - else: - Logger.error("[ERROR] restart HomeAssistant filed") - else: - if language == 'zh_CN': - Logger.info("[INFO] 重启HomeAssistant成功") - else: - Logger.info('[INFO] restart HomeAssistant success') - - @staticmethod - def start_ha(): - code = subprocess.run("sudo systemctl start home-assistant@pi", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 启动HomeAssistant失败") - else: - Logger.error("[ERROR] start HomeAssistant filed") - else: - if language == 'zh_CN': - Logger.info("[INFO] 启动HomeAssistant成功") - else: - Logger.info('[INFO] start HomeAssistant success') - - @staticmethod - def stop_ha(): - code = subprocess.run("sudo systemctl stop home-assistant@pi", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 停止HomeAssistant失败") - else: - Logger.error("[ERROR] stop HomeAssistant filed") - else: - if language == 'zh_CN': - Logger.info("[INFO] 停止HomeAssistant成功") - else: - Logger.info('[INFO] stop HomeAssistant success') - - # 查看log - @staticmethod - def print_ha_log(): - code = subprocess.run("sudo journalctl -f -u home-assistant@pi", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 查看HomeAssistant日志失败") - else: - Logger.error("[ERROR] view HomeAssistant log file filed") - else: - if language == 'zh_CN': - Logger.info("[INFO] 查看HomeAssistant日志成功") - else: - Logger.info('[INFO] view HomeAssistant log file success') - - def upgrade_python(self): - base_dir = os.path.abspath(os.path.dirname(__file__)) - pv = 'Python-3.7.2' - if language == 'zh_CN': - Logger.info("[INFO] 准备安装{}".format(pv)) - else: - Logger.info("[INFO] Prepare to install Samba") - - if language == 'zh_CN': - Logger.info("[INFO] 准备卸载冲突, 如果有请选择y") - else: - Logger.info("[INFO] Ready to update Python 3") - Logger.info("[INFO] Preparing for Unloading Conflict") - - code = subprocess.run("sudo pip3 uninstall homeassistant", shell=True) - if code.returncode != 0: - pass - if language == 'zh_CN': - Logger.info("[INFO] 开始安装依赖") - else: - Logger.info("[INFO] Start installing dependencies") - time.sleep(2) - code = subprocess.run("sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev", - shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 安装依赖失败,请检查网络连接,两秒后准备重新安装") - else: - Logger.error("[ERROR] Installation dependency failed. Please check the network connection " - "and prepare for reinstallation in two seconds.") - - time.sleep(2) - self.upgrade_python() - elif code.returncode == 0: - code = subprocess.run("sudo apt-get install wget", shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 下载wget失败,请检查网络连接,两秒后准备重新安装") - else: - Logger.error("[ERROR] The download of wget failed. Please check the network connection and " - "prepare for reinstallation in two seconds.") - time.sleep(2) - self.prepare() - elif code.returncode == 0: - file_dir = base_dir + '/'.format(pv) + '.tgz' - file = Path(file_dir) - if file.is_file(): - if language == 'zh_CN': - Logger.info("[INFO] 开始解压安装包") - else: - Logger.info("[INFO] Start decompressing the installation package") - time.sleep(2) - subprocess.run("sudo tar -zvxf {}.tgz".format(pv), shell=True) - os.chdir("{}/{}".format(base_dir, pv)) - if language == 'zh_CN': - Logger.info("[INFO] 开始编译{}".format(pv)) - else: - Logger.info("[INFO] Start compiling Python") - time.sleep(2) - subprocess.run("sudo ./configure && sudo make && sudo make install", shell=True) - if language == 'zh_CN': - Logger.info("[INFO] 已完成{}安装".format(pv)) - else: - Logger.info("[INFO] {} installation completed".format(pv)) - else: - if language == 'zh_CN': - Logger.info("[INFO] 下载Python安装包") - else: - Logger.info("[INFO] Download the Python installation package") - time.sleep(2) - code = subprocess.run("sudo wget https://www.python.org/ftp/python/3.7.2/{}.tgz".format(pv), - shell=True) - if code.returncode != 0: - if language == 'zh_CN': - Logger.error("[ERROR] 下载Python失败,请检查网络连接,两秒后准备重新安装") - else: - Logger.error("[ERROR] Download Python failed. Please check your network connection and " - "prepare to reinstall it in two seconds.") - time.sleep(2) - self.upgrade_python() - elif code.returncode == 0: - if language == 'zh_CN': - Logger.info("[INFO] 开始解压安装包") - else: - Logger.info("[INFO] Start decompressing the installation package") - time.sleep(2) - subprocess.run("sudo tar -zvxf {}.tgz".format(pv), shell=True) - os.chdir("{}/{}".format(base_dir, pv)) - if language == 'zh_CN': - Logger.info("[INFO] 开始编译{}".format(pv)) - else: - Logger.info("[INFO] Start compiling Python") - time.sleep(2) - subprocess.run("sudo ./configure && sudo make && sudo make install", shell=True) - if language == 'zh_CN': - Logger.info("[INFO] 已完成{}安装".format(pv)) - else: - Logger.info("[INFO] {} installation completed".format(pv)) - Logger.info("\n") - # os.remove(pv + '.tgz') - self.get_python_version() - - -class Install: - try: - opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", - "rh", "phl", "up", "ush", "sh", "sth"]) - service = Service() - for opt, value in opts: - if opt == "-h" or opt == "--help": - if language == 'zh_CN': - Logger.info("-h 显示帮助") - Logger.info("-w 添加wifi配置") - Logger.info("-p 更新软件包列表与软件") - Logger.info("-s 安装samba服务") - Logger.info("--im 安装mosquitto") - Logger.info("-" * 20) - Logger.info("--cps 更换pip源") - Logger.info("--cas 更换apt源") - Logger.info("-" * 20) - Logger.info("--ih 安装HomeAssistant") - Logger.info("--uh 更新HomeAssistant") - Logger.info("--has 配置HomeAssistant自启动") - Logger.info("--sh 运行HomeAssistant实例") - Logger.info("--sth 停止HomeAssistant实例") - Logger.info("--rh 重启HomeAssistant") - Logger.info("--phl 查看HomeAssistant日志") - Logger.info("--hv 查看HomeAssistant版本") - Logger.info("-" * 20) - Logger.info("--pv 查看Python版本") - Logger.info("--up 更新Python3版本") - else: - Logger.info("-h get help info") - Logger.info("-w add wifi config") - Logger.info("-p Updating Package List and Software") - Logger.info("-s Installing Samba services") - Logger.info("--im Installing mosquitto services") - Logger.info("-" * 20) - Logger.info("--cps change pip source") - Logger.info("--cas change apt source") - Logger.info("-" * 20) - Logger.info("--ih install HomeAssistant") - Logger.info("--uh upgrade HomeAssistant") - Logger.info("--has set HomeAssistant auto start") - Logger.info("--sh run HomeAssistant") - Logger.info("--sth stop HomeAssistant") - Logger.info("--rh restart HomeAssistant") - Logger.info("--phl get HomeAssistant log") - Logger.info("--hv get HomeAssistant version") - Logger.info("-" * 20) - Logger.info("--pv get Python version") - Logger.info("--up upgrade Python3 version") - elif opt == "-w": - service.set_wifi() - elif opt == "-p": - service.prepare() - elif opt == "-s": - service.install_samba() - elif opt == "--pv": - service.get_python_version() - elif opt == "--hv": - service.get_ha_version() - elif opt == "--cps": - service.change_pip_source() - elif opt == "--cas": - service.change_apt_source() - elif opt == "--uh": - service.upgrade_ha() - elif opt == "--usp": - service.upgrade_specific_ha() - elif opt == "--ih": - service.install_ha() - elif opt == "--has": - service.ha_auto_start() - elif opt == "--im": - service.install_mosquitto() - elif opt == "--rh": - service.restart_ha() - elif opt == "--phl": - service.print_ha_log() - elif opt == "--up": - service.upgrade_python() - elif opt == "--sh": - service.start_ha() - elif opt == "--sth": - service.stop_ha() - except getopt.GetoptError: - if language == 'zh_CN': - Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") - else: - Logger.error("[ERROR] Without this option, use -h or --help to view available options") - - -if __name__ == '__main__': - try: - Install() - except PermissionError: - if language == 'zh_CN': - Logger.error("[ERROR] 权限不足,请使用sudo权限运行此程序") - else: - Logger.error("[ERROR] Insufficient privileges, use sudo privileges to run this program") +import getopt +import subprocess +import sys +import time +import os +from pathlib import Path +import getpass + + +class Logger: + OK = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[31m' + END = '\033[0m' + + @staticmethod + def info(info): + try: + print(Logger.OK + info + Logger.END) + except UnicodeEncodeError: + Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") + + @staticmethod + def warn(info): + try: + print(Logger.WARNING + info + Logger.END) + except UnicodeEncodeError: + Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") + + @staticmethod + def error(info): + try: + print(Logger.FAIL + info + Logger.END) + except UnicodeEncodeError: + Logger.warn("[ERROR] Not found chinese font, you must install chinese font, if not, we will use english..") + + +# 公共服务 各系统兼容的部分 +class BaseService: + # 获取当前Python版本 + @staticmethod + def get_python_version(): + + Logger.info("[INFO] Python3 版本") + code = subprocess.run("python3 -V", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未找到Python3") + + Logger.info("[INFO] Python2 版本") + code = subprocess.run("python -V", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未找到Python2") + + # 更新Python3版本 + def upgrade_python3(self): + return + + # 更新源与软件 + def prepare(self): + Logger.info("[INFO] 准备更新软件包列表") + + code = subprocess.run("sudo apt-get update", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 更新软件包列表失败,请检查网络连接,两秒后准备重新更新") + time.sleep(2) + self.prepare() + elif code.returncode == 0: + Logger.info("[INFO] 软件包列表更新完毕") + Logger.info("\n") + Logger.info("[INFO] 是否更新软件?(y or n) 默认为n") + + confirm = input("(不输入可直接回车使用默认值)>") + if confirm == "y" or confirm == "Y": + code = subprocess.run("sudo apt-get upgrade", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 更新软件失败,请检查网络连接") + else: + Logger.info("[INFO] 更新软件完毕") + else: + pass + + # 获取当前HA版本 + @staticmethod + def get_ha_version(): + code = subprocess.run("hass --version", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未安装HomeAssistant") + + # 更新HomeAssistant + def upgrade_ha(self): + Logger.info("[INFO] 准备更新HomeAssistant") + + code = subprocess.run("sudo pip3 install -U homeassistant", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 更新HomeAssistant失败,请检查网络, 两秒后准备重新安装...") + time.sleep(2) + self.upgrade_ha() + + # 更新指定版本HA + def upgrade_specific_ha(self): + Logger.info("[INFO] 请输入HA版本号") + + ha_version = input(">") + code = subprocess.run("sudo pip3 install -U homeassistant=={}".format(ha_version), shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装{}版本HomeAssistant失败,请检查版本号与网络连接," + "两秒后准备重新安装...".format(ha_version)) + time.sleep(2) + self.upgrade_specific_ha() + elif code.returncode == 0: + Logger.info("[INFO] 安装{}版本HomeAssistant成功".format(ha_version)) + + def set_wifi(self): + return "不支持当前系统" + + +class UbuntuService(BaseService): + def __init__(self): + super().upgrade_python3() + + def upgrade_python3(self): + base_dir = os.path.abspath(os.path.dirname(__file__)) + Logger.info("[INFO] 准备更新Ubuntu Python3版本") + self.prepare() + Logger.info("[INFO] 准备安装依赖") + code = subprocess.run( + "sudo apt install wget && sudo apt install zlib* && sudo apt install libffi-dev " + "&& sudo apt install openssl && sudo apt install libssl-dev && sudo apt install make", + shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装依赖失败") + self.upgrade_python3() + else: + Logger.info("[INFO] 安装依赖成功") + + Logger.info("[INFO] 准备下载Python3") + code = subprocess.run("wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 下载Python3失败,准备重新下载...") + self.upgrade_python3() + else: + Logger.info("[INFO] 下载Python3成功") + + Logger.info("[INFO] 准备安装GCC") + code = subprocess.run("sudo apt install gcc", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装gcc失败,准备重新安装...") + self.upgrade_python3() + else: + Logger.info("[INFO] 安装gcc成功") + Logger.info("[INFO] 准备解压python") + subprocess.run("tar -xvzf Python-3.7.4.tgz", shell=True) + os.chdir("{}/Python-3.7.4".format(base_dir)) + # sudo apt install gcc + subprocess.run("./configure", shell=True) + subprocess.run("sudo make && sudo make install", shell=True) + Logger.info("[INFO] Python3升级完成") + subprocess.run("ln -s /usr/python3.7/bin/python3 /usr/bin/python3", shell=True) + + def set_wifi(self): + return super().set_wifi() + + +# 树莓派 +class DebianService(BaseService): + def __init__(self): + self.pip_source_path = "/etc/pip.conf" + self.apt_source_path = "/etc/apt/sources.list" + self.auto_start_conf_add = "/etc/systemd/system/home-assistant@pi.service" + self.smb_conf_path = "/etc/samba/smb.conf" + self.wifi_conf_path = "/etc/wpa_supplicant/wpa_supplicant.conf" + self.mosquitto_config_path = "/etc/mosquitto/mosquitto.conf" + self.docker_mirror_path = "/etc/docker/daemon.json" + self.flag = 0 + + # 配置wifi + def set_wifi(self): + Logger.info("[INFO] 增加wifi配置,请输入你的用户名和密码...") + SSID = input("SSID>") + PASSWORD = input("PASSWORD>") + + if SSID != "": + Logger.info("[INFO] 确认你的wifi配置.(y or n)") + confirm = input(">") + if confirm == "y" or confirm == "Y": + with open(self.wifi_conf_path, "w+") as f: + f.write("country=CN\n" + "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev\n" + "update_config=1\n" + "network={\n" + "\tssid=\"" + SSID + "\"\n" + + "\tpsk=\"" + PASSWORD + "\"\n" + + "\tkey_mgmt=WPA-PSK\n" + "\tpriority=1}") + Logger.info("[INFO] 配置成功!") + elif confirm == "n" or confirm == "N": + self.set_wifi() + else: + Logger.warn("[WARNING] SSID不能为空") + self.set_wifi() + + # 换源 更换清华源 pip同步时间 5min + def change_pip_source(self): + code = subprocess.run("sudo mv /etc/pip.conf /etc/pip.conf.bak", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 没有找到pip文件,准备建立pip文件") + + time.sleep(2) + with open(self.pip_source_path, 'w+') as f: + f.write("[global]\n" + "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") + Logger.info("[INFO] 写入pip文件成功") + + elif code.returncode == 0: + with open(self.pip_source_path, 'w+') as f: + f.write("[global]\n" + "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") + Logger.info("[INFO] 写入pip文件成功") + + def change_apt_source(self): + code = subprocess.run("sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak", shell=True) + if code.returncode != 0: + Logger.error("[INFO] 找不到apt文件,准备建立apt文件") + time.sleep(2) + with open(self.apt_source_path, 'w+') as f: + f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" + "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") + Logger.info("[INFO] 写入apt文件成功") + + elif code.returncode == 0: + with open(self.apt_source_path, 'w+') as f: + f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" + "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") + Logger.info("[INFO] 写入apt文件成功") + + self.prepare() + + +class Install: + try: + opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", + "rh", "phl", "up", "ush", "sh", "sth", "id", "uup"]) + service = DebianService() + ubuntuservice = UbuntuService() + for opt, value in opts: + if opt == "-h" or opt == "--help": + Logger.info("-h 显示帮助") + Logger.info("-w 添加wifi配置") + Logger.info("-p 更新软件包列表与软件") + Logger.info("-s 安装samba服务") + Logger.info("--im 安装mosquitto") + Logger.info("-" * 30) + Logger.info("--cps 更换pip源") + Logger.info("--cas 更换apt源") + Logger.info("-" * 30) + Logger.info("--ih 安装HomeAssistant") + Logger.info("--uh 更新HomeAssistant") + Logger.info("--has 配置HomeAssistant自启动") + Logger.info("--sh 运行HomeAssistant实例") + Logger.info("--sth 停止HomeAssistant实例") + Logger.info("--rh 重启HomeAssistant") + Logger.info("--phl 查看HomeAssistant日志") + Logger.info("--hv 查看HomeAssistant版本") + Logger.info("-" * 30) + Logger.info("--pv 查看Python版本") + Logger.info("--up 更新Python3版本") + Logger.info("-" * 30) + Logger.info("--id 安装docker CE") + + elif opt == "-w": + service.set_wifi() + elif opt == "-p": + service.prepare() + elif opt == "-s": + service.install_samba() + elif opt == "--pv": + service.get_python_version() + elif opt == "--hv": + service.get_ha_version() + elif opt == "--cps": + service.change_pip_source() + elif opt == "--cas": + service.change_apt_source() + elif opt == "--uh": + service.upgrade_ha() + elif opt == "--usp": + service.upgrade_specific_ha() + elif opt == "--ih": + service.install_ha() + elif opt == "--has": + service.ha_auto_start() + elif opt == "--im": + service.install_mosquitto() + elif opt == "--rh": + service.restart_ha() + elif opt == "--phl": + service.print_ha_log() + elif opt == "--up": + service.upgrade_python() + elif opt == "--sh": + service.start_ha() + elif opt == "--sth": + service.stop_ha() + elif opt == "--id": + service.install_docker() + elif opt == "--uup": + ubuntuservice.upgrade_python3() + except getopt.GetoptError: + Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") + + +if __name__ == '__main__': + try: + Install() + except PermissionError: + Logger.error("[ERROR] 权限不足,请使用sudo权限运行此程序") From 46e28cc30f37d8a3dcc884a507b5a2f9f7ef8821 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 11:50:47 +0800 Subject: [PATCH 02/10] Update install.py --- install.py | 583 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 478 insertions(+), 105 deletions(-) diff --git a/install.py b/install.py index a9c77f1..5c11f42 100644 --- a/install.py +++ b/install.py @@ -5,6 +5,10 @@ import os from pathlib import Path import getpass +import getpass + + +username = getpass.getuser() class Logger: @@ -37,18 +41,23 @@ def error(info): # 公共服务 各系统兼容的部分 class BaseService: + def __init__(self): + self.username = username + self.haAutoStartPath = "/etc/systemd/system/home-assistant@{}.service".format(self.username) + # 获取当前Python版本 @staticmethod def get_python_version(): - - Logger.info("[INFO] Python3 版本") - code = subprocess.run("python3 -V", shell=True) - if code.returncode != 0: + try: + Logger.info("[INFO] Python3 版本") + subprocess.run("python3 -V", shell=True, check=True) + except subprocess.CalledProcessError: Logger.error("[ERROR] 未找到Python3") - Logger.info("[INFO] Python2 版本") - code = subprocess.run("python -V", shell=True) - if code.returncode != 0: + try: + Logger.info("[INFO] Python2 版本") + subprocess.run("python -V", shell=True, check=True) + except subprocess.CalledProcessError: Logger.error("[ERROR] 未找到Python2") # 更新Python3版本 @@ -57,41 +66,43 @@ def upgrade_python3(self): # 更新源与软件 def prepare(self): - Logger.info("[INFO] 准备更新软件包列表") + try: + Logger.info("[INFO] 准备更新软件包列表") + + subprocess.run("sudo apt-get update", shell=True, check=True) - code = subprocess.run("sudo apt-get update", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 更新软件包列表失败,请检查网络连接,两秒后准备重新更新") - time.sleep(2) - self.prepare() - elif code.returncode == 0: Logger.info("[INFO] 软件包列表更新完毕") Logger.info("\n") Logger.info("[INFO] 是否更新软件?(y or n) 默认为n") confirm = input("(不输入可直接回车使用默认值)>") if confirm == "y" or confirm == "Y": - code = subprocess.run("sudo apt-get upgrade", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 更新软件失败,请检查网络连接") - else: - Logger.info("[INFO] 更新软件完毕") - else: - pass + subprocess.run("sudo apt-get upgrade", shell=True, check=True) + Logger.info("[INFO] 更新软件完毕") + + except subprocess.CalledProcessError: + Logger.error("[ERROR] 更新失败,请检查网络连接,两秒后准备重新更新") + time.sleep(2) + self.prepare() # 获取当前HA版本 @staticmethod def get_ha_version(): - code = subprocess.run("hass --version", shell=True) - if code.returncode != 0: + try: + subprocess.run("hass --version", shell=True) + except subprocess.CalledProcessError: Logger.error("[ERROR] 未安装HomeAssistant") + def install_ha(self): + return + # 更新HomeAssistant def upgrade_ha(self): - Logger.info("[INFO] 准备更新HomeAssistant") + try: + Logger.info("[INFO] 准备更新HomeAssistant") - code = subprocess.run("sudo pip3 install -U homeassistant", shell=True) - if code.returncode != 0: + subprocess.run("sudo pip3 install -U homeassistant", shell=True, check=True) + except subprocess.CalledProcessError: Logger.error("[ERROR] 更新HomeAssistant失败,请检查网络, 两秒后准备重新安装...") time.sleep(2) self.upgrade_ha() @@ -101,22 +112,123 @@ def upgrade_specific_ha(self): Logger.info("[INFO] 请输入HA版本号") ha_version = input(">") - code = subprocess.run("sudo pip3 install -U homeassistant=={}".format(ha_version), shell=True) - if code.returncode != 0: + try: + subprocess.run("sudo pip3 install -U homeassistant=={}".format(ha_version), shell=True, check=True) + Logger.info("[INFO] 安装{}版本HomeAssistant成功".format(ha_version)) + except subprocess.CalledProcessError: Logger.error("[ERROR] 安装{}版本HomeAssistant失败,请检查版本号与网络连接," "两秒后准备重新安装...".format(ha_version)) time.sleep(2) self.upgrade_specific_ha() - elif code.returncode == 0: - Logger.info("[INFO] 安装{}版本HomeAssistant成功".format(ha_version)) + + def start_ha(self): + subprocess.run("sudo systemctl start home-assistant@{}.service".format(username), shell=True, check=True) + + def restart_ha(self): + subprocess.run("sudo systemctl restart home-assistant@{}.service".format(username), shell=True, check=True) + + def stop_ha(self): + subprocess.run("sudo systemctl stop home-assistant@{}.service".format(username), shell=True, check=True) + + def print_ha_log(self): + try: + subprocess.run("sudo journalctl -f -u home-assistant@{}".format(username), shell=True, check=True) + except subprocess.CalledProcessError: + Logger.error("[ERROR] 查询日志失败") + + def auto_start_ha(self): + Logger.info("[INFO] 准备配置HomeAssistant自启动") + + try: + with open(self.haAutoStartPath, "w+") as f: + f.write("[Unit]\n" + "Description=Home Assistant\n" + "After=network.target\n\n" + "[Service]\n" + "Type=simple\n" + "User=%i\n" + "ExecStart=/usr/local/bin/hass\n\n" + "[Install]\n" + "WantedBy=multi-user.target\n") + try: + subprocess.run("sudo systemctl daemon-reload", shell=True, check=True) + Logger.info("[INFO] HomeAssistant自启动建立成功") + subprocess.run("sudo systemctl enable home-assistant@{}.service".format(username), shell=True) + except subprocess.CalledProcessError: + Logger.error("[ERROR] 自启动重载失败") + except FileNotFoundError: + Logger.error("[ERROR] 自启动建立失败,请检查自启动配置路径.") + + def install_mqtt_broker(self): + return def set_wifi(self): - return "不支持当前系统" + return + + def change_pip_source(self): + return + + def change_apt_source(self): + return + + def install_samba(self): + return class UbuntuService(BaseService): def __init__(self): - super().upgrade_python3() + BaseService.__init__(self) + + @staticmethod + def get_python_version(): + super().get_python_version() + + def prepare(self): + try: + subprocess.run("sudo apt install python3-pip", shell=True, check=True) + Logger.info("[INFO] 安装pip3成功") + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装pip3失败,2s后准备重试...") + time.sleep(2) + self.prepare() + super().prepare() + + @staticmethod + def get_ha_version(): + super().get_ha_version() + + def install_ha(self): + super().install_ha() + + def upgrade_ha(self): + super().upgrade_ha() + + def upgrade_specific_ha(self): + super().upgrade_specific_ha() + + def start_ha(self): + super().start_ha() + + def restart_ha(self): + super().restart_ha() + + def stop_ha(self): + super().stop_ha() + + def print_ha_log(self): + super().print_ha_log() + + def auto_start_ha(self): + super().auto_start_ha() + + def install_mqtt_broker(self): + super().install_mqtt_broker() + + def change_pip_source(self): + super().change_pip_source() + + def change_apt_source(self): + super().change_apt_source() def upgrade_python3(self): base_dir = os.path.abspath(os.path.dirname(__file__)) @@ -151,7 +263,7 @@ def upgrade_python3(self): Logger.info("[INFO] 准备解压python") subprocess.run("tar -xvzf Python-3.7.4.tgz", shell=True) os.chdir("{}/Python-3.7.4".format(base_dir)) - # sudo apt install gcc + subprocess.run("./configure", shell=True) subprocess.run("sudo make && sudo make install", shell=True) Logger.info("[INFO] Python3升级完成") @@ -199,6 +311,27 @@ def set_wifi(self): Logger.warn("[WARNING] SSID不能为空") self.set_wifi() + # 获取当前Python版本 + @staticmethod + def get_python_version(): + + Logger.info("[INFO] Python3 版本") + code = subprocess.run("python3 -V", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未找到Python3") + + Logger.info("[INFO] Python2 版本") + code = subprocess.run("python -V", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未找到Python2") + + # 获取当前HA版本 + @staticmethod + def get_ha_version(): + code = subprocess.run("hass --version", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 未安装HomeAssistant") + # 换源 更换清华源 pip同步时间 5min def change_pip_source(self): code = subprocess.run("sudo mv /etc/pip.conf /etc/pip.conf.bak", shell=True) @@ -235,82 +368,322 @@ def change_apt_source(self): self.prepare() + def prepare(self): + super().prepare() -class Install: - try: - opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", - "rh", "phl", "up", "ush", "sh", "sth", "id", "uup"]) - service = DebianService() - ubuntuservice = UbuntuService() - for opt, value in opts: - if opt == "-h" or opt == "--help": - Logger.info("-h 显示帮助") - Logger.info("-w 添加wifi配置") - Logger.info("-p 更新软件包列表与软件") - Logger.info("-s 安装samba服务") - Logger.info("--im 安装mosquitto") - Logger.info("-" * 30) - Logger.info("--cps 更换pip源") - Logger.info("--cas 更换apt源") - Logger.info("-" * 30) - Logger.info("--ih 安装HomeAssistant") - Logger.info("--uh 更新HomeAssistant") - Logger.info("--has 配置HomeAssistant自启动") - Logger.info("--sh 运行HomeAssistant实例") - Logger.info("--sth 停止HomeAssistant实例") - Logger.info("--rh 重启HomeAssistant") - Logger.info("--phl 查看HomeAssistant日志") - Logger.info("--hv 查看HomeAssistant版本") - Logger.info("-" * 30) - Logger.info("--pv 查看Python版本") - Logger.info("--up 更新Python3版本") - Logger.info("-" * 30) - Logger.info("--id 安装docker CE") - - elif opt == "-w": - service.set_wifi() - elif opt == "-p": - service.prepare() - elif opt == "-s": - service.install_samba() - elif opt == "--pv": - service.get_python_version() - elif opt == "--hv": - service.get_ha_version() - elif opt == "--cps": - service.change_pip_source() - elif opt == "--cas": - service.change_apt_source() - elif opt == "--uh": - service.upgrade_ha() - elif opt == "--usp": - service.upgrade_specific_ha() - elif opt == "--ih": - service.install_ha() - elif opt == "--has": - service.ha_auto_start() - elif opt == "--im": - service.install_mosquitto() - elif opt == "--rh": - service.restart_ha() - elif opt == "--phl": - service.print_ha_log() - elif opt == "--up": - service.upgrade_python() - elif opt == "--sh": - service.start_ha() - elif opt == "--sth": - service.stop_ha() - elif opt == "--id": - service.install_docker() - elif opt == "--uup": - ubuntuservice.upgrade_python3() - except getopt.GetoptError: - Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") + # 更新HomeAssistant + def upgrade_ha(self): + Logger.info("[INFO] 准备更新HomeAssistant") + + code = subprocess.run("sudo pip3 install -U homeassistant", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 更新HomeAssistant失败,请检查网络, 两秒后准备重新安装...") + time.sleep(2) + self.upgrade_ha() + + def upgrade_specific_ha(self): + super().upgrade_specific_ha() + + def install_ha(self): + super().install_ha() + + # HA 自启动 + def auto_start_ha(self): + Logger.info("[INFO] 准备配置HomeAssistant自启动") + + try: + with open(self.auto_start_conf_add, "w+") as f: + f.write("[Unit]\n" + "Description=Home Assistant\n" + "After=network.target\n\n" + "[Service]\n" + "Type=simple\n" + "User=%i\n" + "ExecStart=/usr/local/bin/hass\n\n" + "[Install]\n" + "WantedBy=multi-user.target\n") + Logger.info("[INFO] HomeAssistant自启动建立成功") + except FileNotFoundError: + Logger.error("[ERROR] 自启动建立失败,请检查自启动配置路径.") + + # samba安装 TODO + def install_samba(self): + Logger.info("[INFO] 准备安装Samba") + + subprocess.run("sudo apt-get install samba samba-common", shell=True) + subprocess.run("sudo smbpasswd -a pi", shell=True) + subprocess.run("sudo rm " + self.smb_conf_path, shell=True) + with open(self.smb_conf_path, "w") as f: + f.write("[global]\n" + "netbios name = raspberrypi\n" + "server string = The Pi File Center\n" + "workgroup = WORKGROUP\n" + "hosts allow =\n" + "remote announce =\n" + "remote browse sync =\n" + "[HOME ASSISTANT]\n" + "path = /home/pi\n" + "comment = No comment\n" + "browsable = yes\n" + "read only = no\n" + "valid users =\n" + "writable = yes\n" + "guest ok = yes\n" + "public = yes\n" + "create mask = 0777\n" + "directory mask = 0777\n" + "force user = root\n" + "force create mode = 0777\n" + "force directory mode = 0777\n" + "hosts allow =\n") + subprocess.run("sudo systemctl restart smbd", shell=True) + Logger.info("[INFO] 安装Samba成功") + + # 安装 mosquitto + def install_mqtt_broker(self): + Logger.info("[INFO] 准备安装Mosquitto") + + self.prepare() + code = subprocess.run("sudo apt-get install mosquitto", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装mosquitto失败,请检查网络连接,两秒后准备重新安装") + + time.sleep(2) + self.install_mqtt_broker() + elif code.returncode == 0: + try: + with open(self.mosquitto_config_path, "w+") as f: + f.write("allow_anonymous false\n" + "password_file /etc/mosquitto/pwfile\n" + "listener 1883\n") + Logger.info("[INFO] 写入MQTT配置成功!") + + except FileNotFoundError: + Logger.error("[ERROR] 未发现mqtt配置文件,请重新安装...") + + mqtt_user_name = input("请输入MQTT用户名:") + + subprocess.run("sudo mosquitto_passwd -c /etc/mosquitto/pwfile {}".format(mqtt_user_name), shell=True) + subprocess.run("sudo systemctl start mosquitto.service", shell=True) + Logger.info("[INFO] MQTT安装配置成功") + + # 重启HA + def restart_ha(self): + code = subprocess.run("sudo systemctl restart home-assistant@pi", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 重启HomeAssistant失败") + else: + Logger.info("[INFO] 重启HomeAssistant成功") + + def start_ha(self): + code = subprocess.run("sudo systemctl start home-assistant@pi", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 启动HomeAssistant失败") + else: + Logger.info("[INFO] 启动HomeAssistant成功") + + def stop_ha(self): + code = subprocess.run("sudo systemctl stop home-assistant@pi", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 停止HomeAssistant失败") + else: + Logger.info("[INFO] 停止HomeAssistant成功") + + def print_ha_log(self): + code = subprocess.run("sudo journalctl -f -u home-assistant@pi", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 查看HomeAssistant日志失败") + else: + Logger.info("[INFO] 查看HomeAssistant日志成功") + + # 更新Python3版本 + def upgrade_python3(self): + base_dir = os.path.abspath(os.path.dirname(__file__)) + pv = 'Python-3.7.2' + Logger.info("[INFO] 准备安装{}".format(pv)) + + Logger.info("[INFO] 准备卸载冲突, 如果有请选择y") + + code = subprocess.run("sudo pip3 uninstall homeassistant", shell=True) + if code.returncode != 0: + pass + Logger.info("[INFO] 开始安装依赖") + + time.sleep(2) + code = subprocess.run("sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev", + shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装依赖失败,请检查网络连接,两秒后准备重新安装") + + time.sleep(2) + self.upgrade_python3() + elif code.returncode == 0: + code = subprocess.run("sudo apt-get install wget", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 下载wget失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.prepare() + elif code.returncode == 0: + file_dir = base_dir + '/'.format(pv) + '.tgz' + file = Path(file_dir) + if file.is_file(): + Logger.info("[INFO] 开始解压安装包") + time.sleep(2) + subprocess.run("sudo tar -zvxf {}.tgz".format(pv), shell=True) + os.chdir("{}/{}".format(base_dir, pv)) + Logger.info("[INFO] 开始编译{}".format(pv)) + time.sleep(2) + subprocess.run("sudo ./configure && sudo make && sudo make install", shell=True) + Logger.info("[INFO] 已完成{}安装".format(pv)) + else: + Logger.info("[INFO] 下载Python安装包") + time.sleep(2) + code = subprocess.run("sudo wget https://www.python.org/ftp/python/3.7.2/{}.tgz".format(pv), + shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 下载Python失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.upgrade_python3() + elif code.returncode == 0: + Logger.info("[INFO] 开始解压安装包") + time.sleep(2) + subprocess.run("sudo tar -zvxf {}.tgz".format(pv), shell=True) + os.chdir("{}/{}".format(base_dir, pv)) + Logger.info("[INFO] 开始编译{}".format(pv)) + time.sleep(2) + subprocess.run("sudo ./configure && sudo make && sudo make install", shell=True) + Logger.info("[INFO] 已完成{}安装".format(pv)) + + Logger.info("\n") + # os.remove(pv + '.tgz') + self.get_python_version() + + # 安装docker ce + def install_docker(self): + + Logger.info("[INFO] 准备安装docker CE") + if self.flag == 0: + self.prepare() + self.flag = 1 + Logger.info("[INFO] 准备安装docker CE依赖") + code = subprocess.run( + "sudo apt-get install apt-transport-https ca-certificates gnupg2 lsb-release software-properties-common", + shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 安装依赖失败,2s后准备重新安装...") + time.sleep(2) + self.install_docker() + else: + Logger.info("[INFO] 准备添加GPG秘钥") + code = subprocess.run("curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian/gpg | sudo apt-key " + "add -", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] 添加秘钥失败,2s后准备重新添加") + time.sleep(2) + self.install_docker() + else: + Logger.info("[INFO] 准备添加国内镜像源") + with open(self.apt_source_path, 'a') as f: + f.write("deb https://download.docker.com/linux/raspbian stretch stable") + self.prepare() + # TODO: 安装docker ce + code = subprocess.run("sudo apt-get install docker-ce", shell=True) + if code.returncode != 0: + Logger.error("[ERROR] docker CE安装失败,准备重新安装...") + self.install_docker() + else: + Logger.info("[INFO] 准备建立用户组") + # 建立docker 用户组 + subprocess.run("sudo groupadd docker", shell=True) + # 当前用户加入用户组 + subprocess.run("sudo usermod -aG docker $USER", shell=True) + # 测试docker是否安装成功 + Logger.info("[INFO] 验证docker是否安装成功") + subprocess.run("docker run arm32v7/hello-world", shell=True) + Logger.info("[INFO] 准备启动docker CE") + subprocess.run("sudo systemctl enable docker", shell=True) + subprocess.run("sudo systemctl start docker", shell=True) + # Logger.info("[INFO] 配置镜像加速器") + # with open(self.docker_mirror_path, "w+") as f: + # f.write() + + +# class Install: +# try: +# opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", +# "rh", "phl", "up", "ush", "sh", "sth", "id", "uup"]) +# service = DebianService() +# ubuntuservice = UbuntuService() +# for opt, value in opts: +# if opt == "-h" or opt == "--help": +# Logger.info("-h 显示帮助") +# Logger.info("-w 添加wifi配置") +# Logger.info("-p 更新软件包列表与软件") +# Logger.info("-s 安装samba服务") +# Logger.info("--im 安装mosquitto") +# Logger.info("-" * 30) +# Logger.info("--cps 更换pip源") +# Logger.info("--cas 更换apt源") +# Logger.info("-" * 30) +# Logger.info("--ih 安装HomeAssistant") +# Logger.info("--uh 更新HomeAssistant") +# Logger.info("--has 配置HomeAssistant自启动") +# Logger.info("--sh 运行HomeAssistant实例") +# Logger.info("--sth 停止HomeAssistant实例") +# Logger.info("--rh 重启HomeAssistant") +# Logger.info("--phl 查看HomeAssistant日志") +# Logger.info("--hv 查看HomeAssistant版本") +# Logger.info("-" * 30) +# Logger.info("--pv 查看Python版本") +# Logger.info("--up 更新Python3版本") +# Logger.info("-" * 30) +# Logger.info("--id 安装docker CE") +# +# elif opt == "-w": +# service.set_wifi() +# elif opt == "-p": +# service.prepare() +# elif opt == "-s": +# service.install_samba() +# elif opt == "--pv": +# service.get_python_version() +# elif opt == "--hv": +# service.get_ha_version() +# elif opt == "--cps": +# service.change_pip_source() +# elif opt == "--cas": +# service.change_apt_source() +# elif opt == "--uh": +# service.upgrade_ha() +# elif opt == "--usp": +# service.upgrade_specific_ha() +# elif opt == "--ih": +# service.install_ha() +# elif opt == "--has": +# service.ha_auto_start() +# elif opt == "--im": +# service.install_mosquitto() +# elif opt == "--rh": +# service.restart_ha() +# elif opt == "--phl": +# service.print_ha_log() +# elif opt == "--up": +# service.upgrade_python() +# elif opt == "--sh": +# service.start_ha() +# elif opt == "--sth": +# service.stop_ha() +# elif opt == "--id": +# service.install_docker() +# elif opt == "--uup": +# ubuntuservice.upgrade_python3() +# except getopt.GetoptError: +# Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") if __name__ == '__main__': try: - Install() + # Install() + ... except PermissionError: Logger.error("[ERROR] 权限不足,请使用sudo权限运行此程序") From 1e93adc39773e62253f99fba52a2fa8f1ad8582d Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 16:14:16 +0800 Subject: [PATCH 03/10] Add files via upload --- install.py | 280 ++++++++++++++++++++++------------------------------- 1 file changed, 117 insertions(+), 163 deletions(-) diff --git a/install.py b/install.py index 5c11f42..01fa9bc 100644 --- a/install.py +++ b/install.py @@ -5,7 +5,6 @@ import os from pathlib import Path import getpass -import getpass username = getpass.getuser() @@ -174,6 +173,9 @@ def change_apt_source(self): def install_samba(self): return + def install_docker(self): + return + class UbuntuService(BaseService): def __init__(self): @@ -222,13 +224,13 @@ def auto_start_ha(self): super().auto_start_ha() def install_mqtt_broker(self): - super().install_mqtt_broker() + Logger.warn("[WARNING] 暂不支持") def change_pip_source(self): - super().change_pip_source() + Logger.warn("[WARNING] 暂不支持") def change_apt_source(self): - super().change_apt_source() + Logger.warn("[WARNING] 暂不支持") def upgrade_python3(self): base_dir = os.path.abspath(os.path.dirname(__file__)) @@ -270,15 +272,18 @@ def upgrade_python3(self): subprocess.run("ln -s /usr/python3.7/bin/python3 /usr/bin/python3", shell=True) def set_wifi(self): - return super().set_wifi() + Logger.warn("[WARNING] 暂不支持") + + def install_docker(self): + Logger.warn("[WARNING] 暂不支持") # 树莓派 class DebianService(BaseService): def __init__(self): + super().__init__() self.pip_source_path = "/etc/pip.conf" self.apt_source_path = "/etc/apt/sources.list" - self.auto_start_conf_add = "/etc/systemd/system/home-assistant@pi.service" self.smb_conf_path = "/etc/samba/smb.conf" self.wifi_conf_path = "/etc/wpa_supplicant/wpa_supplicant.conf" self.mosquitto_config_path = "/etc/mosquitto/mosquitto.conf" @@ -311,75 +316,50 @@ def set_wifi(self): Logger.warn("[WARNING] SSID不能为空") self.set_wifi() - # 获取当前Python版本 @staticmethod def get_python_version(): + super().get_python_version() - Logger.info("[INFO] Python3 版本") - code = subprocess.run("python3 -V", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 未找到Python3") - - Logger.info("[INFO] Python2 版本") - code = subprocess.run("python -V", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 未找到Python2") - - # 获取当前HA版本 @staticmethod def get_ha_version(): - code = subprocess.run("hass --version", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 未安装HomeAssistant") + super().get_ha_version() # 换源 更换清华源 pip同步时间 5min def change_pip_source(self): - code = subprocess.run("sudo mv /etc/pip.conf /etc/pip.conf.bak", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 没有找到pip文件,准备建立pip文件") - - time.sleep(2) + try: + subprocess.run("sudo mv /etc/pip.conf /etc/pip.conf.bak", shell=True, check=True) with open(self.pip_source_path, 'w+') as f: f.write("[global]\n" "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") Logger.info("[INFO] 写入pip文件成功") - - elif code.returncode == 0: + except subprocess.CalledProcessError: + Logger.error("[ERROR] 没有找到pip文件,准备建立pip文件") with open(self.pip_source_path, 'w+') as f: f.write("[global]\n" "index-url = https://pypi.tuna.tsinghua.edu.cn/simple") Logger.info("[INFO] 写入pip文件成功") def change_apt_source(self): - code = subprocess.run("sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak", shell=True) - if code.returncode != 0: - Logger.error("[INFO] 找不到apt文件,准备建立apt文件") - time.sleep(2) + try: + subprocess.run("sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak", shell=True, check=True) with open(self.apt_source_path, 'w+') as f: f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") Logger.info("[INFO] 写入apt文件成功") - - elif code.returncode == 0: + except subprocess.CalledProcessError: + Logger.error("[INFO] 找不到apt文件,准备建立apt文件") + time.sleep(2) with open(self.apt_source_path, 'w+') as f: f.write("deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib\n" "deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib") Logger.info("[INFO] 写入apt文件成功") - self.prepare() def prepare(self): super().prepare() - # 更新HomeAssistant def upgrade_ha(self): - Logger.info("[INFO] 准备更新HomeAssistant") - - code = subprocess.run("sudo pip3 install -U homeassistant", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 更新HomeAssistant失败,请检查网络, 两秒后准备重新安装...") - time.sleep(2) - self.upgrade_ha() + super().upgrade_ha() def upgrade_specific_ha(self): super().upgrade_specific_ha() @@ -387,24 +367,8 @@ def upgrade_specific_ha(self): def install_ha(self): super().install_ha() - # HA 自启动 def auto_start_ha(self): - Logger.info("[INFO] 准备配置HomeAssistant自启动") - - try: - with open(self.auto_start_conf_add, "w+") as f: - f.write("[Unit]\n" - "Description=Home Assistant\n" - "After=network.target\n\n" - "[Service]\n" - "Type=simple\n" - "User=%i\n" - "ExecStart=/usr/local/bin/hass\n\n" - "[Install]\n" - "WantedBy=multi-user.target\n") - Logger.info("[INFO] HomeAssistant自启动建立成功") - except FileNotFoundError: - Logger.error("[ERROR] 自启动建立失败,请检查自启动配置路径.") + super().auto_start_ha() # samba安装 TODO def install_samba(self): @@ -444,13 +408,8 @@ def install_mqtt_broker(self): Logger.info("[INFO] 准备安装Mosquitto") self.prepare() - code = subprocess.run("sudo apt-get install mosquitto", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 安装mosquitto失败,请检查网络连接,两秒后准备重新安装") - - time.sleep(2) - self.install_mqtt_broker() - elif code.returncode == 0: + try: + subprocess.run("sudo apt-get install mosquitto", shell=True, check=True) try: with open(self.mosquitto_config_path, "w+") as f: f.write("allow_anonymous false\n" @@ -460,41 +419,26 @@ def install_mqtt_broker(self): except FileNotFoundError: Logger.error("[ERROR] 未发现mqtt配置文件,请重新安装...") - mqtt_user_name = input("请输入MQTT用户名:") - subprocess.run("sudo mosquitto_passwd -c /etc/mosquitto/pwfile {}".format(mqtt_user_name), shell=True) subprocess.run("sudo systemctl start mosquitto.service", shell=True) Logger.info("[INFO] MQTT安装配置成功") + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装mosquitto失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.install_mqtt_broker() - # 重启HA def restart_ha(self): - code = subprocess.run("sudo systemctl restart home-assistant@pi", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 重启HomeAssistant失败") - else: - Logger.info("[INFO] 重启HomeAssistant成功") + super().restart_ha() def start_ha(self): - code = subprocess.run("sudo systemctl start home-assistant@pi", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 启动HomeAssistant失败") - else: - Logger.info("[INFO] 启动HomeAssistant成功") + super().start_ha() def stop_ha(self): - code = subprocess.run("sudo systemctl stop home-assistant@pi", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 停止HomeAssistant失败") - else: - Logger.info("[INFO] 停止HomeAssistant成功") + super().stop_ha() def print_ha_log(self): - code = subprocess.run("sudo journalctl -f -u home-assistant@pi", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 查看HomeAssistant日志失败") - else: - Logger.info("[INFO] 查看HomeAssistant日志成功") + super().print_ha_log() # 更新Python3版本 def upgrade_python3(self): @@ -608,82 +552,92 @@ def install_docker(self): # f.write() -# class Install: -# try: -# opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", -# "rh", "phl", "up", "ush", "sh", "sth", "id", "uup"]) -# service = DebianService() -# ubuntuservice = UbuntuService() -# for opt, value in opts: -# if opt == "-h" or opt == "--help": -# Logger.info("-h 显示帮助") -# Logger.info("-w 添加wifi配置") -# Logger.info("-p 更新软件包列表与软件") -# Logger.info("-s 安装samba服务") -# Logger.info("--im 安装mosquitto") -# Logger.info("-" * 30) -# Logger.info("--cps 更换pip源") -# Logger.info("--cas 更换apt源") -# Logger.info("-" * 30) -# Logger.info("--ih 安装HomeAssistant") -# Logger.info("--uh 更新HomeAssistant") -# Logger.info("--has 配置HomeAssistant自启动") -# Logger.info("--sh 运行HomeAssistant实例") -# Logger.info("--sth 停止HomeAssistant实例") -# Logger.info("--rh 重启HomeAssistant") -# Logger.info("--phl 查看HomeAssistant日志") -# Logger.info("--hv 查看HomeAssistant版本") -# Logger.info("-" * 30) -# Logger.info("--pv 查看Python版本") -# Logger.info("--up 更新Python3版本") -# Logger.info("-" * 30) -# Logger.info("--id 安装docker CE") -# -# elif opt == "-w": -# service.set_wifi() -# elif opt == "-p": -# service.prepare() -# elif opt == "-s": -# service.install_samba() -# elif opt == "--pv": -# service.get_python_version() -# elif opt == "--hv": -# service.get_ha_version() -# elif opt == "--cps": -# service.change_pip_source() -# elif opt == "--cas": -# service.change_apt_source() -# elif opt == "--uh": -# service.upgrade_ha() -# elif opt == "--usp": -# service.upgrade_specific_ha() -# elif opt == "--ih": -# service.install_ha() -# elif opt == "--has": -# service.ha_auto_start() -# elif opt == "--im": -# service.install_mosquitto() -# elif opt == "--rh": -# service.restart_ha() -# elif opt == "--phl": -# service.print_ha_log() -# elif opt == "--up": -# service.upgrade_python() -# elif opt == "--sh": -# service.start_ha() -# elif opt == "--sth": -# service.stop_ha() -# elif opt == "--id": -# service.install_docker() -# elif opt == "--uup": -# ubuntuservice.upgrade_python3() -# except getopt.GetoptError: -# Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") +class Install: + global service + try: + opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", + "rh", "phl", "up", "ush", "sh", "sth", "id"]) + import platform + system = platform.system() + if system == "Windows": + Logger.error("[ERROR] 不支持Windows操作系统") + elif system == "Linux": + out = subprocess.check_output("cat /etc/os-release", shell=True) + out = out.decode("utf-8") + if "NAME=\"Ubuntu\"" in out: + Logger.info("[INFO] 检测到Ubuntu系统") + service = UbuntuService() + else: + Logger.info("[INFO] 检测到Debian操作系统") + service = DebianService() + + for opt, value in opts: + if opt == "-h" or opt == "--help": + Logger.info("-h 显示帮助") + Logger.info("-w 添加wifi配置") + Logger.info("-p 更新软件包列表与软件") + Logger.info("-s 安装samba服务") + Logger.info("--im 安装MQTT Broker") + Logger.info("-" * 30) + Logger.info("--cps 更换pip源") + Logger.info("--cas 更换apt源") + Logger.info("-" * 30) + Logger.info("--ih 安装HomeAssistant") + Logger.info("--uh 更新HomeAssistant") + Logger.info("--has 配置HomeAssistant自启动") + Logger.info("--sh 运行HomeAssistant实例") + Logger.info("--sth 停止HomeAssistant实例") + Logger.info("--rh 重启HomeAssistant") + Logger.info("--phl 查看HomeAssistant日志") + Logger.info("--hv 查看HomeAssistant版本") + Logger.info("-" * 30) + Logger.info("--pv 查看Python版本") + Logger.info("--up 更新Python3版本") + Logger.info("-" * 30) + Logger.info("--id 安装docker CE") + elif opt == "-w": + service.set_wifi() + elif opt == "-p": + service.prepare() + elif opt == "-s": + service.install_samba() + elif opt == "--pv": + service.get_python_version() + elif opt == "--hv": + service.get_ha_version() + elif opt == "--cps": + service.change_pip_source() + elif opt == "--cas": + service.change_apt_source() + elif opt == "--uh": + service.upgrade_ha() + elif opt == "--usp": + service.upgrade_specific_ha() + elif opt == "--ih": + service.install_ha() + elif opt == "--has": + service.auto_start_ha() + elif opt == "--im": + service.install_mqtt_broker() + elif opt == "--rh": + service.restart_ha() + elif opt == "--phl": + service.print_ha_log() + elif opt == "--up": + service.upgrade_python3() + elif opt == "--sh": + service.start_ha() + elif opt == "--sth": + service.stop_ha() + elif opt == "--id": + service.install_docker() + + except getopt.GetoptError: + Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") if __name__ == '__main__': try: - # Install() - ... + Install() except PermissionError: Logger.error("[ERROR] 权限不足,请使用sudo权限运行此程序") From f834163a85dc724afb52e20ffa08485c05b5c1c0 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 16:27:34 +0800 Subject: [PATCH 04/10] Update install.py --- install.py | 181 +++++++++++++++++++++++++++++------------------------ 1 file changed, 99 insertions(+), 82 deletions(-) diff --git a/install.py b/install.py index 01fa9bc..df6f88a 100644 --- a/install.py +++ b/install.py @@ -277,6 +277,9 @@ def set_wifi(self): def install_docker(self): Logger.warn("[WARNING] 暂不支持") + def install_samba(self): + Logger.warn("[WARNING] 暂不支持") + # 树莓派 class DebianService(BaseService): @@ -553,91 +556,105 @@ def install_docker(self): class Install: - global service - try: - opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", - "rh", "phl", "up", "ush", "sh", "sth", "id"]) - import platform - system = platform.system() - if system == "Windows": - Logger.error("[ERROR] 不支持Windows操作系统") - elif system == "Linux": - out = subprocess.check_output("cat /etc/os-release", shell=True) - out = out.decode("utf-8") - if "NAME=\"Ubuntu\"" in out: - Logger.info("[INFO] 检测到Ubuntu系统") - service = UbuntuService() - else: - Logger.info("[INFO] 检测到Debian操作系统") - service = DebianService() - - for opt, value in opts: - if opt == "-h" or opt == "--help": - Logger.info("-h 显示帮助") - Logger.info("-w 添加wifi配置") - Logger.info("-p 更新软件包列表与软件") - Logger.info("-s 安装samba服务") - Logger.info("--im 安装MQTT Broker") - Logger.info("-" * 30) - Logger.info("--cps 更换pip源") - Logger.info("--cas 更换apt源") - Logger.info("-" * 30) - Logger.info("--ih 安装HomeAssistant") - Logger.info("--uh 更新HomeAssistant") - Logger.info("--has 配置HomeAssistant自启动") - Logger.info("--sh 运行HomeAssistant实例") - Logger.info("--sth 停止HomeAssistant实例") - Logger.info("--rh 重启HomeAssistant") - Logger.info("--phl 查看HomeAssistant日志") - Logger.info("--hv 查看HomeAssistant版本") - Logger.info("-" * 30) - Logger.info("--pv 查看Python版本") - Logger.info("--up 更新Python3版本") - Logger.info("-" * 30) - Logger.info("--id 安装docker CE") - elif opt == "-w": - service.set_wifi() - elif opt == "-p": - service.prepare() - elif opt == "-s": - service.install_samba() - elif opt == "--pv": - service.get_python_version() - elif opt == "--hv": - service.get_ha_version() - elif opt == "--cps": - service.change_pip_source() - elif opt == "--cas": - service.change_apt_source() - elif opt == "--uh": - service.upgrade_ha() - elif opt == "--usp": - service.upgrade_specific_ha() - elif opt == "--ih": - service.install_ha() - elif opt == "--has": - service.auto_start_ha() - elif opt == "--im": - service.install_mqtt_broker() - elif opt == "--rh": - service.restart_ha() - elif opt == "--phl": - service.print_ha_log() - elif opt == "--up": - service.upgrade_python3() - elif opt == "--sh": - service.start_ha() - elif opt == "--sth": - service.stop_ha() - elif opt == "--id": - service.install_docker() - - except getopt.GetoptError: - Logger.error("[ERROR] 没有这个选项, 请使用-h或--help查看可用选项") + def __init__(self, os_name): + self.os_name = os_name + self.service = "" + + @staticmethod + def help(): + Logger.info("-h 显示帮助") + Logger.info("-w 添加wifi配置") + Logger.info("-p 更新软件包列表与软件") + Logger.info("-s 安装samba服务") + Logger.info("--im 安装MQTT Broker") + Logger.info("-" * 30) + Logger.info("--cps 更换pip源") + Logger.info("--cas 更换apt源") + Logger.info("-" * 30) + Logger.info("--ih 安装HomeAssistant") + Logger.info("--uh 更新HomeAssistant") + Logger.info("--has 配置HomeAssistant自启动") + Logger.info("--sh 运行HomeAssistant实例") + Logger.info("--sth 停止HomeAssistant实例") + Logger.info("--rh 重启HomeAssistant") + Logger.info("--phl 查看HomeAssistant日志") + Logger.info("--hv 查看HomeAssistant版本") + Logger.info("-" * 30) + Logger.info("--pv 查看Python版本") + Logger.info("--up 更新Python3版本") + Logger.info("-" * 30) + Logger.info("--id 安装docker CE") + + def install(self): + global service + try: + opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", + "cas", "uh", "ih", "has", "im", + "rh", "phl", "up", "ush", "sh", "sth", "id"]) + + if self.os_name == "Windows": + Logger.error("[ERROR] 不支持Windows操作系统") + elif self.os_name == "Linux": + out = subprocess.check_output("cat /etc/os-release", shell=True) + out = out.decode("utf-8") + if "NAME=\"Ubuntu\"" in out: + Logger.info("[INFO] 检测到Ubuntu系统") + self.service = UbuntuService() + elif "NAME=\"Debian\"" in out: + Logger.info("[INFO] 检测到Debian操作系统") + service = DebianService() + else: + Logger.warn("[WARNING] 没有检测到操作系统版本") + + for opt, value in opts: + if opt == "-h" or opt == "--help": + help() + elif opt == "-w": + service.set_wifi() + elif opt == "-p": + service.prepare() + elif opt == "-s": + service.install_samba() + elif opt == "--pv": + service.get_python_version() + elif opt == "--hv": + service.get_ha_version() + elif opt == "--cps": + service.change_pip_source() + elif opt == "--cas": + service.change_apt_source() + elif opt == "--uh": + service.upgrade_ha() + elif opt == "--usp": + service.upgrade_specific_ha() + elif opt == "--ih": + service.install_ha() + elif opt == "--has": + service.auto_start_ha() + elif opt == "--im": + service.install_mqtt_broker() + elif opt == "--rh": + service.restart_ha() + elif opt == "--phl": + service.print_ha_log() + elif opt == "--up": + service.upgrade_python3() + elif opt == "--sh": + service.start_ha() + elif opt == "--sth": + service.stop_ha() + elif opt == "--id": + service.install_docker() + + except getopt.GetoptError: + Logger.error("[ERROR] 没有这个选项, 请查看可用选项") + help() if __name__ == '__main__': try: - Install() + import platform + system = platform.system() + Install(system).install() except PermissionError: Logger.error("[ERROR] 权限不足,请使用sudo权限运行此程序") From 5a19905ce0d662721d9b3322032488c80b0ba85a Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 16:28:58 +0800 Subject: [PATCH 05/10] Update install.py --- install.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/install.py b/install.py index df6f88a..c7c7ac5 100644 --- a/install.py +++ b/install.py @@ -560,8 +560,7 @@ def __init__(self, os_name): self.os_name = os_name self.service = "" - @staticmethod - def help(): + def help_(self): Logger.info("-h 显示帮助") Logger.info("-w 添加wifi配置") Logger.info("-p 更新软件包列表与软件") @@ -608,7 +607,7 @@ def install(self): for opt, value in opts: if opt == "-h" or opt == "--help": - help() + self.help_() elif opt == "-w": service.set_wifi() elif opt == "-p": From 7898a74f1aa86b3baadc06efb48d3f558a145dd9 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 16:30:53 +0800 Subject: [PATCH 06/10] Update install.py --- install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.py b/install.py index c7c7ac5..10b0aed 100644 --- a/install.py +++ b/install.py @@ -647,7 +647,7 @@ def install(self): except getopt.GetoptError: Logger.error("[ERROR] 没有这个选项, 请查看可用选项") - help() + self.help_() if __name__ == '__main__': From 842e09d503a6227f0935014693bfd93f43512fc9 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 16:56:52 +0800 Subject: [PATCH 07/10] Update install.py --- install.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/install.py b/install.py index 10b0aed..6fcbbf4 100644 --- a/install.py +++ b/install.py @@ -601,7 +601,7 @@ def install(self): self.service = UbuntuService() elif "NAME=\"Debian\"" in out: Logger.info("[INFO] 检测到Debian操作系统") - service = DebianService() + self.service = DebianService() else: Logger.warn("[WARNING] 没有检测到操作系统版本") @@ -609,41 +609,41 @@ def install(self): if opt == "-h" or opt == "--help": self.help_() elif opt == "-w": - service.set_wifi() + self.service.set_wifi() elif opt == "-p": - service.prepare() + self.service.prepare() elif opt == "-s": - service.install_samba() + self.service.install_samba() elif opt == "--pv": - service.get_python_version() + self.service.get_python_version() elif opt == "--hv": - service.get_ha_version() + self.service.get_ha_version() elif opt == "--cps": - service.change_pip_source() + self.service.change_pip_source() elif opt == "--cas": - service.change_apt_source() + self.service.change_apt_source() elif opt == "--uh": - service.upgrade_ha() + self.service.upgrade_ha() elif opt == "--usp": - service.upgrade_specific_ha() + self.service.upgrade_specific_ha() elif opt == "--ih": - service.install_ha() + self.service.install_ha() elif opt == "--has": - service.auto_start_ha() + self.service.auto_start_ha() elif opt == "--im": - service.install_mqtt_broker() + self.service.install_mqtt_broker() elif opt == "--rh": - service.restart_ha() + self.service.restart_ha() elif opt == "--phl": - service.print_ha_log() + self.service.print_ha_log() elif opt == "--up": - service.upgrade_python3() + self.service.upgrade_python3() elif opt == "--sh": - service.start_ha() + self.service.start_ha() elif opt == "--sth": - service.stop_ha() + self.service.stop_ha() elif opt == "--id": - service.install_docker() + self.service.install_docker() except getopt.GetoptError: Logger.error("[ERROR] 没有这个选项, 请查看可用选项") From 31bff28073a0ae0e25a3410894f2ba1777cb3c65 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Mon, 22 Jul 2019 17:28:35 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=AE=8C=E5=85=A8=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.py | 163 +++++++++++++++++++++++++---------------------------- 1 file changed, 78 insertions(+), 85 deletions(-) diff --git a/install.py b/install.py index 6fcbbf4..2361793 100644 --- a/install.py +++ b/install.py @@ -6,7 +6,6 @@ from pathlib import Path import getpass - username = getpass.getuser() @@ -45,8 +44,7 @@ def __init__(self): self.haAutoStartPath = "/etc/systemd/system/home-assistant@{}.service".format(self.username) # 获取当前Python版本 - @staticmethod - def get_python_version(): + def get_python_version(self): try: Logger.info("[INFO] Python3 版本") subprocess.run("python3 -V", shell=True, check=True) @@ -85,15 +83,21 @@ def prepare(self): self.prepare() # 获取当前HA版本 - @staticmethod - def get_ha_version(): + def get_ha_version(self): try: subprocess.run("hass --version", shell=True) except subprocess.CalledProcessError: Logger.error("[ERROR] 未安装HomeAssistant") def install_ha(self): - return + try: + Logger.info("[INFO] 准备安装HomeAssistant") + subprocess.run("sudo pip3 install homeassistant", shell=True, check=True) + Logger.info("[INFO] HomeAssistant安装成功") + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装失败,2s后准备重试...") + time.sleep(2) + self.install_ha() # 更新HomeAssistant def upgrade_ha(self): @@ -179,10 +183,9 @@ def install_docker(self): class UbuntuService(BaseService): def __init__(self): - BaseService.__init__(self) + super().__init__() - @staticmethod - def get_python_version(): + def get_python_version(self): super().get_python_version() def prepare(self): @@ -195,8 +198,7 @@ def prepare(self): self.prepare() super().prepare() - @staticmethod - def get_ha_version(): + def get_ha_version(self): super().get_ha_version() def install_ha(self): @@ -237,39 +239,36 @@ def upgrade_python3(self): Logger.info("[INFO] 准备更新Ubuntu Python3版本") self.prepare() Logger.info("[INFO] 准备安装依赖") - code = subprocess.run( - "sudo apt install wget && sudo apt install zlib* && sudo apt install libffi-dev " - "&& sudo apt install openssl && sudo apt install libssl-dev && sudo apt install make", - shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 安装依赖失败") - self.upgrade_python3() - else: + try: + subprocess.run( + "sudo apt install wget && sudo apt install zlib* && sudo apt install libffi-dev " + "&& sudo apt install openssl && sudo apt install libssl-dev && sudo apt install make", + shell=True, check=True) Logger.info("[INFO] 安装依赖成功") - - Logger.info("[INFO] 准备下载Python3") - code = subprocess.run("wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 下载Python3失败,准备重新下载...") - self.upgrade_python3() - else: - Logger.info("[INFO] 下载Python3成功") - - Logger.info("[INFO] 准备安装GCC") - code = subprocess.run("sudo apt install gcc", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 安装gcc失败,准备重新安装...") + Logger.info("[INFO] 准备下载Python3") + try: + subprocess.run("wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz", shell=True, check=True) + Logger.info("[INFO] 下载Python3成功") + Logger.info("[INFO] 准备安装GCC") + try: + subprocess.run("sudo apt install gcc", shell=True, check=True) + Logger.info("[INFO] 安装gcc成功") + Logger.info("[INFO] 准备解压python") + subprocess.run("tar -xvzf Python-3.7.4.tgz", shell=True) + os.chdir("{}/Python-3.7.4".format(base_dir)) + subprocess.run("./configure", shell=True) + subprocess.run("sudo make && sudo make install", shell=True) + Logger.info("[INFO] Python3升级完成") + subprocess.run("ln -s /usr/python3.7/bin/python3 /usr/bin/python3", shell=True) + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装gcc失败,准备重新安装...") + self.upgrade_python3() + except subprocess.CalledProcessError: + Logger.error("[ERROR] 下载Python3失败,准备重新下载...") + self.upgrade_python3() + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装依赖失败") self.upgrade_python3() - else: - Logger.info("[INFO] 安装gcc成功") - Logger.info("[INFO] 准备解压python") - subprocess.run("tar -xvzf Python-3.7.4.tgz", shell=True) - os.chdir("{}/Python-3.7.4".format(base_dir)) - - subprocess.run("./configure", shell=True) - subprocess.run("sudo make && sudo make install", shell=True) - Logger.info("[INFO] Python3升级完成") - subprocess.run("ln -s /usr/python3.7/bin/python3 /usr/bin/python3", shell=True) def set_wifi(self): Logger.warn("[WARNING] 暂不支持") @@ -319,12 +318,10 @@ def set_wifi(self): Logger.warn("[WARNING] SSID不能为空") self.set_wifi() - @staticmethod - def get_python_version(): + def get_python_version(self): super().get_python_version() - @staticmethod - def get_ha_version(): + def get_ha_version(self): super().get_ha_version() # 换源 更换清华源 pip同步时间 5min @@ -377,8 +374,12 @@ def auto_start_ha(self): def install_samba(self): Logger.info("[INFO] 准备安装Samba") - subprocess.run("sudo apt-get install samba samba-common", shell=True) - subprocess.run("sudo smbpasswd -a pi", shell=True) + try: + subprocess.run("sudo apt-get install samba samba-common", shell=True, check=True) + except subprocess.CalledProcessError: + Logger.error("ERROR] samba安装失败...准备重新安装") + self.install_samba() + subprocess.run("sudo smbpasswd -a {}".format(username), shell=True) subprocess.run("sudo rm " + self.smb_conf_path, shell=True) with open(self.smb_conf_path, "w") as f: f.write("[global]\n" @@ -450,27 +451,13 @@ def upgrade_python3(self): Logger.info("[INFO] 准备安装{}".format(pv)) Logger.info("[INFO] 准备卸载冲突, 如果有请选择y") - - code = subprocess.run("sudo pip3 uninstall homeassistant", shell=True) - if code.returncode != 0: - pass + subprocess.run("sudo pip3 uninstall homeassistant", shell=True) Logger.info("[INFO] 开始安装依赖") - - time.sleep(2) - code = subprocess.run("sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev", - shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 安装依赖失败,请检查网络连接,两秒后准备重新安装") - - time.sleep(2) - self.upgrade_python3() - elif code.returncode == 0: - code = subprocess.run("sudo apt-get install wget", shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 下载wget失败,请检查网络连接,两秒后准备重新安装") - time.sleep(2) - self.prepare() - elif code.returncode == 0: + try: + subprocess.run("sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev", + shell=True, check=True) + try: + subprocess.run("sudo apt-get install wget", shell=True, check=True) file_dir = base_dir + '/'.format(pv) + '.tgz' file = Path(file_dir) if file.is_file(): @@ -485,13 +472,9 @@ def upgrade_python3(self): else: Logger.info("[INFO] 下载Python安装包") time.sleep(2) - code = subprocess.run("sudo wget https://www.python.org/ftp/python/3.7.2/{}.tgz".format(pv), - shell=True) - if code.returncode != 0: - Logger.error("[ERROR] 下载Python失败,请检查网络连接,两秒后准备重新安装") - time.sleep(2) - self.upgrade_python3() - elif code.returncode == 0: + try: + subprocess.run("sudo wget https://www.python.org/ftp/python/3.7.2/{}.tgz".format(pv), + shell=True, check=True) Logger.info("[INFO] 开始解压安装包") time.sleep(2) subprocess.run("sudo tar -zvxf {}.tgz".format(pv), shell=True) @@ -500,9 +483,18 @@ def upgrade_python3(self): time.sleep(2) subprocess.run("sudo ./configure && sudo make && sudo make install", shell=True) Logger.info("[INFO] 已完成{}安装".format(pv)) - - Logger.info("\n") - # os.remove(pv + '.tgz') + except subprocess.CalledProcessError: + Logger.error("[ERROR] 下载Python失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.upgrade_python3() + except subprocess.CalledProcessError: + Logger.error("[ERROR] 下载wget失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.prepare() + except subprocess.CalledProcessError: + Logger.error("[ERROR] 安装依赖失败,请检查网络连接,两秒后准备重新安装") + time.sleep(2) + self.upgrade_python3() self.get_python_version() # 安装docker ce @@ -558,9 +550,10 @@ def install_docker(self): class Install: def __init__(self, os_name): self.os_name = os_name - self.service = "" + self.service = None - def help_(self): + @staticmethod + def help_info(): Logger.info("-h 显示帮助") Logger.info("-w 添加wifi配置") Logger.info("-p 更新软件包列表与软件") @@ -585,14 +578,13 @@ def help_(self): Logger.info("--id 安装docker CE") def install(self): - global service try: opts, args = getopt.getopt(sys.argv[1:], "-w-p-s-h", ["help", "pv", "hv", "cps", "cas", "uh", "ih", "has", "im", "rh", "phl", "up", "ush", "sh", "sth", "id"]) if self.os_name == "Windows": - Logger.error("[ERROR] 不支持Windows操作系统") + raise Exception("[ERROR] 不支持Windows操作系统") elif self.os_name == "Linux": out = subprocess.check_output("cat /etc/os-release", shell=True) out = out.decode("utf-8") @@ -607,7 +599,7 @@ def install(self): for opt, value in opts: if opt == "-h" or opt == "--help": - self.help_() + self.help_info() elif opt == "-w": self.service.set_wifi() elif opt == "-p": @@ -646,13 +638,14 @@ def install(self): self.service.install_docker() except getopt.GetoptError: - Logger.error("[ERROR] 没有这个选项, 请查看可用选项") - self.help_() + self.help_info() + raise Exception("[ERROR] 没有这个选项, 请查看可用选项") if __name__ == '__main__': try: import platform + system = platform.system() Install(system).install() except PermissionError: From 91802e1ce9c4a9bbe22057e1a33b8cc56225f764 Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Sun, 28 Jul 2019 11:23:46 +0800 Subject: [PATCH 09/10] upgrade readme --- README.md | 52 +++------------------------------------------------- 1 file changed, 3 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 368ab8e..83bed44 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,10 @@ -# Raspberry Pi Service Install Script - -## Installation - From curl: - - `sudo curl -O https://raw.githubusercontent.com/morestart/RaspbianInstallScript/master/install.py` - -## Documentation - -`-h` get help info - -`-w` add wifi config - -`-p` Updating Package List and Software - -`-s` Installing Samba services - -`--im` Installing mosquitto services - --------------------- -`--cps` change pip source - -`--cas` change apt source - --------------------- -`--ih` install HomeAssistant - -`--uh` upgrade HomeAssistant - -`--has` set HomeAssistant auto start - -`--sh` run HomeAssistant - -`--sth` stop HomeAssistant - -`--rh` restart HomeAssistant - -`--phl` get HomeAssistant log - -`--hv` get HomeAssistant version - --------------------- -`--pv` get Python version - -`--up` upgrade Python3 version - - +# Service Install Script ## 使用说明 执行以下命令下载程序 -`sudo curl -O https://raw.githubusercontent.com/morestart/RaspbianInstallScript/master/install.py` +`sudo curl -O https://raw.githubusercontent.com/morestart/linuxServiceInstallScript/ubuntu/install.py` ## 参数说明 - `-w` 添加wifi配置 - `-p` 更新软件包列表与软件 @@ -80,4 +34,4 @@ 升级Python3版本 -`sudo python3 install.py --up` \ No newline at end of file +`sudo python3 install.py --up` From 225dd9837ea5ddaf16ecf50e5b41e4718fffa7bb Mon Sep 17 00:00:00 2001 From: CTL <35556811+morestart@users.noreply.github.com> Date: Sun, 28 Jul 2019 11:25:10 +0800 Subject: [PATCH 10/10] Update README.md --- README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 83bed44..36f59b8 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,19 @@ 执行以下命令下载程序 `sudo curl -O https://raw.githubusercontent.com/morestart/linuxServiceInstallScript/ubuntu/install.py` + +## 使用方式 +sudo python3 install.py 加上你要执行的命令,命令可以加多个 也可以只有一个 + +## 示例 +以下命令作用:添加wifi配置 安装0.94版本HA 打印HA log + +`sudo python3 install.py -w --ih 0.94.0 --phl` + +升级Python3版本 + +`sudo python3 install.py --up` + ## 参数说明 - `-w` 添加wifi配置 - `-p` 更新软件包列表与软件 @@ -27,11 +40,4 @@ - `--sth` 结束HA的运行 -## 示例 -以下命令作用:添加wifi配置 安装0.94版本HA 打印HA log -`sudo python3 install.py -w --ih 0.94.0 --phl` - -升级Python3版本 - -`sudo python3 install.py --up`