From f95440da99238c7a6630a8f8e456d0ca67216a34 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Fri, 13 Sep 2024 00:12:18 +0800 Subject: [PATCH] acme_pandominassl_apply init --- plugins/acme_pandominassl_apply/conf/acme.sql | 58 ++ plugins/acme_pandominassl_apply/ico.png | Bin 0 -> 4110 bytes plugins/acme_pandominassl_apply/index.html | 33 + plugins/acme_pandominassl_apply/index.py | 563 ++++++++++++++++++ plugins/acme_pandominassl_apply/info.json | 17 + plugins/acme_pandominassl_apply/install.sh | 33 + plugins/acme_pandominassl_apply/js/common.js | 65 ++ 7 files changed, 769 insertions(+) create mode 100644 plugins/acme_pandominassl_apply/conf/acme.sql create mode 100644 plugins/acme_pandominassl_apply/ico.png create mode 100755 plugins/acme_pandominassl_apply/index.html create mode 100755 plugins/acme_pandominassl_apply/index.py create mode 100755 plugins/acme_pandominassl_apply/info.json create mode 100755 plugins/acme_pandominassl_apply/install.sh create mode 100755 plugins/acme_pandominassl_apply/js/common.js diff --git a/plugins/acme_pandominassl_apply/conf/acme.sql b/plugins/acme_pandominassl_apply/conf/acme.sql new file mode 100644 index 000000000..f98ddf79b --- /dev/null +++ b/plugins/acme_pandominassl_apply/conf/acme.sql @@ -0,0 +1,58 @@ +CREATE TABLE IF NOT EXISTS `config` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `mysql_root` TEXT +); + +INSERT INTO `config` (`id`, `mysql_root`) VALUES (1, 'admin'); + +CREATE TABLE IF NOT EXISTS `databases` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `pid` INTEGER, + `name` TEXT, + `username` TEXT, + `password` TEXT, + `accept` TEXT, + `rw` TEXT DEFAULT 'rw', + `ps` TEXT, + `addtime` TEXT +); +-- ALTER TABLE `databases` ADD COLUMN `rw` TEXT DEFAULT 'rw'; + +CREATE TABLE IF NOT EXISTS `master_replication_user` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `username` TEXT, + `password` TEXT, + `accept` TEXT, + `ps` TEXT, + `addtime` TEXT +); + +-- 从库配置主库的[ssh private key] +-- drop table `slave_id_rsa`; +CREATE TABLE IF NOT EXISTS `slave_id_rsa` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `ip` TEXT, + `port` TEXT, + `user` TEXT, + `db_user` TEXT, + `id_rsa` TEXT, + `ps` TEXT, + `addtime` TEXT +); + +-- 从库配置主库的[user] +-- drop table `slave_user`; +CREATE TABLE IF NOT EXISTS `slave_sync_user` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `ip` TEXT, + `port` TEXT, + `user` TEXT, + `pass` TEXT, + `mode` TEXT, + `cmd` TEXT, + `db` TEXT, + `addtime` TEXT +); +ALTER TABLE `slave_sync_user` ADD COLUMN `db` TEXT DEFAULT ''; + + diff --git a/plugins/acme_pandominassl_apply/ico.png b/plugins/acme_pandominassl_apply/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..c4101893928aac50cce8f24864be52c6a7779a25 GIT binary patch literal 4110 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 literal 0 HcmV?d00001 diff --git a/plugins/acme_pandominassl_apply/index.html b/plugins/acme_pandominassl_apply/index.html new file mode 100755 index 000000000..43f36c6a0 --- /dev/null +++ b/plugins/acme_pandominassl_apply/index.html @@ -0,0 +1,33 @@ + + +
+
+
+
+

服务

+

DNSAPI

+

邮件地址

+

域名SSL

+

HOOK脚本

+

日志

+

相关说明

