def read_status_cfg(self): try: readcfg = open("/td01/status.json", "r").read() if readcfg: cfg = json.loads(readcfg) else: self.msg = "配置文件解析错误!" return False, {} upgrade_url = str(cfg.get("upgrade_url")).replace(" ", "") result = urlparse.urlsplit(upgrade_url) scheme = result.scheme netloc = result.netloc query = result.query if scheme in ["ftp", "http", "https"]: self.mode = scheme else: self.msg = "意外的工作模式,检查upgrade_url!" return False, {} content = { "scheme": scheme, "netloc": netloc, } if scheme == "ftp": query_list = query.split("&") for data in query_list: temp = data.split("=") key = temp[0] value = temp[1] content[key] = value return True, content except Exception as e: logger.error(str(e)) return False, {}
def instauto(self): while True: status, cfg = self.read_status_cfg() if not status: logger.error("配置读取失败!") else: scheme = cfg.get("scheme") if tupdate1.status == tupdate1.ST_INIT or tupdate1.status == tupdate1.ST_INSTALLFINISH or tupdate1.status == tupdate1.ST_INSTALLFAIL or tupdate1.ST_DOWNFAILED: try: if scheme == "http" or scheme == "https": res = self.compare_versions() r = json.loads(res) state = r.get("success", "") if state == True: tupdate() elif scheme == "ftp": print "------->ftp updata start" ftp_ip = cfg.get("netloc") ftp_port = int(cfg.get("port")) ftp_user = cfg.get("user") ftp_pass = cfg.get("pass") ftp_path = "/td01/update" if not os.path.exists(ftp_path): os.makedirs(ftp_path) filename = "" ftp = Ftp() ftp.connect_ftp(ftp_ip, ftp_port, ftp_user, ftp_pass) for file in ftp.lst_file(): if os.path.splitext(file)[1] == '.pkt': filename = file break else: continue filepath = ftp.downloadfile(ftp_path, filename) ftp.delete(filename) ftp.close() self.packet_install(filepath) print self.msg except Exception as e: logger.error(str(e)) time.sleep(self.starttime * 30)
def packet_install(self, package_path, version="", version_type=""): if not os.path.exists(package_path): self.status = self.ST_INSTALLFAIL self.msg = "文件不存在!" filename = package_path try: logger.info("installing start!") self.msg = "安装阶段,安装中!" if install_pkt.td01_install_pkt(filename, version, version_type) == True: self.version = version self.status = self.ST_INSTALLFINISH self.msg = "安装阶段,安装成功!" else: self.status = self.ST_INSTALLFAIL self.msg = "安装阶段,安装失败!" logger.info("installing end!") logger.info(self.msg) except Exception, e: self.msg = "安装阶段,安装失败!" logger.error("install failure!" + str(e)) self.status = self.ST_INSTALLFAIL
def compare_versions(self): # if request.method == "POST": try: f = open(config.STATUS_FILE_PATH, 'r') content = json.loads(f.read()) f.close() upgrade_url = content.get("upgrade_url", "") code_version = content.get("code_version", "") poc_version = content.get("poc_version", "") rule_version = content.get("rule_version", "") url = "%s/version/compare?code_version=%s&poc_version=%s&rule_version=%s" % ( upgrade_url, code_version, poc_version, rule_version) logger.info(url) try: res = requests.get(url, timeout=10, verify=False) html = cgi.escape(res.text) res = json.loads(html) print res except: res = {"success": False, "msg": "服务器连接失败!请检查网址是否正确!"} is_update = res.get("is_update", 0) success = res.get("success", False) scan_status = "STOP" # 默认d01不在扫描状态 ''' try: content = os.popen('td01_status_path').read().rstrip() print('td01_status=======', content) status_dict = json.loads(content.replace("'","\"")) scan_status = status_dict.get("status","STOP") except: scan_status = "STOP" ''' if scan_status == "RUNING": content = { "success": False, "state": 0, "msg": "正在扫描资产中,无法获取升级状态!", "version": "" } else: if success: if is_update == 1: version = res.get("version", "") version_type = res.get("type", "code") state = self.get_state(version_type) content = { "success": True, "state": state, "msg": "", "version": version, "version_type": version_type, "is_update": is_update, "upgrade_url": upgrade_url, } elif is_update == 0: version_type = res.get("type", "code") state = self.get_state(version_type) content = { "success": False, "state": state, "version_type": version_type, "msg": "版本还没有更新,请耐心等待!", "version": "" } else: content = { "success": False, "state": 0, "msg": "更新状态获取失败!", "version": "" } else: content = { "success": False, "state": 0, "msg": res.get("msg", ""), "version": "1.1" } except Exception, e: logger.error(str(e)) content = {"success": False, "state": 0, "msg": "获取版本对比信息失败!"}
def get_file(self, version, url, filename, version_type): """ 下载文件,并记录下载进度等内容 :param url: :param filename: :return: """ try: update_path = url with closing(requests.get(url, stream=True)) as response: chunk_size = 1024 content_size = int(response.headers['Content-Length']) content_disposition = response.headers['Content-Disposition'] reg = re.search('filename=(?P<filename>[^\s]*)', content_disposition) if reg: filename = reg.group("filename") else: # get file failed return data_count = 0 filename = os.path.join(config.UPDATE_PATH, filename) logger.info("download file store:" + filename) with open(filename, "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) data_count = data_count + len(data) # print(data_count) self.progress = (float(data_count) / float(content_size)) * 100 self.progress = round(self.progress, 3) if self.progress == 100: self.msg = "下载阶段,下载成功!" self.status = self.ST_DOWNSUCCESS else: self.status = self.ST_DOWNING self.msg = "下载阶段,下载中!" logger.info(self.msg) if self.progress != 100.0: self.msg = "下载阶段:下载失败!" self.status = self.ST_DOWNFAILED logger.info(self.msg) return try: logger.info("installing start!") self.msg = "安装阶段,安装中!" if install_pkt.td01_install_pkt(filename, version, version_type) == True: self.version = version self.status = self.ST_INSTALLFINISH self.msg = "安装阶段,安装成功!" else: self.status = self.ST_INSTALLFAIL self.msg = "安装阶段,安装失败!" logger.info("installing end!") logger.info(self.msg) except Exception, e: self.msg = "安装阶段,安装失败!" logger.error("install failure!" + str(e)) self.status = self.ST_INSTALLFAIL except Exception, e: logger.error(str(e))