1132 lines
30 KiB
Python
Executable File
1132 lines
30 KiB
Python
Executable File
# coding: utf-8
|
||
|
||
|
||
import time
|
||
import os
|
||
import sys
|
||
import re
|
||
import psutil
|
||
|
||
web_dir = os.getcwd() + "/web"
|
||
if os.path.exists(web_dir):
|
||
sys.path.append(web_dir)
|
||
os.chdir(web_dir)
|
||
|
||
import core.mw as mw
|
||
|
||
|
||
|
||
|
||
app_debug = False
|
||
if mw.isAppleSystem():
|
||
app_debug = True
|
||
|
||
|
||
def getPluginName():
|
||
return 'gogs'
|
||
|
||
|
||
def getPluginDir():
|
||
return mw.getPluginDir() + '/' + getPluginName()
|
||
|
||
|
||
def getServerDir():
|
||
return mw.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(':', 1)
|
||
tmp[t[0]] = t[1]
|
||
elif args_len > 1:
|
||
for i in range(len(args)):
|
||
t = args[i].split(':', 1)
|
||
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 getInitdConfTpl():
|
||
path = getPluginDir() + "/init.d/gogs.tpl"
|
||
return path
|
||
|
||
|
||
def getInitdConf():
|
||
path = getServerDir() + "/init.d/gogs"
|
||
return path
|
||
|
||
|
||
def getConf():
|
||
path = getServerDir() + "/custom/conf/app.ini"
|
||
return path
|
||
|
||
|
||
def getConfTpl():
|
||
path = getPluginDir() + "/conf/app.ini"
|
||
return path
|
||
|
||
|
||
def status():
|
||
data = mw.execShell(
|
||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||
if data[0] == '':
|
||
return 'stop'
|
||
return 'start'
|
||
|
||
|
||
def getHomeDir():
|
||
if mw.isAppleSystem():
|
||
user = mw.execShell(
|
||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||
return '/Users/' + user
|
||
else:
|
||
return '/root'
|
||
|
||
|
||
def getRunUser():
|
||
if mw.isAppleSystem():
|
||
user = mw.execShell("who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||
return user
|
||
else:
|
||
return 'root'
|
||
|
||
__SR = '''#!/bin/bash
|
||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||
export PATH
|
||
export USER=%s
|
||
export HOME=%s && ''' % ( getRunUser(), getHomeDir())
|
||
|
||
|
||
def contentReplace(content):
|
||
|
||
service_path = mw.getServerDir()
|
||
content = content.replace('{$ROOT_PATH}', mw.getFatherDir())
|
||
content = content.replace('{$SERVER_PATH}', service_path)
|
||
content = content.replace('{$RUN_USER}', getRunUser())
|
||
content = content.replace('{$HOME_DIR}', getHomeDir())
|
||
|
||
return content
|
||
|
||
|
||
def initDreplace():
|
||
|
||
file_tpl = getInitdConfTpl()
|
||
service_path = mw.getServerDir()
|
||
|
||
initD_path = getServerDir() + '/init.d'
|
||
if not os.path.exists(initD_path):
|
||
os.mkdir(initD_path)
|
||
file_bin = initD_path + '/' + getPluginName()
|
||
|
||
if not os.path.exists(file_bin):
|
||
content = mw.readFile(file_tpl)
|
||
content = contentReplace(content)
|
||
mw.writeFile(file_bin, content)
|
||
mw.execShell('chmod +x ' + file_bin)
|
||
|
||
# conf_bin = getConf()
|
||
# if not os.path.exists(conf_bin):
|
||
# mw.execShell('mkdir -p ' + getServerDir() + '/custom/conf')
|
||
# conf_tpl = getConfTpl()
|
||
# content = mw.readFile(conf_tpl)
|
||
# content = contentReplace(content)
|
||
# mw.writeFile(conf_bin, content)
|
||
|
||
# systemd
|
||
systemDir = mw.systemdCfgDir()
|
||
systemService = systemDir + '/gogs.service'
|
||
systemServiceTpl = getPluginDir() + '/init.d/gogs.service.tpl'
|
||
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
||
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')
|
||
|
||
log_path = getServerDir() + '/log'
|
||
if not os.path.exists(log_path):
|
||
os.mkdir(log_path)
|
||
|
||
return file_bin
|
||
|
||
|
||
def getRootUrl():
|
||
content = mw.readFile(getConf())
|
||
rep = r'ROOT_URL\\s*=\\s*(.*)'
|
||
tmp = re.search(rep, content)
|
||
if tmp:
|
||
return tmp.groups()[0]
|
||
|
||
rep = r'EXTERNAL_URL\\s*=\s*(.*)'
|
||
tmp = re.search(rep, content)
|
||
if tmp:
|
||
return tmp.groups()[0]
|
||
return ''
|
||
|
||
|
||
def getSshPort():
|
||
content = mw.readFile(getConf())
|
||
rep = r'SSH_PORT\\s*=\\s*(.*)'
|
||
tmp = re.search(rep, content)
|
||
if not tmp:
|
||
return ''
|
||
return tmp.groups()[0]
|
||
|
||
|
||
def getHttpPort():
|
||
content = mw.readFile(getConf())
|
||
rep = r'HTTP_PORT\\s*=\\s*(.*)'
|
||
tmp = re.search(rep, content)
|
||
if not tmp:
|
||
return ''
|
||
return tmp.groups()[0]
|
||
|
||
|
||
def getRootPath():
|
||
content = mw.readFile(getConf())
|
||
rep = r'ROOT\\s*=\\s*(.*)'
|
||
tmp = re.search(rep, content)
|
||
if not tmp:
|
||
return ''
|
||
return tmp.groups()[0]
|
||
|
||
|
||
def getDbConfValue():
|
||
conf = getConf()
|
||
if not os.path.exists(conf):
|
||
return {}
|
||
|
||
content = mw.readFile(conf)
|
||
rep_scope = r"\\[database\\](.*?)\\["
|
||
tmp = re.findall(rep_scope, content, re.S)
|
||
|
||
rep = r'(\\w*)\\s*=\\s*(.*)'
|
||
tmp = re.findall(rep, tmp[0])
|
||
r = {}
|
||
for x in range(len(tmp)):
|
||
k = tmp[x][0]
|
||
v = tmp[x][1]
|
||
r[k] = v
|
||
return r
|
||
|
||
|
||
def pMysqlDb(conf):
|
||
host = conf['HOST'].split(':')
|
||
# pymysql
|
||
db = mw.getMyORM()
|
||
# MySQLdb |
|
||
# db = mw.getMyORMDb()
|
||
|
||
db.setPort(int(host[1]))
|
||
db.setUser(conf['USER'])
|
||
|
||
if 'PASSWD' in conf:
|
||
db.setPwd(conf['PASSWD'])
|
||
else:
|
||
db.setPwd(conf['PASSWORD'])
|
||
|
||
db.setDbName(conf['NAME'])
|
||
# db.setSocket(getSocketFile())
|
||
db.setCharset("utf8")
|
||
return db
|
||
|
||
|
||
def pSqliteDb(conf):
|
||
# print(conf)
|
||
import db
|
||
psDb = db.Sql()
|
||
|
||
# 默认
|
||
gsdir = getServerDir() + '/data'
|
||
dbname = 'gogs'
|
||
if conf['PATH'][0] == '/':
|
||
# 绝对路径
|
||
pass
|
||
else:
|
||
path = conf['PATH'].split('/')
|
||
gsdir = getServerDir() + '/' + path[0]
|
||
dbname = path[1].split('.')[0]
|
||
|
||
# print(gsdir, dbname)
|
||
psDb.dbPos(gsdir, dbname)
|
||
return psDb
|
||
|
||
|
||
def getGogsDbType(conf):
|
||
|
||
if 'DB_TYPE' in conf:
|
||
return conf['DB_TYPE']
|
||
|
||
if 'TYPE' in conf:
|
||
return conf['TYPE']
|
||
|
||
return 'NONE'
|
||
|
||
|
||
def pQuery(sql):
|
||
conf = getDbConfValue()
|
||
gtype = getGogsDbType(conf)
|
||
if gtype == 'sqlite3':
|
||
db = pSqliteDb(conf)
|
||
data = db.query(sql, []).fetchall()
|
||
return data
|
||
elif gtype == 'mysql':
|
||
db = pMysqlDb(conf)
|
||
return db.query(sql)
|
||
|
||
print("仅支持mysql|sqlite3配置")
|
||
exit(0)
|
||
|
||
|
||
def isSqlError(mysqlMsg):
|
||
# 检测数据库执行错误
|
||
_mysqlMsg = str(mysqlMsg)
|
||
# print _mysqlMsg
|
||
if "MySQLdb" in _mysqlMsg:
|
||
return mw.returnData(False, 'MySQLdb组件缺失! <br>进入SSH命令行输入: pip install mysql-python')
|
||
if "2002," in _mysqlMsg:
|
||
return mw.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||
if "using password:" in _mysqlMsg:
|
||
return mw.returnData(False, '数据库管理密码错误!')
|
||
if "Connection refused" in _mysqlMsg:
|
||
return mw.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||
if "1133," in _mysqlMsg:
|
||
return mw.returnData(False, '数据库用户不存在!')
|
||
if "1007," in _mysqlMsg:
|
||
return mw.returnData(False, '数据库已经存在!')
|
||
if "1044," in _mysqlMsg:
|
||
return mw.returnData(False, mysqlMsg[1])
|
||
if "2003," in _mysqlMsg:
|
||
return mw.returnData(False, "Can't connect to MySQL server on '127.0.0.1' (61)")
|
||
return mw.returnData(True, 'OK')
|
||
|
||
|
||
def gogsOp(method):
|
||
file = initDreplace()
|
||
|
||
if not mw.isAppleSystem():
|
||
data = mw.execShell('systemctl ' + method + ' gogs')
|
||
if data[1] == '':
|
||
return 'ok'
|
||
return 'fail'
|
||
|
||
data = mw.execShell(__SR + file + ' ' + method)
|
||
if data[1] == '':
|
||
return 'ok'
|
||
return data[0]
|
||
|
||
|
||
def start():
|
||
return gogsOp('start')
|
||
|
||
|
||
def stop():
|
||
return gogsOp('stop')
|
||
|
||
|
||
def restart():
|
||
return gogsOp('restart')
|
||
|
||
|
||
def reload():
|
||
return gogsOp('reload')
|
||
|
||
|
||
def initdStatus():
|
||
if mw.isAppleSystem():
|
||
return "Apple Computer does not support"
|
||
|
||
shell_cmd = 'systemctl status gogs | grep loaded | grep "enabled;"'
|
||
data = mw.execShell(shell_cmd)
|
||
if data[0] == '':
|
||
return 'fail'
|
||
return 'ok'
|
||
|
||
|
||
def initdInstall():
|
||
if mw.isAppleSystem():
|
||
return "Apple Computer does not support"
|
||
|
||
mw.execShell('systemctl enable gogs')
|
||
return 'ok'
|
||
|
||
|
||
def initdUinstall():
|
||
if mw.isAppleSystem():
|
||
return "Apple Computer does not support"
|
||
|
||
mw.execShell('systemctl disable gogs')
|
||
return 'ok'
|
||
|
||
|
||
def runLog():
|
||
log_path = getServerDir() + '/log/gogs.log'
|
||
return log_path
|
||
|
||
|
||
def postReceiveLog():
|
||
log_path = getServerDir() + '/log/hooks/post-receive.log'
|
||
return log_path
|
||
|
||
|
||
def getGogsConf():
|
||
conf = getConf()
|
||
if not os.path.exists(conf):
|
||
return mw.returnJson(False, "请先安装初始化!<br/>默认地址:http://" + mw.getLocalIp() + ":3000")
|
||
|
||
gets = [
|
||
{'name': 'DOMAIN', 'type': -1, 'ps': '服务器域名'},
|
||
{'name': 'ROOT_URL', 'type': -1, 'ps': '公开的完整URL路径'},
|
||
{'name': 'HTTP_ADDR', 'type': -1, 'ps': '应用HTTP监听地址'},
|
||
{'name': 'HTTP_PORT', 'type': -1, 'ps': '应用 HTTP 监听端口号'},
|
||
|
||
{'name': 'START_SSH_SERVER', 'type': 2, 'ps': '启动内置SSH服务器'},
|
||
{'name': 'SSH_PORT', 'type': -1, 'ps': 'SSH 端口号'},
|
||
|
||
{'name': 'REQUIRE_SIGNIN_VIEW', 'type': 2, 'ps': '强制登录浏览'},
|
||
{'name': 'ENABLE_CAPTCHA', 'type': 2, 'ps': '启用验证码服务'},
|
||
{'name': 'DISABLE_REGISTRATION', 'type': 2, 'ps': '禁止注册,只能由管理员创建帐号'},
|
||
{'name': 'ENABLE_NOTIFY_MAIL', 'type': 2, 'ps': '是否开启邮件通知'},
|
||
|
||
{'name': 'FORCE_PRIVATE', 'type': 2, 'ps': '强制要求所有新建的仓库都是私有'},
|
||
|
||
{'name': 'SHOW_FOOTER_BRANDING', 'type': 2, 'ps': 'Gogs推广信息'},
|
||
{'name': 'SHOW_FOOTER_VERSION', 'type': 2, 'ps': 'Gogs版本信息'},
|
||
{'name': 'SHOW_FOOTER_TEMPLATE_LOAD_TIME', 'type': 2, 'ps': 'Gogs模板加载时间'},
|
||
]
|
||
conf = mw.readFile(conf)
|
||
result = []
|
||
|
||
for g in gets:
|
||
rep = g['name'] + '\\s*=\\s*(.*)'
|
||
tmp = re.search(rep, conf)
|
||
if not tmp:
|
||
continue
|
||
g['value'] = tmp.groups()[0]
|
||
result.append(g)
|
||
return mw.returnJson(True, 'OK', result)
|
||
|
||
|
||
def submitGogsConf():
|
||
gets = ['DOMAIN',
|
||
'ROOT_URL',
|
||
'HTTP_ADDR',
|
||
'HTTP_PORT',
|
||
'START_SSH_SERVER',
|
||
'SSH_PORT',
|
||
'REQUIRE_SIGNIN_VIEW',
|
||
'FORCE_PRIVATE',
|
||
'ENABLE_CAPTCHA',
|
||
'DISABLE_REGISTRATION',
|
||
'ENABLE_NOTIFY_MAIL',
|
||
'SHOW_FOOTER_BRANDING',
|
||
'SHOW_FOOTER_VERSION',
|
||
'SHOW_FOOTER_TEMPLATE_LOAD_TIME']
|
||
args = getArgs()
|
||
filename = getConf()
|
||
conf = mw.readFile(filename)
|
||
for g in gets:
|
||
if g in args:
|
||
rep = g + '\\s*=\\s*(.*)'
|
||
val = g + ' = ' + args[g]
|
||
conf = re.sub(rep, val, conf)
|
||
mw.writeFile(filename, conf)
|
||
reload()
|
||
return mw.returnJson(True, '设置成功')
|
||
|
||
|
||
def gogsEditTpl():
|
||
data = {}
|
||
data['post_receive'] = getPluginDir() + '/hook/post-receive.tpl'
|
||
data['commit'] = getPluginDir() + '/hook/commit.tpl'
|
||
return mw.getJson(data)
|
||
|
||
|
||
def userList():
|
||
|
||
conf = getConf()
|
||
if not os.path.exists(conf):
|
||
return mw.returnJson(False, "请先安装初始化!<br/>默认地址:http://" + mw.getLocalIp() + ":3000")
|
||
|
||
conf = getDbConfValue()
|
||
gtype = getGogsDbType(conf)
|
||
if gtype != 'mysql':
|
||
return mw.returnJson(False, "仅支持mysql数据操作!")
|
||
|
||
import math
|
||
args = getArgs()
|
||
|
||
data = checkArgs(args, ['page', 'page_size'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
page = int(args['page'])
|
||
page_size = int(args['page_size'])
|
||
search = ''
|
||
if 'search' in args:
|
||
search = args['search']
|
||
|
||
user_where1 = ''
|
||
user_where2 = ''
|
||
if search != '':
|
||
user_where1 = ' where name like "%' + search + '%"'
|
||
user_where2 = ' where name like "%' + search + '%"'
|
||
|
||
data = {}
|
||
|
||
data['root_url'] = getRootUrl()
|
||
|
||
start = (page - 1) * page_size
|
||
list_count = pQuery('select count(id) as num from user' + user_where1)
|
||
count = list_count[0]["num"]
|
||
list_data = pQuery(
|
||
'select id,name,email from user ' + user_where2 + ' order by id desc limit ' + str(start) + ',' + str(page_size))
|
||
data['list'] = mw.getPage({'count': count, 'p': page,
|
||
'row': page_size, 'tojs': 'gogsUserList'})
|
||
data['page'] = page
|
||
data['page_size'] = page_size
|
||
data['page_count'] = int(math.ceil(count / page_size))
|
||
data['data'] = list_data
|
||
return mw.returnJson(True, 'OK', data)
|
||
|
||
|
||
def checkRepoListIsHasScript(data):
|
||
path = getRootPath()
|
||
for x in range(len(data)):
|
||
name = data[x]['name'] + '/' + data[x]['repo'] + '.git'
|
||
path_tmp = path + '/' + name + '/custom_hooks/post-receive'
|
||
if os.path.exists(path_tmp):
|
||
data[x]['has_hook'] = True
|
||
else:
|
||
data[x]['has_hook'] = False
|
||
return data
|
||
|
||
|
||
def repoList():
|
||
|
||
conf = getConf()
|
||
if not os.path.exists(conf):
|
||
return mw.returnJson(False, "请先安装初始化!<br/>默认地址:http://" + mw.getLocalIp() + ":3000")
|
||
|
||
conf = getDbConfValue()
|
||
gtype = getGogsDbType(conf)
|
||
if gtype != 'mysql':
|
||
return mw.returnJson(False, "仅支持mysql数据操作!")
|
||
|
||
import math
|
||
args = getArgs()
|
||
|
||
data = checkArgs(args, ['page', 'page_size'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
page = int(args['page'])
|
||
page_size = int(args['page_size'])
|
||
search = ''
|
||
if 'search' in args:
|
||
search = args['search']
|
||
|
||
data = {}
|
||
|
||
data['root_url'] = getRootUrl()
|
||
|
||
repo_where1 = ''
|
||
repo_where2 = ''
|
||
if search != '':
|
||
repo_where1 = ' where name like "%' + search + '%"'
|
||
repo_where2 = ' where r.name like "%' + search + '%"'
|
||
|
||
start = (page - 1) * page_size
|
||
list_count = pQuery(
|
||
'select count(id) as num from repository' + repo_where1)
|
||
count = list_count[0]["num"]
|
||
sql = 'select r.id,r.owner_id,r.name as repo, u.name from repository r left join user u on r.owner_id=u.id ' + repo_where2 + ' order by r.id desc limit ' + \
|
||
str(start) + ',' + str(page_size)
|
||
# print(sql)
|
||
list_data = pQuery(sql)
|
||
# print(list_data)
|
||
list_data = checkRepoListIsHasScript(list_data)
|
||
|
||
data['list'] = mw.getPage({'count': count, 'p': page, 'row': page_size, 'tojs': 'gogsRepoListPage'})
|
||
data['page'] = page
|
||
data['page_size'] = page_size
|
||
data['page_count'] = int(math.ceil(count / page_size))
|
||
data['data'] = list_data
|
||
return mw.returnJson(True, 'OK', data)
|
||
|
||
|
||
def getAllUserProject(user, search=''):
|
||
path = getRootPath() + '/' + user
|
||
dlist = []
|
||
if os.path.exists(path):
|
||
for filename in os.listdir(path):
|
||
tmp = {}
|
||
filePath = path + '/' + filename
|
||
if os.path.isdir(filePath):
|
||
if search == '':
|
||
tmp['name'] = filename.replace('.git', '')
|
||
dlist.append(tmp)
|
||
else:
|
||
if filename.find(search) != -1:
|
||
tmp['name'] = filename.replace('.git', '')
|
||
dlist.append(tmp)
|
||
return dlist
|
||
|
||
|
||
def checkProjectListIsHasScript(user, data):
|
||
path = getRootPath() + '/' + user
|
||
for x in range(len(data)):
|
||
name = data[x]['name'] + '.git'
|
||
path_tmp = path + '/' + name + '/custom_hooks/post-receive'
|
||
if os.path.exists(path_tmp):
|
||
data[x]['has_hook'] = True
|
||
else:
|
||
data[x]['has_hook'] = False
|
||
return data
|
||
|
||
|
||
def userProjectList():
|
||
import math
|
||
args = getArgs()
|
||
# print args
|
||
|
||
page = 1
|
||
page_size = 5
|
||
search = ''
|
||
|
||
if not 'name' in args:
|
||
return mw.returnJson(False, '缺少参数name')
|
||
if 'page' in args:
|
||
page = int(args['page'])
|
||
|
||
if 'page_size' in args:
|
||
page_size = int(args['page_size'])
|
||
|
||
if 'search' in args:
|
||
search = args['search']
|
||
|
||
data = {}
|
||
|
||
ulist = getAllUserProject(args['name'])
|
||
dlist_sum = len(ulist)
|
||
|
||
start = (page - 1) * page_size
|
||
ret_data = ulist[start:start + page_size]
|
||
ret_data = checkProjectListIsHasScript(args['name'], ret_data)
|
||
|
||
data['root_url'] = getRootUrl()
|
||
data['data'] = ret_data
|
||
data['args'] = args
|
||
data['list'] = mw.getPage(
|
||
{'count': dlist_sum, 'p': page, 'row': page_size, 'tojs': 'userProjectListPage'})
|
||
|
||
return mw.returnJson(True, 'OK', data)
|
||
|
||
|
||
def projectScriptEdit():
|
||
args = getArgs()
|
||
|
||
if not 'user' in args:
|
||
return mw.returnJson(True, 'username missing')
|
||
|
||
if not 'name' in args:
|
||
return mw.returnJson(True, 'project name missing')
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
post_receive = getRootPath() + '/' + user + '/' + name + \
|
||
'/custom_hooks/commit'
|
||
if os.path.exists(post_receive):
|
||
return mw.returnJson(True, 'OK', {'path': post_receive})
|
||
else:
|
||
return mw.returnJson(False, 'file does not exist')
|
||
|
||
|
||
def projectScriptLoad():
|
||
args = getArgs()
|
||
if not 'user' in args:
|
||
return mw.returnJson(True, 'username missing')
|
||
|
||
if not 'name' in args:
|
||
return mw.returnJson(True, 'project name missing')
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
|
||
path = getRootPath() + '/' + user + '/' + name
|
||
post_receive_tpl = getPluginDir() + '/hook/post-receive.tpl'
|
||
post_receive = path + '/custom_hooks/post-receive'
|
||
|
||
if not os.path.exists(path + '/custom_hooks'):
|
||
mw.execShell('mkdir -p ' + path + '/custom_hooks')
|
||
|
||
pct_content = mw.readFile(post_receive_tpl)
|
||
pct_content = pct_content.replace('{$PATH}', path + '/custom_hooks')
|
||
mw.writeFile(post_receive, pct_content)
|
||
mw.execShell('chmod 777 ' + post_receive)
|
||
|
||
commit_tpl = getPluginDir() + '/hook/commit.tpl'
|
||
commit = path + '/custom_hooks/commit'
|
||
|
||
codeDir = mw.getFatherDir() + '/git'
|
||
|
||
cc_content = mw.readFile(commit_tpl)
|
||
|
||
gitPath = getRootPath()
|
||
cc_content = cc_content.replace('{$GITROOTURL}', gitPath)
|
||
cc_content = cc_content.replace('{$CODE_DIR}', codeDir)
|
||
cc_content = cc_content.replace('{$USERNAME}', user)
|
||
cc_content = cc_content.replace('{$PROJECT}', args['name'])
|
||
cc_content = cc_content.replace('{$WEB_ROOT}', mw.getWwwDir())
|
||
mw.writeFile(commit, cc_content)
|
||
mw.execShell('chmod 777 ' + commit)
|
||
|
||
return 'ok'
|
||
|
||
|
||
def projectScriptUnload():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
|
||
post_receive = getRootPath() + '/' + user + '/' + name + \
|
||
'/custom_hooks/post-receive'
|
||
mw.execShell('rm -f ' + post_receive)
|
||
|
||
commit = getRootPath() + '/' + user + '/' + name + \
|
||
'/custom_hooks/commit'
|
||
mw.execShell('rm -f ' + commit)
|
||
return 'ok'
|
||
|
||
|
||
def projectScriptDebug():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
commit_log = getRootPath() + '/' + user + '/' + name + \
|
||
'/custom_hooks/sh.log'
|
||
|
||
data = {}
|
||
if os.path.exists(commit_log):
|
||
data['status'] = True
|
||
data['path'] = commit_log
|
||
else:
|
||
data['status'] = False
|
||
data['msg'] = '没有日志文件'
|
||
|
||
return mw.getJson(data)
|
||
|
||
|
||
def projectScriptRun():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
|
||
path = getRootPath() + '/' + user + '/' + name
|
||
commit_sh = path + '/custom_hooks/commit'
|
||
commit_log = path + '/custom_hooks/sh.log'
|
||
script_run = 'sh -x ' + commit_sh + ' 2>' + commit_log
|
||
|
||
if not os.path.exists(commit_sh):
|
||
return mw.returnJson(False, '脚本文件不存在!')
|
||
|
||
mw.execShell(script_run)
|
||
return mw.returnJson(True, '脚本文件执行成功,观察日志!')
|
||
|
||
|
||
def projectScriptSelf():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
|
||
custom_hooks = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
|
||
self_path = custom_hooks + '/self'
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
self_logs_path = custom_hooks + '/self_logs'
|
||
if not os.path.exists(self_logs_path):
|
||
os.mkdir(self_logs_path)
|
||
|
||
self_hook_file = custom_hooks + '/self_hook.sh'
|
||
self_hook_exist = False
|
||
if os.path.exists(self_hook_file):
|
||
self_hook_exist = True
|
||
|
||
dlist = []
|
||
if os.path.exists(self_path):
|
||
for filename in os.listdir(self_path):
|
||
tmp = {}
|
||
filePath = self_path + '/' + filename
|
||
if os.path.isfile(filePath):
|
||
tmp['path'] = filePath
|
||
tmp['name'] = os.path.basename(filePath)
|
||
tmp['is_hidden'] = False
|
||
if tmp['name'].endswith('.txt'):
|
||
tmp['is_hidden'] = True
|
||
|
||
dlist.append(tmp)
|
||
|
||
dlist_sum = len(dlist)
|
||
# print(dlist)
|
||
rdata = {}
|
||
rdata['data'] = dlist
|
||
rdata['self_hook'] = self_hook_exist
|
||
rdata['list'] = mw.getPage(
|
||
{'count': dlist_sum, 'p': 1, 'row': 100, 'tojs': 'self_page'})
|
||
|
||
return mw.returnJson(True, 'ok', rdata)
|
||
|
||
|
||
def projectScriptSelf_Create():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'file'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
file = args['file']
|
||
|
||
self_path = path = getRootPath() + '/' + user + '/' + name + '/custom_hooks/self'
|
||
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
abs_file = self_path + '/' + file + '.sh'
|
||
if os.path.exists(abs_file):
|
||
return mw.returnJson(False, '脚本已经存在!')
|
||
|
||
mw.writeFile(abs_file, "#!/bin/bash\necho `date +'%Y-%m-%d %H:%M:%S'`\n")
|
||
|
||
rdata = {}
|
||
rdata['abs_file'] = abs_file
|
||
return mw.returnJson(True, '创建文件成功!', rdata)
|
||
|
||
|
||
def projectScriptSelf_Del():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'file'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
file = args['file']
|
||
|
||
custom_hooks = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
self_path = custom_hooks + '/self'
|
||
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
abs_file = self_path + '/' + file
|
||
# print(abs_file)
|
||
if not os.path.exists(abs_file):
|
||
return mw.returnJson(False, '脚本已经删除!')
|
||
|
||
os.remove(abs_file)
|
||
|
||
# 日志也删除
|
||
log_file = custom_hooks + '/self_logs/' + file + '.log'
|
||
if os.path.exists(log_file):
|
||
os.remove(log_file)
|
||
|
||
return mw.returnJson(True, '脚本删除成功!')
|
||
|
||
|
||
def projectScriptSelf_Logs():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'file'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
file = args['file']
|
||
|
||
self_path = path = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks/self_logs'
|
||
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
logs_file = self_path + '/' + file + '.log'
|
||
if os.path.exists(logs_file):
|
||
rdata = {}
|
||
rdata['path'] = logs_file
|
||
return mw.returnJson(True, 'ok', rdata)
|
||
|
||
return mw.returnJson(False, '日志不存在!')
|
||
|
||
|
||
def projectScriptSelf_Run():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'file'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
file = args['file']
|
||
|
||
custom_hooks = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
self_path = custom_hooks + '/self/' + file
|
||
self_logs_path = custom_hooks + '/self_logs/' + file + '.log'
|
||
|
||
shell = "sh -x " + self_path + " 2>" + self_logs_path + ' &'
|
||
mw.execShell(shell)
|
||
return mw.returnJson(True, '执行成功!')
|
||
|
||
|
||
def projectScriptSelf_Rename():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'o_file', 'n_file'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
o_file = args['o_file']
|
||
n_file = args['n_file']
|
||
|
||
custom_hooks = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
self_path = custom_hooks + '/self'
|
||
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
o_file_abs = self_path + '/' + o_file + '.sh'
|
||
if not os.path.exists(o_file_abs):
|
||
return mw.returnJson(False, '原文件已经不存在了!')
|
||
|
||
n_file_abs = self_path + '/' + n_file + '.sh'
|
||
|
||
os.rename(o_file_abs, n_file_abs)
|
||
|
||
# 日志也删除
|
||
log_file = custom_hooks + '/self_logs/' + o_file + '.sh.log'
|
||
if os.path.exists(log_file):
|
||
os.remove(log_file)
|
||
|
||
return mw.returnJson(True, '重命名成功!')
|
||
|
||
|
||
def projectScriptSelf_Enable():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'enable'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
enable = args['enable']
|
||
|
||
custom_path = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
|
||
# 替换commit配置
|
||
commit_path = custom_path + '/commit'
|
||
note = '#Gogs Script Don`t Remove and Change'
|
||
|
||
self_file = custom_path + '/self_hook.sh'
|
||
self_hook_tpl = getPluginDir() + '/hook/self_hook.tpl'
|
||
|
||
if enable == '1':
|
||
content = mw.readFile(self_hook_tpl)
|
||
content = content.replace('{$HOOK_DIR}', custom_path + '/self')
|
||
content = content.replace(
|
||
'{$HOOK_LOGS_DIR}', custom_path + '/self_logs')
|
||
mw.writeFile(self_file, content)
|
||
mw.execShell("chmod 777 " + self_file)
|
||
|
||
commit_content = mw.readFile(commit_path)
|
||
commit_content += "\n\n" + "bash " + self_file + " " + note
|
||
mw.writeFile(commit_path, commit_content)
|
||
|
||
return mw.returnJson(True, '开启成功!')
|
||
else:
|
||
commit_content = mw.readFile(commit_path)
|
||
rep = ".*" + note
|
||
commit_content = re.sub(rep, '', commit_content, re.M)
|
||
commit_content = commit_content.strip()
|
||
mw.writeFile(commit_path, commit_content)
|
||
if os.path.exists(self_file):
|
||
os.remove(self_file)
|
||
return mw.returnJson(True, '关闭成功!')
|
||
|
||
|
||
def projectScriptSelf_Status():
|
||
args = getArgs()
|
||
data = checkArgs(args, ['user', 'name', 'file', 'status'])
|
||
if not data[0]:
|
||
return data[1]
|
||
|
||
user = args['user']
|
||
name = args['name'] + '.git'
|
||
file = args['file']
|
||
status = args['status']
|
||
|
||
custom_hooks = getRootPath() + '/' + user + '/' + \
|
||
name + '/custom_hooks'
|
||
self_path = custom_hooks + '/self'
|
||
|
||
if not os.path.exists(self_path):
|
||
os.mkdir(self_path)
|
||
|
||
# 日志也删除
|
||
log_file = custom_hooks + '/self_logs/' + file + '.log'
|
||
if os.path.exists(log_file):
|
||
os.remove(log_file)
|
||
|
||
if status == '1':
|
||
file_abs = self_path + '/' + file
|
||
file_text_abs = self_path + '/' + file + '.txt'
|
||
os.rename(file_abs, file_text_abs)
|
||
return mw.returnJson(True, '开始禁用成功!')
|
||
else:
|
||
file_abs = self_path + '/' + file.strip('.txt')
|
||
file_text_abs = self_path + '/' + file
|
||
os.rename(file_text_abs, file_abs)
|
||
return mw.returnJson(True, '开始使用成功!')
|
||
|
||
return mw.returnJson(True, '禁用成功!')
|
||
|
||
|
||
def getRsaPublic():
|
||
path = getHomeDir()
|
||
path += '/.ssh/id_rsa.pub'
|
||
|
||
content = mw.readFile(path)
|
||
|
||
data = {}
|
||
data['mw'] = content
|
||
return mw.getJson(data)
|
||
|
||
|
||
def getTotalStatistics():
|
||
st = status()
|
||
data = {}
|
||
if st.strip() == 'start':
|
||
list_count = pQuery('select count(id) as num from repository')
|
||
count = list_count[0]["num"]
|
||
data['status'] = True
|
||
data['count'] = count
|
||
data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
|
||
return mw.returnJson(True, 'ok', data)
|
||
|
||
data['status'] = False
|
||
data['count'] = 0
|
||
return mw.returnJson(False, 'fail', data)
|
||
|
||
|
||
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_log':
|
||
print(runLog())
|
||
elif func == 'post_receive_log':
|
||
print(postReceiveLog())
|
||
elif func == 'conf':
|
||
print(getConf())
|
||
elif func == 'init_conf':
|
||
print(getInitdConf())
|
||
elif func == 'get_gogs_conf':
|
||
print(getGogsConf())
|
||
elif func == 'submit_gogs_conf':
|
||
print(submitGogsConf())
|
||
elif func == 'gogs_edit_tpl':
|
||
print(gogsEditTpl())
|
||
elif func == 'user_list':
|
||
print(userList())
|
||
elif func == 'repo_list':
|
||
print(repoList())
|
||
elif func == 'user_project_list':
|
||
print(userProjectList())
|
||
elif func == 'project_script_edit':
|
||
print(projectScriptEdit())
|
||
elif func == 'project_script_load':
|
||
print(projectScriptLoad())
|
||
elif func == 'project_script_unload':
|
||
print(projectScriptUnload())
|
||
elif func == 'project_script_debug':
|
||
print(projectScriptDebug())
|
||
elif func == 'project_script_run':
|
||
print(projectScriptRun())
|
||
elif func == 'project_script_self':
|
||
print(projectScriptSelf())
|
||
elif func == 'project_script_self_create':
|
||
print(projectScriptSelf_Create())
|
||
elif func == 'project_script_self_del':
|
||
print(projectScriptSelf_Del())
|
||
elif func == 'project_script_self_logs':
|
||
print(projectScriptSelf_Logs())
|
||
elif func == 'project_script_self_run':
|
||
print(projectScriptSelf_Run())
|
||
elif func == 'project_script_self_rename':
|
||
print(projectScriptSelf_Rename())
|
||
elif func == 'project_script_self_enable':
|
||
print(projectScriptSelf_Enable())
|
||
elif func == 'project_script_self_status':
|
||
print(projectScriptSelf_Status())
|
||
elif func == 'get_rsa_public':
|
||
print(getRsaPublic())
|
||
elif func == 'get_total_statistics':
|
||
print(getTotalStatistics())
|
||
else:
|
||
print('fail')
|