移除csvn,不再为核心代码
This commit is contained in:
parent
b00042ecff
commit
935b504377
|
|
@ -1,34 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export LC_CTYPE=zh_CN.UTF-8
|
||||
|
||||
|
||||
REPOS="$1"
|
||||
REV="$2"
|
||||
TXN_NAME="$3"
|
||||
|
||||
|
||||
if [ ! -d {$PROJECT_DIR}/csvn ]; then
|
||||
sudo mkdir -p {$PROJECT_DIR}/csvn
|
||||
sudo chown -R csvn:csvn {$PROJECT_DIR}/csvn
|
||||
fi
|
||||
|
||||
SAVE_PATH={$PROJECT_DIR}/csvn/$REPOS
|
||||
SVN_PATH=http://127.0.0.1:{$PORT}/svn/$REPOS
|
||||
|
||||
if [ ! -d $SAVE_PATH ]; then
|
||||
svn co $SVN_PATH $SAVE_PATH \
|
||||
--username={$CSVN_USER} \
|
||||
--password={$CSVN_PWD} \
|
||||
--no-auth-cache \
|
||||
--non-interactive
|
||||
fi
|
||||
|
||||
cd $SAVE_PATH && svn update --username={$CSVN_USER} --password={$CSVN_PWD} --no-auth-cache --non-interactive
|
||||
|
||||
WEB_PATH={$PROJECT_DIR}/wwwroot/$REPOS
|
||||
sudo mkdir -p $WEB_PATH
|
||||
|
||||
sudo rsync -vauP --delete --exclude=".*" $SAVE_PATH/ $WEB_PATH
|
||||
sudo chown -R www:www $WEB_PATH
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
|
||||
REPOS="$1"
|
||||
REV="$2"
|
||||
TXN_NAME="$3"
|
||||
|
||||
REPOS_NAME=${REPOS##*/}
|
||||
|
||||
sh -x $REPOS/hooks/commit $REPOS_NAME $REV $TXN_NAME 2>$REPOS/sh.log
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.1 KiB |
|
|
@ -1,41 +0,0 @@
|
|||
<style type="text/css">
|
||||
.outline_no {
|
||||
outline:none;
|
||||
}
|
||||
</style>
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('csvn');">服务</p>
|
||||
<p onclick="pluginInitD('csvn');">自启动</p>
|
||||
<p onclick="csvnEdit();">手动编辑</p>
|
||||
<p onclick="csvnUserList(1);">用户管理</p>
|
||||
<p onclick="csvnProjectList(1);">项目管理</p>
|
||||
<p onclick="csvnReadme();">使用说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(700);
|
||||
|
||||
$.getScript( "/plugins/file?name=csvn&f=js/csvn.js");
|
||||
|
||||
function csvnReadme(){
|
||||
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>注意:在启动时会比较慢,需要耐心等待一会</li>';
|
||||
readme += '<li>注意:csvn需要java环境,在安装会自动检查并安装</li>';
|
||||
readme += '<li>注意:默认后台密码admin:admin,最好马上修改</li>';
|
||||
readme += '<li>注意:牢记admin的密码,在后csvn的管理后台和这里不同步</li>';
|
||||
readme += '<li>注意:在这里添加用户和csvn后台并不同步</li>';
|
||||
readme += '<li>注意:项目管理的地址一般是正确的,但在特殊环境下,地址可能不一致</li>';
|
||||
readme += '<li>注意:脚本内使用sudo名,需要注释(vi /etc/sudoers)[#Default requiretty]</li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.bt-w-main .soft-man-con').html(readme);
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,711 +0,0 @@
|
|||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import urllib
|
||||
import binascii
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'csvn'
|
||||
|
||||
|
||||
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(':')
|
||||
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 initDreplace():
|
||||
initd_file = getInitDFile()
|
||||
|
||||
if not os.path.exists(initd_file):
|
||||
return getServerDir()
|
||||
|
||||
return initd_file
|
||||
|
||||
|
||||
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 csvnOp(method):
|
||||
|
||||
if app_debug:
|
||||
os_name = mw.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_initd_csvn = '/etc/init.d/csvn'
|
||||
_initd_csvn_httpd = '/etc/init.d/csvn-httpd'
|
||||
#_csvn = getServerDir() + '/bin/csvn'
|
||||
#_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn_httpd = mw.execShell(_initd_csvn_httpd + ' ' + method)
|
||||
# ret_csvn = mw.execShell(_initd_csvn + ' ' + method)
|
||||
subprocess.Popen(_initd_csvn + ' ' + method,
|
||||
stdout=subprocess.PIPE, shell=True)
|
||||
if ret_csvn_httpd[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def start():
|
||||
if not os.path.exists("/etc/init.d/csvn"):
|
||||
return "先在自启动安装!"
|
||||
return csvnOp('start')
|
||||
|
||||
|
||||
def stop():
|
||||
return csvnOp('stop')
|
||||
|
||||
|
||||
def restart():
|
||||
return csvnOp('restart')
|
||||
|
||||
|
||||
def reload():
|
||||
return csvnOp('reload')
|
||||
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_initd_csvn = '/etc/init.d/csvn'
|
||||
_initd_csvn_httpd = '/etc/init.d/csvn-httpd'
|
||||
|
||||
if os.path.exists(_initd_csvn) and os.path.exists(_initd_csvn_httpd):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
import shutil
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = mw.execShell(_csvn + ' install')
|
||||
ret_csvn_httpd = mw.execShell(_csvn_httpd + ' install')
|
||||
if ret_csvn[1] == '' and ret_csvn_httpd[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = mw.execShell(_csvn + ' remove')
|
||||
ret_csvn_httpd = mw.execShell(_csvn_httpd + ' remove')
|
||||
return 'ok'
|
||||
|
||||
|
||||
def csvnEdit():
|
||||
data = {}
|
||||
data['svn_access_file'] = getServerDir() + '/data/conf/svn_access_file'
|
||||
data['commit_tpl'] = getPluginDir() + '/hook/commit.tpl'
|
||||
data['post_commit_tpl'] = getPluginDir() + '/hook/post-commit.tpl'
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def userAdd():
|
||||
args = getArgs()
|
||||
if not 'username' in args:
|
||||
return 'name missing'
|
||||
|
||||
if not 'password' in args:
|
||||
return 'password missing'
|
||||
|
||||
htpasswd = getServerDir() + "/bin/htpasswd"
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -b ' + svn_auth_file + ' ' + \
|
||||
args['username'] + ' ' + args['password']
|
||||
data = mw.execShell(cmd)
|
||||
# print data
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def userDel():
|
||||
args = getArgs()
|
||||
if not 'username' in args:
|
||||
return 'name missing'
|
||||
|
||||
htpasswd = getServerDir() + "/bin/htpasswd"
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -D ' + svn_auth_file + ' ' + args['username']
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def getAllUser(search=''):
|
||||
svn_auth_file = getServerDir() + '/data/conf/svn_auth_file'
|
||||
if not os.path.exists(svn_auth_file):
|
||||
return mw.getJson([])
|
||||
auth = mw.readFile(svn_auth_file)
|
||||
auth = auth.strip()
|
||||
auth_list = auth.split("\n")
|
||||
|
||||
ulist = []
|
||||
for x in range(len(auth_list)):
|
||||
tmp = auth_list[x].split(':')
|
||||
if search != '':
|
||||
if tmp[0].find(search) != -1:
|
||||
ulist.append(tmp[0])
|
||||
else:
|
||||
ulist.append(tmp[0])
|
||||
return ulist
|
||||
|
||||
|
||||
def userList():
|
||||
import math
|
||||
args = getArgs()
|
||||
|
||||
page = 1
|
||||
page_size = 10
|
||||
search = ''
|
||||
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']
|
||||
|
||||
ulist = getAllUser(search)
|
||||
ulist_sum = len(ulist)
|
||||
|
||||
page_info = {'count': ulist_sum, 'p': page,
|
||||
'row': 10, 'tojs': 'csvnUserList'}
|
||||
data = {}
|
||||
data['list'] = mw.getPage(page_info)
|
||||
data['page'] = page
|
||||
data['page_size'] = page_size
|
||||
data['page_count'] = int(math.ceil(ulist_sum / page_size))
|
||||
start = (page - 1) * page_size
|
||||
|
||||
data['data'] = ulist[start:start + page_size]
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def projectAdd():
|
||||
args = getArgs()
|
||||
if not 'name' in args:
|
||||
return 'project name missing'
|
||||
path = getServerDir() + '/bin/svnadmin'
|
||||
dest = getServerDir() + '/data/repositories/' + args['name']
|
||||
cmd = path + ' create ' + dest
|
||||
data = mw.execShell(cmd)
|
||||
if data[1] == '':
|
||||
mw.execShell('chown -R csvn:csvn ' + dest)
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def projectDel():
|
||||
args = getArgs()
|
||||
if not 'name' in args:
|
||||
return 'project name missing'
|
||||
|
||||
dest = getServerDir() + '/data/repositories/' + args['name']
|
||||
cmd = 'rm -rf ' + dest
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def getHttpPort():
|
||||
http_main_conf = getServerDir() + '/data/conf/csvn_main_httpd.conf'
|
||||
try:
|
||||
if os.path.exists(http_main_conf):
|
||||
content = mw.readFile(http_main_conf)
|
||||
return re.search('Listen\s(\d+)', content).groups()[0]
|
||||
except Exception as e:
|
||||
pass # print e
|
||||
return '80'
|
||||
|
||||
|
||||
def getCsvnPort():
|
||||
http_main_conf = getServerDir() + '/data/conf/csvn-wrapper.conf'
|
||||
try:
|
||||
if os.path.exists(http_main_conf):
|
||||
content = mw.readFile(http_main_conf)
|
||||
return re.search('wrapper.java.additional.3=-Djetty.port=(\d+)', content).groups()[0]
|
||||
except Exception as e:
|
||||
pass # print e
|
||||
return '3343'
|
||||
|
||||
|
||||
def getALlProjectList(search=''):
|
||||
path = getServerDir() + '/data/repositories'
|
||||
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
|
||||
dlist.append(tmp)
|
||||
else:
|
||||
if filename.find(search) != -1:
|
||||
tmp['name'] = filename
|
||||
dlist.append(tmp)
|
||||
return dlist
|
||||
|
||||
|
||||
def checkProjectListIsHasScript(data):
|
||||
dlen = len(data)
|
||||
for x in range(dlen):
|
||||
path = getServerDir() + '/data/repositories/' + \
|
||||
data[x]['name'] + '/hooks/post-commit'
|
||||
if os.path.exists(path):
|
||||
data[x]['has_hook'] = True
|
||||
else:
|
||||
data[x]['has_hook'] = False
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def projectList():
|
||||
import math
|
||||
args = getArgs()
|
||||
|
||||
page = 1
|
||||
page_size = 10
|
||||
search = ''
|
||||
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']
|
||||
|
||||
dlist = getALlProjectList(search)
|
||||
dlist_sum = len(dlist)
|
||||
|
||||
start = (page - 1) * page_size
|
||||
ret_data = dlist[start:start + page_size]
|
||||
ret_data = checkProjectListIsHasScript(ret_data)
|
||||
|
||||
data = {}
|
||||
data['data'] = ret_data
|
||||
data['list'] = mw.getPage(
|
||||
{'count': dlist_sum, 'p': page, 'row': 10, 'tojs': 'csvnProjectList'})
|
||||
data['ip'] = mw.getLocalIp()
|
||||
data['port'] = getHttpPort()
|
||||
data['csvn_port'] = getCsvnPort()
|
||||
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getAllAclList():
|
||||
svn_access_file = getServerDir() + '/data/conf/svn_access_file'
|
||||
aData = mw.readFile(svn_access_file)
|
||||
aData = re.sub('#.*', '', aData)
|
||||
aData = aData.strip().split('[')[1:]
|
||||
allAcl = {}
|
||||
for i in range(len(aData)):
|
||||
oData = aData[i].strip().split(']')
|
||||
name = oData[0].strip('/').strip(':')
|
||||
if oData[1] == '':
|
||||
allAcl[name] = []
|
||||
else:
|
||||
user = oData[1].strip().split('\n')
|
||||
userAll = []
|
||||
for iu in range(len(user)):
|
||||
ulist = user[iu].split('=')
|
||||
utmp = {}
|
||||
utmp['user'] = ulist[0].strip()
|
||||
utmp['acl'] = ulist[1].strip()
|
||||
userAll.append(utmp)
|
||||
allAcl[name] = userAll
|
||||
return allAcl
|
||||
|
||||
|
||||
def makeAclFile(content):
|
||||
# print content
|
||||
svn_access_file = getServerDir() + '/data/conf/svn_access_file'
|
||||
tmp = "\n"
|
||||
for k, v in content.items():
|
||||
if k == '':
|
||||
tmp += "[/]\n"
|
||||
else:
|
||||
tmp += "[" + k + ":/]\n"
|
||||
|
||||
for iv in range(len(v)):
|
||||
tmp += v[iv]['user'] + ' = ' + v[iv]['acl'] + "\n"
|
||||
tmp += "\n"
|
||||
# svn_tmp_path = getServerDir() + '/data/conf/svn_access_file.log'
|
||||
return mw.writeFile(svn_access_file, tmp)
|
||||
|
||||
|
||||
def projectAclList():
|
||||
args = getArgs()
|
||||
if not 'name' in args:
|
||||
return 'name missing!'
|
||||
name = args['name']
|
||||
acl = getAllAclList()
|
||||
|
||||
if name in acl:
|
||||
return mw.getJson(acl[name])
|
||||
else:
|
||||
return 'fail'
|
||||
|
||||
|
||||
def projectAclAdd():
|
||||
args = getArgs()
|
||||
if not 'uname' in args:
|
||||
return 'username missing'
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
uname = args['uname']
|
||||
pname = args['pname']
|
||||
|
||||
ulist = getAllUser()
|
||||
if not uname in ulist:
|
||||
return uname + " user not exists!"
|
||||
|
||||
acl = getAllAclList()
|
||||
|
||||
tmp_acl = {'user': uname, 'acl': 'rw'}
|
||||
if not pname in acl:
|
||||
acl[pname] = [tmp_acl]
|
||||
makeAclFile(acl)
|
||||
return 'ok'
|
||||
|
||||
tmp = acl[pname]
|
||||
tmp_len = len(tmp)
|
||||
|
||||
if tmp_len == 0:
|
||||
acl[pname] = [tmp_acl]
|
||||
else:
|
||||
is_have = False
|
||||
for x in range(tmp_len):
|
||||
if tmp[x]['user'] == uname:
|
||||
is_have = True
|
||||
return uname + ' users already exist!'
|
||||
if not is_have:
|
||||
tmp.append(tmp_acl)
|
||||
acl[pname] = tmp
|
||||
|
||||
makeAclFile(acl)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def projectAclDel():
|
||||
args = getArgs()
|
||||
if not 'uname' in args:
|
||||
return 'username missing'
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
|
||||
uname = args['uname']
|
||||
pname = args['pname']
|
||||
|
||||
ulist = getAllUser()
|
||||
if not uname in ulist:
|
||||
return uname + " user not exists!"
|
||||
|
||||
acl = getAllAclList()
|
||||
|
||||
if not pname in acl:
|
||||
return 'project not exists!'
|
||||
|
||||
tmp = acl[pname]
|
||||
tmp_len = len(tmp)
|
||||
if tmp_len == 0:
|
||||
return 'project no have user:' + uname
|
||||
else:
|
||||
is_have = False
|
||||
rtmp = []
|
||||
for x in range(tmp_len):
|
||||
if tmp[x]['user'] != uname:
|
||||
rtmp.append(tmp[x])
|
||||
acl[pname] = rtmp
|
||||
makeAclFile(acl)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def projectAclSet():
|
||||
args = getArgs()
|
||||
if not 'uname' in args:
|
||||
return 'username missing'
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
if not 'acl' in args:
|
||||
return 'acl missing'
|
||||
|
||||
uname = args['uname']
|
||||
pname = args['pname']
|
||||
up_acl = args['acl']
|
||||
|
||||
ulist = getAllUser()
|
||||
if not uname in ulist:
|
||||
return uname + " user not exists!"
|
||||
|
||||
acl = getAllAclList()
|
||||
|
||||
if not pname in acl:
|
||||
return 'project not exists!'
|
||||
|
||||
tmp = acl[pname]
|
||||
tmp_len = len(tmp)
|
||||
if tmp_len == 0:
|
||||
return 'project no have user:' + uname
|
||||
else:
|
||||
is_have = False
|
||||
for x in range(tmp_len):
|
||||
if tmp[x]['user'] == uname:
|
||||
tmp[x]['acl'] = up_acl
|
||||
acl[pname] = tmp
|
||||
makeAclFile(acl)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def getCsvnUser():
|
||||
user = 'admin_sync'
|
||||
|
||||
acl = getAllAclList()
|
||||
if '' in acl:
|
||||
tmp = acl['']
|
||||
is_has = False
|
||||
for data in tmp:
|
||||
if data['user'] == user:
|
||||
is_has = True
|
||||
if not is_has:
|
||||
tmp.append({'user': user, 'acl': 'r'})
|
||||
acl[''] = tmp
|
||||
makeAclFile(acl)
|
||||
return user
|
||||
|
||||
|
||||
def getCsvnPwd(user):
|
||||
if app_debug:
|
||||
return user + '123'
|
||||
pwd_file = 'data/csvn_sync.pl'
|
||||
|
||||
if os.path.exists(pwd_file):
|
||||
return mw.readFile(pwd_file).strip()
|
||||
|
||||
import time
|
||||
cur_time = time.time()
|
||||
rand_pwd = mw.md5(str(cur_time))
|
||||
pwd = user + rand_pwd[:5]
|
||||
|
||||
htpasswd = getServerDir() + "/bin/htpasswd"
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -b ' + svn_auth_file + ' ' + user + ' ' + pwd
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
mw.writeFile(pwd_file, pwd)
|
||||
return pwd
|
||||
|
||||
|
||||
def projectScriptLoad():
|
||||
|
||||
args = getArgs()
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
|
||||
post_commit_tpl = getPluginDir() + '/hook/post-commit.tpl'
|
||||
hook_path = getServerDir() + '/data/repositories/' + \
|
||||
args['pname'] + '/hooks'
|
||||
post_commit_file = hook_path + '/post-commit'
|
||||
|
||||
pct_content = mw.readFile(post_commit_tpl)
|
||||
mw.writeFile(post_commit_file, pct_content)
|
||||
mw.execShell('chmod 777 ' + post_commit_file)
|
||||
|
||||
commit_tpl = getPluginDir() + '/hook/commit.tpl'
|
||||
commit_file = hook_path + '/commit'
|
||||
|
||||
ct_content = mw.readFile(commit_tpl)
|
||||
ct_content = ct_content.replace('{$PROJECT_DIR}', mw.getRootDir())
|
||||
ct_content = ct_content.replace('{$PORT}', getHttpPort())
|
||||
ct_content = ct_content.replace('{$CSVN_USER}', getCsvnUser())
|
||||
ct_content = ct_content.replace('{$CSVN_PWD}', getCsvnPwd(getCsvnUser()))
|
||||
|
||||
mw.writeFile(commit_file, ct_content)
|
||||
mw.execShell('chmod 777 ' + commit_file)
|
||||
|
||||
return 'ok'
|
||||
|
||||
|
||||
def projectScriptUnload():
|
||||
args = getArgs()
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
|
||||
post_commit_file = getServerDir() + '/data/repositories/' + '/' + \
|
||||
args['pname'] + '/hooks/post-commit'
|
||||
mw.execShell('rm -f ' + post_commit_file)
|
||||
|
||||
commit_file = getServerDir() + '/data/repositories/' + '/' + \
|
||||
args['pname'] + '/hooks/commit'
|
||||
mw.execShell('rm -f ' + commit_file)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def projectScriptEdit():
|
||||
args = getArgs()
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
|
||||
data = {}
|
||||
commit_file = getServerDir() + '/data/repositories/' + \
|
||||
args['pname'] + '/hooks/commit'
|
||||
if os.path.exists(commit_file):
|
||||
data['status'] = True
|
||||
data['path'] = commit_file
|
||||
else:
|
||||
data['status'] = False
|
||||
data['msg'] = 'file does not exist'
|
||||
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def projectScriptDebug():
|
||||
args = getArgs()
|
||||
if not 'pname' in args:
|
||||
return 'project name missing'
|
||||
|
||||
data = {}
|
||||
commit_log = getServerDir() + '/data/repositories/' + \
|
||||
args['pname'] + '/sh.log'
|
||||
if os.path.exists(commit_log):
|
||||
data['status'] = True
|
||||
data['path'] = commit_log
|
||||
else:
|
||||
data['status'] = False
|
||||
data['msg'] = 'file does not exist'
|
||||
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getTotalStatistics():
|
||||
st = status()
|
||||
data = {}
|
||||
if st == 'start':
|
||||
svn_path = getServerDir() + '/data/repositories'
|
||||
data['status'] = True
|
||||
data['count'] = len(os.listdir(svn_path))
|
||||
data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
|
||||
return mw.returnJson(True, 'ok', data)
|
||||
else:
|
||||
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 == 'csvn_edit':
|
||||
print(csvnEdit())
|
||||
elif func == 'user_list':
|
||||
print(userList())
|
||||
elif func == 'user_add':
|
||||
print(userAdd())
|
||||
elif func == 'user_del':
|
||||
print(userDel())
|
||||
elif func == 'project_list':
|
||||
print(projectList())
|
||||
elif func == 'project_del':
|
||||
print(projectDel())
|
||||
elif func == 'project_add':
|
||||
print(projectAdd())
|
||||
elif func == 'project_acl_list':
|
||||
print(projectAclList())
|
||||
elif func == 'project_acl_add':
|
||||
print(projectAclAdd())
|
||||
elif func == 'project_acl_del':
|
||||
print(projectAclDel())
|
||||
elif func == 'project_acl_set':
|
||||
print(projectAclSet())
|
||||
elif func == 'project_script_load':
|
||||
print(projectScriptLoad())
|
||||
elif func == 'project_script_unload':
|
||||
print(projectScriptUnload())
|
||||
elif func == 'project_script_edit':
|
||||
print(projectScriptEdit())
|
||||
elif func == 'project_script_debug':
|
||||
print(projectScriptDebug())
|
||||
elif func == 'get_total_statistics':
|
||||
print(getTotalStatistics())
|
||||
else:
|
||||
print('fail')
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
"sort": 7,
|
||||
"ps": "最流行的SVN代码共享管理软件",
|
||||
"shell": "install.sh",
|
||||
"name": "csvn",
|
||||
"title": "CSVN",
|
||||
"versions": "5.1",
|
||||
"updates":"5.1.4",
|
||||
"tip": "soft",
|
||||
"checks": "server/csvn",
|
||||
"path":"server/csvn",
|
||||
"author": "midoks",
|
||||
"date": "2017-04-01",
|
||||
"home": "https://www.collab.net",
|
||||
"type": "SVN代码共享管理软件",
|
||||
"pid": "3"
|
||||
}
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
# https://blog.csdn.net/akipa11/article/details/103455298
|
||||
# https://blog.csdn.net/bbj12345678/article/details/122941395
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
|
||||
sysName=`uname`
|
||||
echo "use system: ${sysName}"
|
||||
|
||||
if [ ${sysName} == "Darwin" ]; then
|
||||
OSNAME='macos'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
|
||||
OSNAME='centos'
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
|
||||
OSNAME='fedora'
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
|
||||
OSNAME='debian'
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
|
||||
OSNAME='ubuntu'
|
||||
elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
|
||||
OSNAME='raspbian'
|
||||
else
|
||||
OSNAME='unknow'
|
||||
fi
|
||||
|
||||
|
||||
CheckJAVA()
|
||||
{
|
||||
which "java" > /dev/null
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo 'java is exist'
|
||||
elif [ "ubuntu" == "$OSNAME" ] || [ "debian" == "$OSNAME" ] ;then
|
||||
echo 'java install...'
|
||||
apt install -y default-jdk
|
||||
|
||||
export JAVA_HOME=/usr/lib/jvm/default-java
|
||||
else
|
||||
echo 'java install...'
|
||||
yum install -y java
|
||||
fi
|
||||
}
|
||||
|
||||
# export JAVA_HOME=/usr/lib/jvm/default-java
|
||||
#JAVA_BIN=/usr/lib/jvm/default-java/bin
|
||||
#JRE_HOME=/usr/lib/jvm/default-java/jre
|
||||
#PATH=$PATH:/usr/lib/jvm/default-java/bin:/usr/lib/jvm/default-java/jre/bin
|
||||
#CLASSPATH=/usr/lib/jvm/default-java/jre/lib:/usr/lib/jvm/default-java/lib:/usr/lib/jvm/default-java/jre/lib/charsets.jar
|
||||
|
||||
|
||||
Install_csvn()
|
||||
{
|
||||
CheckJAVA
|
||||
mkdir -p $serverPath/source
|
||||
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
|
||||
CSVN_SOURCE='https://github.com/midoks/mdserver-web/releases/download/init/CollabNetSubversionEdge-5.1.4_linux-x86_64.tar.xz'
|
||||
|
||||
if [ ! -f $serverPath/source/csvn.tar.xz ];then
|
||||
wget -O $serverPath/source/csvn.tar.xz ${CSVN_SOURCE}
|
||||
fi
|
||||
|
||||
cd $serverPath/source && tar -Jxf $serverPath/source/csvn.tar.xz
|
||||
mv $serverPath/source/csvn $serverPath/csvn
|
||||
echo '5.1' > $serverPath/csvn/version.pl
|
||||
|
||||
|
||||
if id -u csvn > /dev/null 2>&1; then
|
||||
echo "csvn user exists"
|
||||
else
|
||||
groupadd csvn
|
||||
useradd -g csvn csvn
|
||||
cp /etc/sudoers{,.`date +"%Y-%m-%d_%H-%M-%S"`}
|
||||
echo "csvn ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
fi
|
||||
|
||||
chown -R csvn:csvn $serverPath/csvn
|
||||
|
||||
$serverPath/csvn/bin/csvn install
|
||||
$serverPath/csvn/bin/csvn-httpd install
|
||||
|
||||
echo '安装完成' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_csvn()
|
||||
{
|
||||
rm -rf $serverPath/csvn
|
||||
}
|
||||
|
||||
|
||||
action=$1
|
||||
host=$2
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_csvn
|
||||
else
|
||||
Uninstall_csvn
|
||||
fi
|
||||
|
|
@ -1,500 +0,0 @@
|
|||
pluginService('csvn');
|
||||
|
||||
function csvnPost(method,args,callback){
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'csvn', func:method, args:JSON.stringify(args)}, 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 csvnEdit(){
|
||||
|
||||
csvnPost('csvn_edit',{} , function(data){
|
||||
// console.log(data);
|
||||
var rdata = $.parseJSON(data.data);
|
||||
var edit = '<p class="status">通用的手动编辑:</p>';
|
||||
edit +='<div class="sfm-opt">\
|
||||
<button class="btn btn-default btn-sm" onclick="onlineEditFile(0,\''+rdata['svn_access_file']+'\');">权限编辑</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="onlineEditFile(0,\''+rdata['post_commit_tpl']+'\');">post_commit_tpl</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="onlineEditFile(0,\''+rdata['commit_tpl']+'\');">commit_tpl</button>\
|
||||
</div>';
|
||||
$(".soft-man-con").html(edit);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
function csvnUserFind(){
|
||||
var search = $('#csvn_find_user').val();
|
||||
if (search==''){
|
||||
layer.msg('搜索字符不能为空!',{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
csvnUserList(1, search);
|
||||
}
|
||||
|
||||
function csvnUserList(page, search) {
|
||||
|
||||
var _data = {};
|
||||
if (typeof(page) =='undefined'){
|
||||
var page = 1;
|
||||
}
|
||||
|
||||
_data['page'] = page;
|
||||
_data['page_size'] = 10;
|
||||
if(typeof(search) != 'undefined'){
|
||||
_data['search'] = search;
|
||||
}
|
||||
|
||||
csvnPost('user_list', _data, function(data){
|
||||
|
||||
var rdata = $.parseJSON(data.data);
|
||||
// console.log(rdata);
|
||||
content = '<div class="finduser"><input class="bt-input-text mr5 outline_no" type="text" placeholder="查找用户名" id="csvn_find_user" style="height: 28px; border-radius: 3px;width: 505px;">';
|
||||
content += '<button class="btn btn-success btn-sm" onclick="csvnUserFind();">查找</button></div>';
|
||||
|
||||
content += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
|
||||
content += '<thead><tr>';
|
||||
content += '<th>用户名</th>';
|
||||
content += '<th>操作(<a class="btlink" onclick="csvnAddUser();">添加</a>)</th>';
|
||||
content += '</tr></thead>';
|
||||
|
||||
content += '<tbody>';
|
||||
|
||||
ulist = rdata.data;
|
||||
for (i in ulist){
|
||||
content += '<tr><td>'+ulist[i]+'</td><td>'+
|
||||
'<a class="btlink" onclick="csvnDelUser(\''+ulist[i]+'\')">删除</a> | ' +
|
||||
'<a class="btlink" onclick="csvnModPwdUser(\''+ulist[i]+'\')">改密</a></td></tr>';
|
||||
}
|
||||
|
||||
content += '</tbody>';
|
||||
content += '</table></div>';
|
||||
|
||||
page = '<div class="dataTables_paginate paging_bootstrap pagination" style="margin-top:0px;"><ul id="softPage" class="page"><div>';
|
||||
page += rdata.list;
|
||||
page += '</div></ul></div>';
|
||||
|
||||
content += page;
|
||||
|
||||
$(".soft-man-con").html(content);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnDelUser(name){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '删除用户',
|
||||
area: '350px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>你要确认要删除"+ name + "账户?</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='csvn_del_close' class='btn btn-danger btn-sm btn-title'>关闭</button>\
|
||||
<button type='button' id='csvn_del_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#csvn_del_close').click(function(){
|
||||
layer.close(loadOpen);
|
||||
});
|
||||
|
||||
$('#csvn_del_ok').click(function(){
|
||||
_data = {};
|
||||
_data['username'] = name;
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'csvn', func:'user_del', args:JSON.stringify(_data)}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.data !='ok'){
|
||||
layer.msg(data.data,{icon:2,time:2000,shade: [0.3, '#000']});
|
||||
}
|
||||
|
||||
layer.close(loadOpen);
|
||||
layer.msg("删除成功!",{icon:1,time:3000,shade: [0.3, '#000']});
|
||||
|
||||
},'json');
|
||||
});
|
||||
}
|
||||
|
||||
function csvnAddUser(username){
|
||||
|
||||
user_input = ''
|
||||
if (typeof(username) == 'undefined'){
|
||||
user_input = "<div><input class='bt-input-text mr5 outline_no' type='text' id='csvn_username' name='username' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入用户名'></div>";
|
||||
} else {
|
||||
user_input = "<div><input value='"+ username +"' class='bt-input-text mr5 outline_no' type='text' id='csvn_username' name='username' style='height: 28px; border-radius: 3px;width: 200px;' disabled='true'></div>";
|
||||
}
|
||||
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '添加用户',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
"+user_input+"\
|
||||
<div style='padding-top:3px;'><input class='bt-input-text mr5 outline_no' type='text' id='csvn_password' name='password' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入密码'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='csvn_add_close' class='btn btn-danger btn-sm btn-title'>关闭</button>\
|
||||
<button type='button' id='csvn_add_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#csvn_add_close').click(function(){
|
||||
layer.close(loadOpen);
|
||||
});
|
||||
|
||||
$('#csvn_add_ok').click(function(){
|
||||
_data = {};
|
||||
|
||||
_data['username'] = $('#csvn_username').val();
|
||||
_data['password'] = $('#csvn_password').val();
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'csvn', func:'user_add', args:JSON.stringify(_data)}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.data !='ok'){
|
||||
layer.msg(data.data,{icon:2,time:2000,shade: [0.3, '#000']});
|
||||
}
|
||||
|
||||
csvnUserList();
|
||||
layer.close(loadOpen);
|
||||
layer.msg("操作成功!",{icon:1,time:3000,shade: [0.3, '#000']});
|
||||
},'json');
|
||||
});
|
||||
}
|
||||
|
||||
function csvnModPwdUser(name){
|
||||
csvnAddUser(name);
|
||||
}
|
||||
|
||||
function csvnProjectFind(){
|
||||
var search = $('#csvn_project_find').val();
|
||||
if (search == ''){
|
||||
layer.msg('查找字符不能为空!',{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
csvnProjectList(1, search);
|
||||
}
|
||||
|
||||
function csvnProjectList(page, search){
|
||||
var _data = {};
|
||||
_data['page_size'] = 10;
|
||||
if (typeof(search) != 'undefined'){
|
||||
_data['search'] = search;
|
||||
}
|
||||
|
||||
if (typeof(page) != 'undefined'){
|
||||
_data['page'] = page;
|
||||
setCookie('csvnProjectListPage',page);
|
||||
} else {
|
||||
_data['page'] = 1;
|
||||
cookie_page = getCookie('csvnProjectListPage')
|
||||
if (cookie_page >0){
|
||||
_data['page'] = cookie_page;
|
||||
}
|
||||
}
|
||||
|
||||
csvnPost('project_list', _data, function(data){
|
||||
|
||||
var rdata = $.parseJSON($.trim(data.data));
|
||||
var csvn_mg = project_url = 'http://' +rdata['ip'] +(rdata['csvn_port'] == '80' ? '': ':'+rdata['csvn_port']);
|
||||
|
||||
content = '<div><input class="bt-input-text mr5" type="text" placeholder="查找项目" id="csvn_project_find" style="height: 28px; border-radius: 3px;width: 505px;">';
|
||||
content += '<button class="btn btn-success btn-sm" onclick="csvnProjectFind();">查找</button></div>';
|
||||
|
||||
content += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
|
||||
content += '<thead><tr>';
|
||||
content += '<th>项目名</th>';
|
||||
content += '<th>地址</th>';
|
||||
content += '<th>操作(<a class="btlink" onclick="csvnAddProject();">添加</a>) | <a class="btlink" target="_blank" href="'+csvn_mg+'">后台管理</a> </th>';
|
||||
content += '</tr></thead>';
|
||||
content += '<tbody>';
|
||||
|
||||
// console.log(rdata);
|
||||
ulist = rdata.data;
|
||||
for (i in ulist){
|
||||
var project_url = 'http://' +rdata['ip'] +(rdata['port'] == '80' ? '': ':'+rdata['port'])+ '/svn/'+ulist[i]['name'];
|
||||
var code_url = 'http://' +rdata['ip'] +(rdata['port'] == '80' ? '': ':'+rdata['port'])+ '/viewvc/'+ulist[i]['name'];
|
||||
content += '<tr><td>'+ulist[i]['name']+'</td>'+
|
||||
'<td>'+project_url+'</td><td>'+
|
||||
'<a class="btlink" onclick="csvnDelProject(\''+ulist[i]['name']+'\')">删除</a> | ' +
|
||||
'<a class="btlink" onclick="csvnAclProject(\''+ulist[i]['name']+'\')">权限</a> | ' +
|
||||
'<a class="btlink" target="_blank" href="' + code_url +'">源码</a> | ' +
|
||||
'<a class="btlink" onclick="csvnProjectScript(\''+ulist[i]['name']+'\','+ ulist[i]['has_hook']+')">脚本</a>' +
|
||||
'</td></tr>';
|
||||
}
|
||||
|
||||
content += '</tbody>';
|
||||
content += '</table></div>';
|
||||
|
||||
page = '<div class="dataTables_paginate paging_bootstrap pagination" style="margin-top:0px;"><ul id="softPage" class="page"><div>';
|
||||
page += rdata.list;
|
||||
page += '</div></ul></div>';
|
||||
|
||||
content += page;
|
||||
$(".soft-man-con").html(content);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnDelProject(name){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '删除用户',
|
||||
area: '350px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>你要确认要删除"+ name + "账户?</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='csvn_del_close' class='btn btn-danger btn-sm btn-title'>关闭</button>\
|
||||
<button type='button' id='csvn_del_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#csvn_del_close').click(function(){
|
||||
layer.close(loadOpen);
|
||||
});
|
||||
|
||||
$('#csvn_del_ok').click(function(){
|
||||
var _data = {};
|
||||
_data['name'] = name;
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'csvn', func:'project_del', args:JSON.stringify(_data)}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.data !='ok'){
|
||||
layer.msg(data.data,{icon:2,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
csvnProjectList();
|
||||
layer.close(loadOpen);
|
||||
layer.msg("删除成功!",{icon:1,time:3000,shade: [0.3, '#000']});
|
||||
},'json');
|
||||
});
|
||||
}
|
||||
|
||||
function csvnAddProject(){
|
||||
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '添加项目',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='csvn_name' name='username' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入项目名'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='csvn_project_close' class='btn btn-danger btn-sm btn-title'>关闭</button>\
|
||||
<button type='button' id='csvn_project_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#csvn_project_close').click(function(){
|
||||
layer.close(loadOpen);
|
||||
});
|
||||
|
||||
$('#csvn_project_ok').click(function(){
|
||||
var _data = {};
|
||||
_data['name'] = $('#csvn_name').val();
|
||||
|
||||
csvnPost('project_add', _data, function(data){
|
||||
|
||||
if (data.data !='ok'){
|
||||
layer.msg(data.data,{icon:2,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
csvnProjectList();
|
||||
layer.close(loadOpen);
|
||||
layer.msg("操作成功!",{icon:1,time:3000,shade: [0.3, '#000']});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function csvnProjectScript(pname, has_hook){
|
||||
|
||||
var html = '';
|
||||
if (has_hook){
|
||||
html += '<button onclick="csvnProjectScriptEdit(\''+pname+'\')" class="btn btn-default btn-sm">手动编辑</button>';
|
||||
html += '<button onclick="csvnProjectScriptDebug(\''+pname+'\')" class="btn btn-default btn-sm">调试日志</button>';
|
||||
html += '<button onclick="csvnProjectScriptLoad(\''+pname+'\')" class="btn btn-default btn-sm">重新加载</button>';
|
||||
html += '<button onclick="csvnProjectScriptUnload(\''+pname+'\')" class="btn btn-default btn-sm">卸载脚本</button>';
|
||||
} else {
|
||||
html += '<button onclick="csvnProjectScriptLoad(\''+pname+'\')" class="btn btn-default btn-sm">加载脚本</button>';
|
||||
}
|
||||
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '脚本设置',
|
||||
area: '240px',
|
||||
content:'<div class="change-default pd20">'+html+'</div>'
|
||||
});
|
||||
}
|
||||
|
||||
function csvnProjectScriptLoad(pname){
|
||||
csvnPost('project_script_load', {'pname':pname}, function(data){
|
||||
if (data.data != 'ok'){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
layer.msg('加载成功!',{icon:1,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){
|
||||
csvnProjectList();
|
||||
},2000);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnProjectScriptUnload(pname){
|
||||
csvnPost('project_script_unload', {'pname':pname}, function(data){
|
||||
if (data.data != 'ok'){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
layer.msg('卸载成功!',{icon:1,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){
|
||||
csvnProjectList();
|
||||
},2000);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnProjectScriptEdit(pname){
|
||||
csvnPost('project_script_edit', {'pname':pname}, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
if (rdata['status']){
|
||||
onlineEditFile(0, rdata['path']);
|
||||
csvnProjectList();
|
||||
} else {
|
||||
layer.msg(rdata.msg,{icon:1,time:2000,shade: [0.3, '#000']});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function csvnProjectScriptDebug(pname){
|
||||
csvnPost('project_script_debug', {'pname':pname}, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
if (rdata['status']){
|
||||
onlineEditFile(0, rdata['path']);
|
||||
csvnProjectList();
|
||||
} else {
|
||||
layer.msg(rdata.msg,{icon:1,time:2000,shade: [0.3, '#000']});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function csvnAclAdd(pname){
|
||||
var uname = $('#csvn_username').val();
|
||||
if (uname == ''){
|
||||
layer.msg('添加用户名不能为空!',{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
csvnPost('project_acl_add', {'pname':pname,'uname':uname}, function(data){
|
||||
if (data.data != 'ok'){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
$('.layui-layer-close1').click();
|
||||
csvnAclProject(pname);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnAclDel(pname, uname){
|
||||
csvnPost('project_acl_del', {'pname':pname,'uname':uname}, function(data){
|
||||
if (data.data != 'ok'){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
$('.layui-layer-close1').click();
|
||||
csvnAclProject(pname);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnAclSet(obj, pname, uname, acl, selected){
|
||||
|
||||
if (selected){
|
||||
$(obj).prop('checked',true);
|
||||
layer.msg('权限没有变化!',{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
csvnPost('project_acl_set', {'pname':pname,'uname':uname, 'acl':acl}, function(data){
|
||||
if (data.data != 'ok'){
|
||||
layer.msg(data.data,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
$('.layui-layer-close1').click();
|
||||
csvnAclProject(pname);
|
||||
});
|
||||
}
|
||||
|
||||
function csvnAclProject(pname){
|
||||
csvnPost('project_acl_list', {'name':pname}, function(data){
|
||||
|
||||
var rdata = [];
|
||||
try {
|
||||
rdata = $.parseJSON(data.data);
|
||||
} catch(e){}
|
||||
|
||||
var list = '';
|
||||
for (i in rdata) {
|
||||
var user = rdata[i]['user'];
|
||||
var acl = '';
|
||||
if (rdata[i]['acl'] == 'r'){
|
||||
acl += '<input type="checkbox" onclick="csvnAclSet(this,\''+pname+'\',\''+user+'\',\'r\',true)" checked="true"> 只读 | <input type="checkbox" onclick="csvnAclSet(this,\''+pname+'\',\''+user+'\',\'rw\', false)"> 读写';
|
||||
} else {
|
||||
acl += '<input type="checkbox" onclick="csvnAclSet(this,\''+pname+'\',\''+user+'\',\'r\',false)"> 只读 | <input type="checkbox" onclick="csvnAclSet(this,\''+pname+'\',\''+user+'\',\'rw\',true)" checked="true"> 读写';
|
||||
}
|
||||
|
||||
list += '<tr><td>'+user+'</td><td>' + acl +'</td>'+
|
||||
'<td><a class="btlink" onclick="csvnAclDel(\''+pname+'\',\''+user+'\')">删除</a></td>'+'</tr>';
|
||||
}
|
||||
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '项目('+pname+')权限设置',
|
||||
area: '300px',
|
||||
content:"<div class='bt-form pd20 c6'>\
|
||||
<div>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='csvn_username' name='username' style='height: 28px; border-radius: 3px;width: 205px;' placeholder='用户名'>\
|
||||
<button class='btn btn-success btn-sm' onclick='csvnAclAdd(\""+pname+"\");'>添加</button></div>\
|
||||
<div class='divtable' style='margin-top:5px;'><table class='table table-hover'><thead><tr><th>用户</th><th>权限</th><th>操作</th></tr></thead>\
|
||||
<tbody>"+list+"</tbody>\
|
||||
</table></div>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
});
|
||||
}
|
||||
Loading…
Reference in New Issue