From cf78cf2da9eb2288a56e5c23db0ffc68909ebeca Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Mon, 21 Jan 2019 14:10:25 +0800 Subject: [PATCH] qbittorrent --- plugins/qbittorrent/ico.png | Bin 0 -> 3755 bytes plugins/qbittorrent/index.py | 299 +++++++++++++++++++++++++++++++++ plugins/qbittorrent/info.json | 17 ++ plugins/qbittorrent/install.sh | 67 ++++++++ plugins/sphinx/install.sh | 2 +- 5 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 plugins/qbittorrent/ico.png create mode 100755 plugins/qbittorrent/index.py create mode 100755 plugins/qbittorrent/info.json create mode 100755 plugins/qbittorrent/install.sh diff --git a/plugins/qbittorrent/ico.png b/plugins/qbittorrent/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..0c04d3b9e8e572063d68db99ca5f7f7a1c1109e9 GIT binary patch literal 3755 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 literal 0 HcmV?d00001 diff --git a/plugins/qbittorrent/index.py b/plugins/qbittorrent/index.py new file mode 100755 index 000000000..969e8e9ff --- /dev/null +++ b/plugins/qbittorrent/index.py @@ -0,0 +1,299 @@ +# coding: utf-8 + +import time +import random +import os +import json +import re +import sys + +sys.path.append(os.getcwd() + "/class/core") +import public + + +app_debug = False +if public.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'simdht' + + +def getPluginDir(): + return public.getPluginDir() + '/' + getPluginName() + +sys.path.append(getPluginDir() + "/class") +import mysql + + +def getServerDir(): + return public.getServerDir() + '/' + getPluginName() + + +def getInitDFile(): + if app_debug: + return '/tmp/' + getPluginName() + return '/etc/init.d/' + getPluginName() + + +def getArgs(): + args = sys.argv[2:] + tmp = {} + args_len = len(args) + + if args_len == 1: + t = args[0].strip('{').strip('}') + t = t.split(':') + 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, public.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, public.returnJson(True, 'ok')) + + +def getInitDTpl(): + path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl" + return path + + +def getSqlFile(): + file = getPluginDir() + "/conf/simdht.sql" + return file + + +def getDbConf(): + file = getServerDir() + "/db.cfg" + return file + + +def getRunLog(): + file = getServerDir() + "/logs.pl" + return file + + +def initDreplace(): + + ddir = getServerDir() + '/workers' + if not os.path.exists(ddir): + sdir = getPluginDir() + '/workers' + public.execShell('cp -rf ' + sdir + ' ' + getServerDir()) + + cfg = getServerDir() + '/db.cfg' + if not os.path.exists(cfg): + cfg_tpl = getPluginDir() + '/workers/db.cfg' + content = public.readFile(cfg_tpl) + public.writeFile(cfg, content) + + 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 + content = public.readFile(file_tpl) + content = content.replace('{$SERVER_PATH}', service_path) + public.writeFile(file_bin, content) + public.execShell('chmod +x ' + file_bin) + + return file_bin + + +def status(): + data = public.execShell( + "ps -ef|grep \"python simdht_worker.py\" | grep -v grep | awk '{print $2}'") + if data[0] == '': + return 'stop' + return 'start' + + +def start(): + file = initDreplace() + + data = public.execShell(file + ' start') + if data[1] == '': + return 'ok' + return data[1] + + +def stop(): + file = initDreplace() + data = public.execShell(file + ' stop') + if data[1] == '': + public.execShell('rm -rf /tmp/mysql.sock') + return 'ok' + return 'fail' + + +def restart(): + file = initDreplace() + data = public.execShell(file + ' restart') + if data[1] == '': + return 'ok' + return 'fail' + + +def reload(): + file = initDreplace() + data = public.execShell(file + ' reload') + if data[1] == '': + return 'ok' + return 'fail' + + +def initdStatus(): + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + + initd_bin = getInitDFile() + if os.path.exists(initd_bin): + return 'ok' + return 'fail' + + +def initdInstall(): + import shutil + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + + mysql_bin = initDreplace() + initd_bin = getInitDFile() + shutil.copyfile(mysql_bin, initd_bin) + public.execShell('chmod +x ' + initd_bin) + return 'ok' + + +def initdUinstall(): + if not app_debug: + if public.isAppleSystem(): + return "Apple Computer does not support" + initd_bin = getInitDFile() + os.remove(initd_bin) + return 'ok' + + +def matchData(reg, content): + tmp = re.search(reg, content).groups() + return tmp[0] + + +def getDbConfInfo(): + cfg = getDbConf() + content = public.readFile(cfg) + data = {} + data['DB_HOST'] = matchData("DB_HOST\s*=\s(.*)", content) + data['DB_USER'] = matchData("DB_USER\s*=\s(.*)", content) + data['DB_PORT'] = matchData("DB_PORT\s*=\s(.*)", content) + data['DB_PASS'] = matchData("DB_PASS\s*=\s(.*)", content) + data['DB_NAME'] = matchData("DB_NAME\s*=\s(.*)", content) + return data + + +def pMysqlDb(): + data = getDbConfInfo() + conn = mysql.mysql() + conn.setHost(data['DB_HOST']) + conn.setUser(data['DB_USER']) + conn.setPwd(data['DB_PASS']) + conn.setPort(int(data['DB_PORT'])) + conn.setDb(data['DB_NAME']) + return conn + + +def isSqlError(mysqlMsg): + # 检测数据库执行错误 + mysqlMsg = str(mysqlMsg) + if "MySQLdb" in mysqlMsg: + return public.returnJson(False, 'MySQLdb组件缺失!
进入SSH命令行输入: pip install mysql-python') + if "2002," in mysqlMsg: + return public.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!') + if "using password:" in mysqlMsg: + return public.returnJson(False, '数据库管理密码错误!') + if "Connection refused" in mysqlMsg: + return public.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!') + if "1133" in mysqlMsg: + return public.returnJson(False, '数据库用户不存在!') + if "1007" in mysqlMsg: + return public.returnJson(False, '数据库已经存在!') + return None + + +def getMinData(conn, sec): + time_diff = 0 + if public.isAppleSystem(): + time_diff = 3 * 60 + pre = time.strftime("%Y-%m-%d %H:%M:%S", + time.localtime(time.time() - sec - time_diff)) + sql = "select count(id) from search_hash where create_time > '" + pre + "'" + data = conn.query(sql) + return data[0][0] + + +def getTrendData(): + try: + args = getArgs() + data = checkArgs(args, ['interval']) + if not data[0]: + return data[1] + pdb = pMysqlDb() + # interval = int(args['interval']) + result = pdb.execute("show tables") + isError = isSqlError(result) + if isError: + return isError + one = getMinData(pdb, 1) + two = getMinData(pdb, 5) + three = getMinData(pdb, 10) + return public.getJson([one, two, three]) + except Exception as e: + print str(e) + return public.getJson([0, 0, 0]) + +def dhtCmd(): + file = initDreplace() + return file+' restart' + +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 == 'get_sql': + print getSqlFile() + elif func == 'get_db_conf': + print getDbConf() + elif func == 'get_run_Log': + print getRunLog() + elif func == 'get_trend_data': + print getTrendData() + elif func == 'dht_cmd': + print dhtCmd(); + else: + print 'error' diff --git a/plugins/qbittorrent/info.json b/plugins/qbittorrent/info.json new file mode 100755 index 000000000..4aa33e725 --- /dev/null +++ b/plugins/qbittorrent/info.json @@ -0,0 +1,17 @@ +{ + "sort": 7, + "ps": "一个新的轻量级BitTorrent客户端", + "name": "qbittorrent", + "title": "qBittorrent", + "shell": "install.sh", + "versions":["4.1.5"], + "updates":["4.1.5"], + "tip": "soft", + "checks": "server/qbittorrent", + "display": 1, + "author": "Zend", + "date": "2017-04-01", + "home": "https://www.qbittorrent.org", + "type": 0, + "pid": "5" +} \ No newline at end of file diff --git a/plugins/qbittorrent/install.sh b/plugins/qbittorrent/install.sh new file mode 100755 index 000000000..60eebe776 --- /dev/null +++ b/plugins/qbittorrent/install.sh @@ -0,0 +1,67 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +curPath=`pwd` +rootPath=$(dirname "$curPath") +rootPath=$(dirname "$rootPath") +serverPath=$(dirname "$rootPath") +sysName=`uname` + +install_tmp=${rootPath}/tmp/bt_install.pl + + +Install_qbittorrent() +{ + if [ $sysName == 'Darwin' ]; then + else + yum -y install qt-devel boost-devel openssl-devel qt5-qtbase-devel qt5-linguist + fi + + echo '正在安装脚本文件...' > $install_tmp + mkdir -p $serverPath/qbittorrent + + QB_DIR=${serverPath}/source/qbittorrent + mkdir -p $QB_DIR + + if [ ! -f ${QB_DIR}/libtorrent-rasterbar-1.1.9.tar.gz ];then + wget -O ${QB_DIR}/libtorrent-rasterbar-1.1.9.tar.gz https://github.com/arvidn/libtorrent/releases/download/libtorrent-1_1_9/libtorrent-rasterbar-1.1.9.tar.gz + fi + cd ${QB_DIR} tar -zxf libtorrent-rasterbar-1.1.9.tar.gz + cd ${QB_DIR} && cd libtorrent-rasterbar-1.1.9 + + #修改为固定端口号 + #sed -i "s/i2p ? 1 : tracker_req().listen_port/8999/" src/http_tracker_connection.cpp + ./configure --prefix=$serverPath/lib/libtorrent CXXFLAGS=-std=c++11 + make && make install + #echo "$serverPath/lib/libtorrent/lib" > /etc/ld.so.conf.d/libtorrent-x86_64.conf + #ldconfig + #export LD_LIBRARY_PATH=/usr/local/libtorrent/lib/ + #export CPLUS_INCLUDE_PATH=/usr/local/libtorrent/include/ + #export PKG_CONFIG_PATH=/usr/local/libtorrent/lib/pkgconfig/ + + + if [ ! -f ${QB_DIR}/qbittorrent-4.1.5.tar.gz ];then + wget -O ${QB_DIR}/qbittorrent-4.1.5.tar.gz https://github.com/qbittorrent/qBittorrent/archive/release-4.1.5.tar.gz + fi + + cd ${QB_DIR} && tar -zxvf qbittorrent-4.1.5.tar.gz + + #cp -rf ${SPHINX_DIR}/sphinx-3.1.1/ $serverPath/sphinx/bin + + echo '4.1.5' > $serverPath/qbittorrent/version.pl + echo '安装完成' > $install_tmp +} + +Uninstall_qbittorrent() +{ + rm -rf $serverPath/qbittorrent + echo "Uninstall_qbittorrent" > $install_tmp +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_qbittorrent +else + Uninstall_qbittorrent +fi diff --git a/plugins/sphinx/install.sh b/plugins/sphinx/install.sh index 096f04643..c8971749b 100755 --- a/plugins/sphinx/install.sh +++ b/plugins/sphinx/install.sh @@ -6,7 +6,7 @@ curPath=`pwd` rootPath=$(dirname "$curPath") rootPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath") - +sysName=`uname` install_tmp=${rootPath}/tmp/bt_install.pl