+ +
+
+
+
+
+
+ \ No newline at end of file diff --git a/plugins/acme_pandominassl_apply/index.py b/plugins/acme_pandominassl_apply/index.py new file mode 100755 index 000000000..3e4f3490c --- /dev/null +++ b/plugins/acme_pandominassl_apply/index.py @@ -0,0 +1,563 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import re + +sys.path.append(os.getcwd() + "/class/core") +import mw + +app_debug = False +if mw.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'acme_pandominassl_apply' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getInitDFile(): + current_os = mw.getOs() + if current_os == 'darwin': + return '/tmp/' + getPluginName() + + if current_os.startswith('freebsd'): + return '/etc/rc.d/' + getPluginName() + + return '/etc/init.d/' + getPluginName() + + +def getConf(): + path = getServerDir() + "/redis.conf" + return path + + +def getConfTpl(): + path = getPluginDir() + "/config/redis.conf" + return path + + +def getInitDTpl(): + path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl" + return path + + +def getArgs(): + args = sys.argv[3:] + tmp = {} + args_len = len(args) + + if args_len == 1: + t = args[0].strip('{').strip('}') + if t.strip() == '': + tmp = [] + else: + t = t.split(':') + tmp[t[0]] = t[1] + tmp[t[0]] = t[1] + elif args_len > 1: + for i in range(len(args)): + t = args[i].split(':') + tmp[t[0]] = t[1] + return tmp + +def checkArgs(data, ck=[]): + for i in range(len(ck)): + if not ck[i] in data: + return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, mw.returnJson(True, 'ok')) + +def configTpl(): + path = getPluginDir() + '/tpl' + pathFile = os.listdir(path) + tmp = [] + for one in pathFile: + file = path + '/' + one + tmp.append(file) + return mw.getJson(tmp) + + +def readConfigTpl(): + args = getArgs() + data = checkArgs(args, ['file']) + if not data[0]: + return data[1] + + content = mw.readFile(args['file']) + content = contentReplace(content) + return mw.returnJson(True, 'ok', content) + +def getPidFile(): + file = getConf() + content = mw.readFile(file) + rep = r'pidfile\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + +def status(): + return 'start' + +def contentReplace(content): + service_path = mw.getServerDir() + content = content.replace('{$ROOT_PATH}', mw.getRootDir()) + content = content.replace('{$SERVER_PATH}', service_path) + content = content.replace('{$SERVER_APP}', service_path + '/redis') + content = content.replace('{$REDIS_PASS}', mw.getRandomString(10)) + return content + + + +def initDreplace(): + + file_tpl = getInitDTpl() + service_path = os.path.dirname(os.getcwd()) + + initD_path = getServerDir() + '/init.d' + if not os.path.exists(initD_path): + os.mkdir(initD_path) + file_bin = initD_path + '/' + getPluginName() + + # initd replace + if not os.path.exists(file_bin): + content = mw.readFile(file_tpl) + content = content.replace('{$SERVER_PATH}', service_path) + mw.writeFile(file_bin, content) + mw.execShell('chmod +x ' + file_bin) + + # log + dataLog = getServerDir() + '/data' + if not os.path.exists(dataLog): + mw.execShell('chmod +x ' + file_bin) + + # config replace + dst_conf = getServerDir() + '/redis.conf' + dst_conf_init = getServerDir() + '/init.pl' + if not os.path.exists(dst_conf_init): + conf_content = mw.readFile(getConfTpl()) + conf_content = conf_content.replace('{$SERVER_PATH}', service_path) + conf_content = conf_content.replace( + '{$REDIS_PASS}', mw.getRandomString(10)) + + mw.writeFile(dst_conf, conf_content) + mw.writeFile(dst_conf_init, 'ok') + + # systemd + systemDir = mw.systemdCfgDir() + systemService = systemDir + '/' + getPluginName() + '.service' + if os.path.exists(systemDir) and not os.path.exists(systemService): + systemServiceTpl = getPluginDir() + '/init.d/' + getPluginName() + '.service.tpl' + service_path = mw.getServerDir() + se_content = mw.readFile(systemServiceTpl) + se_content = se_content.replace('{$SERVER_PATH}', service_path) + mw.writeFile(systemService, se_content) + mw.execShell('systemctl daemon-reload') + + return file_bin + + +def redisOp(method): + file = initDreplace() + + current_os = mw.getOs() + if current_os == "darwin": + data = mw.execShell(file + ' ' + method) + if data[1] == '': + return 'ok' + return data[1] + + if current_os.startswith("freebsd"): + data = mw.execShell('service ' + getPluginName() + ' ' + method) + if data[1] == '': + return 'ok' + return data[1] + + data = mw.execShell('systemctl ' + method + ' ' + getPluginName()) + if data[1] == '': + return 'ok' + return data[1] + + +def start(): + return redisOp('start') + + +def stop(): + return redisOp('stop') + + +def restart(): + status = redisOp('restart') + + log_file = runLog() + mw.execShell("echo '' > " + log_file) + return status + + +def reload(): + return redisOp('reload') + + +def getPort(): + conf = getServerDir() + '/redis.conf' + content = mw.readFile(conf) + + rep = r"^(" + r'port' + r')\s*([.0-9A-Za-z_& ~]+)' + tmp = re.search(rep, content, re.M) + if tmp: + return tmp.groups()[1] + + return '6379' + + +def getRedisCmd(): + requirepass = "" + conf = getServerDir() + '/redis.conf' + content = mw.readFile(conf) + rep = r"^(requirepass" + r')\s*([.0-9A-Za-z_& ~]+)' + tmp = re.search(rep, content, re.M) + if tmp: + requirepass = tmp.groups()[1] + + default_ip = '127.0.0.1' + port = getPort() + # findDebian = mw.execShell('cat /etc/issue |grep Debian') + # if findDebian[0] != '': + # default_ip = mw.getLocalIp() + cmd = getServerDir() + "/bin/redis-cli -h " + \ + default_ip + ' -p ' + port + " " + + if requirepass != "": + cmd = getServerDir() + '/bin/redis-cli -h ' + default_ip + \ + ' -p ' + port + ' -a "' + requirepass + '" ' + + return cmd + +def runInfo(): + s = status() + if s == 'stop': + return mw.returnJson(False, '未启动') + + + cmd = getRedisCmd() + cmd = cmd + 'info' + + # print(cmd) + data = mw.execShell(cmd)[0] + # print(data) + res = [ + 'tcp_port', + 'uptime_in_days', # 已运行天数 + 'connected_clients', # 连接的客户端数量 + 'used_memory', # Redis已分配的内存总量 + 'used_memory_rss', # Redis占用的系统内存总量 + 'used_memory_peak', # Redis所用内存的高峰值 + 'mem_fragmentation_ratio', # 内存碎片比率 + 'total_connections_received', # 运行以来连接过的客户端的总数量 + 'total_commands_processed', # 运行以来执行过的命令的总数量 + 'instantaneous_ops_per_sec', # 服务器每秒钟执行的命令数量 + 'keyspace_hits', # 查找数据库键成功的次数 + 'keyspace_misses', # 查找数据库键失败的次数 + 'latest_fork_usec' # 最近一次 fork() 操作耗费的毫秒数 + ] + data = data.split("\n") + result = {} + for d in data: + if len(d) < 3: + continue + t = d.strip().split(':') + if not t[0] in res: + continue + result[t[0]] = t[1] + return mw.getJson(result) + +def infoReplication(): + # 复制信息 + s = status() + if s == 'stop': + return mw.returnJson(False, '未启动') + + cmd = getRedisCmd() + cmd = cmd + 'info replication' + + # print(cmd) + data = mw.execShell(cmd)[0] + # print(data) + res = [ + #slave + 'role',#角色 + 'master_host', # 连接主库HOST + 'master_port', # 连接主库PORT + 'master_link_status', # 连接主库状态 + 'master_last_io_seconds_ago', # 上次同步时间 + 'master_sync_in_progress', # 正在同步中 + 'slave_read_repl_offset', # 从库读取复制位置 + 'slave_repl_offset', # 从库复制位置 + 'slave_priority', # 从库同步优先级 + 'slave_read_only', # 从库是否仅读 + 'replica_announced', # 已复制副本 + 'connected_slaves', # 连接从库数量 + 'master_failover_state', # 主库故障状态 + 'master_replid', # 主库复制ID + 'master_repl_offset', # 主库复制位置 + 'second_repl_offset', # 主库复制位置时间 + 'repl_backlog_active', # 复制状态 + 'repl_backlog_size', # 复制大小 + 'repl_backlog_first_byte_offset', # 第一个字节偏移量 + 'repl_backlog_histlen', # backlog中数据的长度 + ] + + data = data.split("\n") + result = {} + for d in data: + if len(d) < 3: + continue + t = d.strip().split(':') + if not t[0] in res: + continue + result[t[0]] = t[1] + + if 'role' in result and result['role'] == 'master': + connected_slaves = int(result['connected_slaves']) + slave_l = [] + for x in range(connected_slaves): + slave_l.append('slave'+str(x)) + + for d in data: + if len(d) < 3: + continue + t = d.strip().split(':') + if not t[0] in slave_l: + continue + result[t[0]] = t[1] + + return mw.getJson(result) + + +def clusterInfo(): + #集群信息 + # https://redis.io/commands/cluster-info/ + s = status() + if s == 'stop': + return mw.returnJson(False, '未启动') + + cmd = getRedisCmd() + cmd = cmd + 'cluster info' + + # print(cmd) + data = mw.execShell(cmd)[0] + # print(data) + + res = [ + 'cluster_state',#状态 + 'cluster_slots_assigned', # 被分配的槽 + 'cluster_slots_ok', # 被分配的槽状态 + 'cluster_slots_pfail', # 连接主库状态 + 'cluster_slots_fail', # 失败的槽 + 'cluster_known_nodes', # 知道的节点 + 'cluster_size', # 大小 + 'cluster_current_epoch', # + 'cluster_my_epoch', # + 'cluster_stats_messages_sent', # 发送 + 'cluster_stats_messages_received', # 接受 + 'total_cluster_links_buffer_limit_exceeded', # + ] + + data = data.split("\n") + result = {} + for d in data: + if len(d) < 3: + continue + t = d.strip().split(':') + if not t[0] in res: + continue + result[t[0]] = t[1] + + return mw.getJson(result) + +def clusterNodes(): + s = status() + if s == 'stop': + return mw.returnJson(False, '未启动') + + cmd = getRedisCmd() + cmd = cmd + 'cluster nodes' + + # print(cmd) + data = mw.execShell(cmd)[0] + # print(data) + + data = data.strip().split("\n") + return mw.getJson(data) + +def initdStatus(): + current_os = mw.getOs() + if current_os == 'darwin': + return "Apple Computer does not support" + + if current_os.startswith('freebsd'): + initd_bin = getInitDFile() + if os.path.exists(initd_bin): + return 'ok' + + shell_cmd = 'systemctl status ' + \ + getPluginName() + ' | grep loaded | grep "enabled;"' + data = mw.execShell(shell_cmd) + if data[0] == '': + return 'fail' + return 'ok' + + +def initdInstall(): + current_os = mw.getOs() + if current_os == 'darwin': + return "Apple Computer does not support" + + # freebsd initd install + if current_os.startswith('freebsd'): + import shutil + source_bin = initDreplace() + initd_bin = getInitDFile() + shutil.copyfile(source_bin, initd_bin) + mw.execShell('chmod +x ' + initd_bin) + mw.execShell('sysrc ' + getPluginName() + '_enable="YES"') + return 'ok' + + mw.execShell('systemctl enable ' + getPluginName()) + return 'ok' + + +def initdUinstall(): + current_os = mw.getOs() + if current_os == 'darwin': + return "Apple Computer does not support" + + if current_os.startswith('freebsd'): + initd_bin = getInitDFile() + os.remove(initd_bin) + mw.execShell('sysrc ' + getPluginName() + '_enable="NO"') + return 'ok' + + mw.execShell('systemctl disable ' + getPluginName()) + return 'ok' + + +def runLog(): + return getServerDir() + '/data/redis.log' + + +def getRedisConfInfo(): + conf = getServerDir() + '/redis.conf' + + gets = [ + {'name': 'bind', 'type': 2, 'ps': '绑定IP(修改绑定IP可能会存在安全隐患)','must_show':1}, + {'name': 'port', 'type': 2, 'ps': '绑定端口','must_show':1}, + {'name': 'timeout', 'type': 2, 'ps': '空闲链接超时时间,0表示不断开','must_show':1}, + {'name': 'maxclients', 'type': 2, 'ps': '最大连接数','must_show':1}, + {'name': 'databases', 'type': 2, 'ps': '数据库数量','must_show':1}, + {'name': 'requirepass', 'type': 2, 'ps': 'redis密码,留空代表没有设置密码','must_show':1}, + {'name': 'maxmemory', 'type': 2, 'ps': 'MB,最大使用内存,0表示不限制','must_show':1}, + {'name': 'slaveof', 'type': 2, 'ps': '同步主库地址','must_show':0}, + {'name': 'masterauth', 'type': 2, 'ps': '同步主库密码', 'must_show':0} + ] + content = mw.readFile(conf) + + result = [] + for g in gets: + rep = r"^(" + g['name'] + r')\s*([.0-9A-Za-z_& ~]+)' + tmp = re.search(rep, content, re.M) + if not tmp: + if g['must_show'] == 0: + continue + + g['value'] = '' + result.append(g) + continue + g['value'] = tmp.groups()[1] + if g['name'] == 'maxmemory': + g['value'] = g['value'].strip("mb") + result.append(g) + + return result + + +def getRedisConf(): + data = getRedisConfInfo() + return mw.getJson(data) + + +def submitRedisConf(): + gets = ['bind', 'port', 'timeout', 'maxclients', + 'databases', 'requirepass', 'maxmemory','slaveof','masterauth'] + args = getArgs() + conf = getServerDir() + '/redis.conf' + content = mw.readFile(conf) + for g in gets: + if g in args: + rep = g + r'\s*([.0-9A-Za-z_& ~]+)' + val = g + ' ' + args[g] + + if g == 'maxmemory': + val = g + ' ' + args[g] + "mb" + + if g == 'requirepass' and args[g] == '': + content = re.sub('requirepass', '#requirepass', content) + if g == 'requirepass' and args[g] != '': + content = re.sub('#requirepass', 'requirepass', content) + content = re.sub(rep, val, content) + + if g != 'requirepass': + content = re.sub(rep, val, content) + mw.writeFile(conf, content) + reload() + return mw.returnJson(True, '设置成功') + +if __name__ == "__main__": + func = sys.argv[1] + if func == 'status': + print(status()) + elif func == 'start': + print(start()) + elif func == 'stop': + print(stop()) + elif func == 'restart': + print(restart()) + elif func == 'reload': + print(reload()) + elif func == 'initd_status': + print(initdStatus()) + elif func == 'initd_install': + print(initdInstall()) + elif func == 'initd_uninstall': + print(initdUinstall()) + elif func == 'run_info': + print(runInfo()) + elif func == 'info_replication': + print(infoReplication()) + elif func == 'cluster_info': + print(clusterInfo()) + elif func == 'cluster_nodes': + print(clusterNodes()) + elif func == 'conf': + print(getConf()) + elif func == 'run_log': + print(runLog()) + elif func == 'get_redis_conf': + print(getRedisConf()) + elif func == 'submit_redis_conf': + print(submitRedisConf()) + elif func == 'config_tpl': + print(configTpl()) + elif func == 'read_config_tpl': + print(readConfigTpl()) + else: + print('error') diff --git a/plugins/acme_pandominassl_apply/info.json b/plugins/acme_pandominassl_apply/info.json new file mode 100755 index 000000000..f10f7c425 --- /dev/null +++ b/plugins/acme_pandominassl_apply/info.json @@ -0,0 +1,17 @@ +{ + "sort": 7, + "ps": "ACME泛域名SSL申请/管理", + "name": "acme_pandominassl_apply", + "title": "ACME泛域名SSL", + "shell": "install.sh", + "versions":["1.0"], + "tip": "soft", + "checks": "server/acme_pandominassl_apply", + "path": "server/acme_pandominassl_apply", + "display": 1, + "author": "ACME", + "date": "2024-09-12", + "home": "https://github.com/acmesh-official/acme.sh", + "type": 0, + "pid": "5" +} diff --git a/plugins/acme_pandominassl_apply/install.sh b/plugins/acme_pandominassl_apply/install.sh new file mode 100755 index 000000000..cc61838ec --- /dev/null +++ b/plugins/acme_pandominassl_apply/install.sh @@ -0,0 +1,33 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin +export PATH + +curPath=`pwd` +rootPath=$(dirname "$curPath") +rootPath=$(dirname "$rootPath") +serverPath=$(dirname "$rootPath") + +install_tmp=${rootPath}/tmp/mw_install.pl +VERSION=$2 + +Install_App() +{ + echo '正在安装脚本文件...' > $install_tmp + mkdir -p $serverPath/source + mkdir -p $serverPath/acme_pandominassl_apply + echo "${VERSION}" > $serverPath/acme_pandominassl_apply/version.pl + echo '安装完成' +} + +Uninstall_App() +{ + + echo "卸载[ACME泛域名SSL]成功" +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_App +else + Uninstall_App +fi diff --git a/plugins/acme_pandominassl_apply/js/common.js b/plugins/acme_pandominassl_apply/js/common.js new file mode 100755 index 000000000..cd5a60a67 --- /dev/null +++ b/plugins/acme_pandominassl_apply/js/common.js @@ -0,0 +1,65 @@ +function apaPost(method, version, args,callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'acme_pandominassl_apply'; + req_data['func'] = method; + req_data['version'] = version; + + if (typeof(args) == 'string'){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/run', req_data, function(data) { + layer.close(loadT); + if (!data.status){ + //错误展示10S + layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + +function apaPostCallbak(method, version, args,callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'acme_pandominassl_apply'; + req_data['func'] = method; + args['version'] = version; + + if (typeof(args) == 'string'){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/callback', req_data, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + + +function apaReadme(){ + + var readme = '
    '; + readme += '
  • ACME泛域名SSL申请/管理/HOOK
  • '; + readme += '
'; + + $('.soft-man-con').html(readme); +} +