diff --git a/class/core/cert_api.py b/class/core/cert_api.py index e996adc74..dbb021fd8 100644 --- a/class/core/cert_api.py +++ b/class/core/cert_api.py @@ -113,8 +113,8 @@ class cert_api: return self.__config return self.__config - # 写配置文件 def saveConfig(self): + # 写配置文件 fp = open(self.__cfg_file, 'w+') fcntl.flock(fp, fcntl.LOCK_EX) # 加锁 fp.write(json.dumps(self.__config)) @@ -122,9 +122,75 @@ class cert_api: fp.close() return True + def createCertCron(self): + # 创建证书自动续签任务 + try: + import crontab_api + api = crontab_api.crontab_api() + + echo = mw.md5(mw.md5('panel_renew_lets_cron')) + cron_id = mw.M('crontab').where('echo=?', (echo,)).getField('id') + + cron_path = mw.getServerDir() + '/cron' + if not os.path.exists(cron_path): + mw.execShell('mkdir -p ' + cron_path) + + shell = 'python3 -u {}/class/core/cert_api.py --renew=1'.format( + mw.getRunDir()) + + logs_file = cron_path + '/' + echo + '.log' + + cmd = '''#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +dst_dir=%s +logs_file=%s +cd $dst_dir + +if [ -f bin/activate ];then + source bin/activate +fi + +''' % (mw.getRunDir(), logs_file) + cmd += 'echo "★【`date +"%Y-%m-%d %H:%M:%S"`】 STSRT★" >> $logs_file' + "\n" + cmd += 'echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" >> $logs_file' + "\n" + cmd += 'cd $dst_dir && ' + shell + ' >> $logs_file 2>&1' + "\n" + cmd += 'echo "【`date +"%Y-%m-%d %H:%M:%S"`】 END★" >> $logs_file' + "\n" + cmd += 'echo "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> $logs_file' + "\n" + + file = cron_path + '/' + echo + + if type(cron_id) != int: + + mw.writeFile(file, cmd) + mw.execShell('chmod 750 ' + file) + + info = {} + info['type'] = 'day' + info['minute'] = '10' + info['hour'] = '0' + shell_cron, rinfo, name = api.getCrondCycle(info) + shell_cron += ' ' + cron_path + '/' + echo + \ + ' >> ' + logs_file + ' 2>&1' + + api.writeShell(shell_cron) + + insert_id = mw.M('crontab').add('name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress', ( + "续签Let's Encrypt证书", 'day', '', '0', '10', echo, time.strftime('%Y-%m-%d %X', time.localtime()), '1', '', 'localhost', 'toShell', '', cmd, '')) + + if insert_id > 0: + print('创建证书自动续签任务成功!') + else: + mw.writeFile(file, cmd) + mw.execShell('chmod 750 ' + file) + mw.M('crontab').where('id=?', (cron_id)).save('sbody', (cmd,)) + except Exception as e: + print(mw.getTracebackInfo()) + def getApis(self): if not self.__apis: - # 尝试从配置文件中获取 + # 尝试从配置文件中获取 api_index = self.__mod_index[self.__debug] if not 'apis' in self.__config: self.__config['apis'] = {} diff --git a/class/core/common.py b/class/core/common.py index fc9fd6e06..71afcc96b 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -23,6 +23,7 @@ def init(): initDB() initUserInfo() initInitD() + initInitTask() def local(): @@ -102,6 +103,13 @@ def initInitD(): mw.setHostAddr(mw.getLocalIp()) +def initInitTask(): + # 创建证书同步命令 + import cert_api + api = cert_api.cert_api() + api.createCertCron() + + def initUserInfo(): data = mw.M('users').where('id=?', (1,)).getField('password') diff --git a/class/core/db.py b/class/core/db.py index 32c5be64a..1f4d9df51 100755 --- a/class/core/db.py +++ b/class/core/db.py @@ -23,7 +23,7 @@ class Sql(): def __init__(self): self.__DB_FILE = 'data/default.db' - def __GetConn(self): + def __getConn(self): # 取数据库对象 try: if self.__DB_CONN == None: @@ -100,10 +100,11 @@ class Sql(): def select(self): # 查询数据集 - self.__GetConn() + self.__getConn() try: sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT + # print(sql) result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) data = result.fetchall() # 构造字曲系列 @@ -133,7 +134,7 @@ class Sql(): def inquiry(self, input_field=''): # 查询数据集 # 不清空查询参数 - self.__GetConn() + self.__getConn() try: sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT @@ -171,6 +172,7 @@ class Sql(): def getField(self, keyName): # 取回指定字段 result = self.field(keyName).select() + # print(result) if len(result) == 1: return result[0][keyName] return result @@ -197,7 +199,7 @@ class Sql(): def add(self, keys, param): # 插入数据 - self.__GetConn() + self.__getConn() try: values = "" for key in keys.split(','): @@ -256,7 +258,7 @@ class Sql(): def addAll(self, keys, param): # 插入数据 - self.__GetConn() + self.__getConn() try: values = "" for key in keys.split(','): @@ -275,7 +277,7 @@ class Sql(): def save(self, keys, param): # 更新数据 - self.__GetConn() + self.__getConn() try: opt = "" for key in keys.split(','): @@ -300,7 +302,7 @@ class Sql(): def delete(self, id=None): # 删除数据 - self.__GetConn() + self.__getConn() try: if id: self.__OPT_WHERE = " WHERE id=?" @@ -314,7 +316,7 @@ class Sql(): return "error: " + str(ex) def originExecute(self, sql, param=()): - self.__GetConn() + self.__getConn() try: result = self.__DB_CONN.execute(sql, param) self.__DB_CONN.commit() @@ -324,7 +326,7 @@ class Sql(): def execute(self, sql, param=()): # 执行SQL语句返回受影响行 - self.__GetConn() + self.__getConn() # print sql, param try: result = self.__DB_CONN.execute(sql, param) @@ -335,7 +337,7 @@ class Sql(): def query(self, sql, param): # 执行SQL语句返回数据集 - self.__GetConn() + self.__getConn() try: result = self.__DB_CONN.execute(sql, param) # 将元组转换成列表 @@ -346,7 +348,7 @@ class Sql(): def create(self, name): # 创建数据表 - self.__GetConn() + self.__getConn() import mw script = mw.readFile('data/' + name + '.sql') result = self.__DB_CONN.executescript(script) @@ -355,7 +357,7 @@ class Sql(): def fofile(self, filename): # 执行脚本 - self.__GetConn() + self.__getConn() import mw script = mw.readFile(filename) result = self.__DB_CONN.executescript(script)