Merge pull request #701 from midoks/dev

解决ufw识别问题
pull/710/head
Mr Chen 3 months ago committed by GitHub
commit de0248d59a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      plugins/clean/index.py
  2. 39
      plugins/lam/conf/config.cfg
  3. 38
      plugins/lam/conf/lam.conf
  4. BIN
      plugins/lam/ico.png
  5. 24
      plugins/lam/index.html
  6. 476
      plugins/lam/index.py
  7. 15
      plugins/lam/info.json
  8. 90
      plugins/lam/install.sh
  9. 164
      plugins/lam/js/lam.js
  10. 4
      plugins/ldap/config/ldap.conf
  11. 18
      plugins/ldap/index.py
  12. 1
      plugins/ldap/info.json
  13. 4
      plugins/ldap/install.sh
  14. 44
      plugins/ldap/install_debian.sh
  15. 6
      plugins/php-apt/index.py
  16. 42
      plugins/php-apt/versions/phplib.conf
  17. 5
      plugins/phpldapadmin/conf/config.php
  18. 54
      plugins/phpldapadmin/index.py
  19. 5
      plugins/phpmyadmin/index.py
  20. 5
      plugins/tgbot/startup/extend/push_ad.py
  21. 5
      plugins/tgbot/startup/extend/push_notice_msg.py
  22. 3
      scripts/install/ubuntu.sh
  23. 2
      web/templates/default/login.html
  24. 4
      web/utils/firewall.py

@ -242,7 +242,7 @@ def cleanDirLog(path):
def cleanRun():
plugin_dir = getPluginDir()
log_file = getServerDir()+'/clean.log'
cmd = 'python3 '+plugin_dir+'/index.py clean > '+log_file
cmd = 'cd '+mw.getPanelDir()+' && python3 '+plugin_dir+'/index.py clean > '+log_file
os.system(cmd)
return mw.returnJson(True, '执行成功!')

@ -0,0 +1,39 @@
{
"password": "{CRYPT-SHA512}$6$WheNHdlVwDoL4s.x$DrZ10TpIGQa5wd0jbvtm8eaTleJCf1nec3ihOaNwMdPUKVFCphXwtnTSmFFXjhGa45RlrSEWhDVyjLCMiV\/.c. V2hlTkhkbFZ3RG9MNHMueA==",
"default": "lam",
"sessionTimeout": "30",
"hideLoginErrorDetails": "false",
"logLevel": "4",
"logDestination": "SYSLOG",
"allowedHosts": "",
"passwordMinLength": "10",
"passwordMinUpper": "0",
"passwordMinLower": "0",
"passwordMinNumeric": "0",
"passwordMinClasses": "0",
"passwordMinSymbol": "0",
"checkedRulesCount": "-1",
"passwordMustNotContainUser": "false",
"passwordMustNotContain3Chars": "false",
"externalPwdCheckUrl": "",
"errorReporting": "default",
"allowedHostsSelfService": "",
"license": "",
"licenseEmailFrom": "",
"licenseEmailTo": "",
"licenseWarningType": "all",
"licenseEmailDateSent": "",
"mailServer": "",
"mailUser": "",
"mailPassword": "",
"mailEncryption": "TLS",
"mailAttribute": "mail",
"mailBackupAttribute": "passwordselfresetbackupmail",
"configDatabaseType": "files",
"configDatabaseServer": "",
"configDatabasePort": "",
"configDatabaseName": "",
"configDatabaseUser": "",
"configDatabasePassword": "",
"moduleSettings": "eyJyZXF1ZXN0QWNjZXNzIjp7Imhpc3RvcnlSZXRlbnRpb25QZXJpb2QiOiIzNjUwIiwiZXhwaXJhdGlvblBlcmlvZCI6IjMwIn19"
}

@ -0,0 +1,38 @@
server
{
listen 888;
server_name 127.0.0.1;
index index.html index.htm index.php;
root {$SERVER_PATH}/lam;
#error_page 404 /404.html;
include {$PHP_CONF_PATH}/enable-php-{$PHP_VER}.conf;
#AUTH_START
auth_basic "Authorization";
auth_basic_user_file {$SERVER_PATH}/lam/pma.pass;
#AUTH_END
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.*\.(log|pass|json|pl)$ {
deny all;
}
location ~ /\.
{
deny all;
}
access_log {$SERVER_PATH}/lam/access.log;
error_log {$SERVER_PATH}/lam/error.log;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@ -0,0 +1,24 @@
<div class="bt-form">
<div class="bt-w-main">
<div class="bt-w-menu">
<p class="bgw" onclick="pluginService('lam');">服务</p>
<p onclick="pluginConfig('lam');">重写模版</p>
<p onclick="homePage()">主页</p>
<p onclick="phpVer(56)">PHP版本</p>
<p onclick="safeConf();">安全设置</p>
<p onclick="pluginLogs('lam','','access_log');">访问日志</p>
<p onclick="pluginLogs('lam','','error_log');">错误日志</p>
<p onclick="pluginConfig('lam','','config_inc');" title="config.inc.php">配置</p>
</div>
<div class="bt-w-con pd15">
<div class="soft-man-con"></div>
</div>
</div>
</div>
<script type="text/javascript">
resetPluginWinHeight(500);
$.getScript( "/plugins/file?name=lam&f=js/lam.js", function(){
pluginService('lam');
});
</script>

@ -0,0 +1,476 @@
# coding:utf-8
import sys
import io
import os
import time
import re
import json
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
import thisdb
from utils.site import sites as MwSites
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'lam'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + 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, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
return (True, mw.returnJson(True, 'ok'))
def getConf():
return mw.getServerDir() + '/web_conf/nginx/vhost/lam.conf'
def getConfInc():
return getServerDir() + "/" + getCfg()['path'] + '/config/config.cfg'
def getPort():
file = getConf()
content = mw.readFile(file)
rep = r'listen\s*(.*);'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getHomePage():
try:
port = getPort()
ip = '127.0.0.1'
if not mw.isAppleSystem():
ip = mw.getLocalIp()
cfg = getCfg()
auth = cfg['username']+':'+cfg['password']
rand_path = cfg['path']
url = 'http://' + auth + '@' + ip + ':' + port + '/' + rand_path + '/templates/login.php'
return mw.returnJson(True, 'OK', url)
except Exception as e:
return mw.returnJson(False, '插件未启动!')
def getPhpVer(expect=83):
php_vers = MwSites.instance().getPhpVersion()
v = php_vers['data']
is_find = False
for i in range(len(v)):
t = str(v[i]['version'])
if (t == expect):
is_find = True
return str(t)
expect_str = str(expect)
new_ex = expect_str[0:1]+"."+expect_str[1:2]
if t.find(new_ex) > -1:
is_find = True
return str(t)
if not is_find:
if len(v) > 1:
return v[1]['version']
return v[0]['version']
return str(expect)
def getCachePhpVer():
cacheFile = getServerDir() + '/php.pl'
v = ''
if os.path.exists(cacheFile):
v = mw.readFile(cacheFile)
else:
v = getPhpVer()
mw.writeFile(cacheFile, v)
return v
def contentReplace(content):
service_path = mw.getServerDir()
php_ver = getCachePhpVer()
tmp = mw.execShell('cat /dev/urandom | head -n 32 | md5sum | head -c 16')
blowfish_secret = tmp[0].strip()
# print php_ver
php_conf_dir = mw.getServerDir() + '/web_conf/php/conf'
content = content.replace('{$ROOT_PATH}', mw.getFatherDir())
content = content.replace('{$SERVER_PATH}', service_path)
content = content.replace('{$PHP_CONF_PATH}', php_conf_dir)
content = content.replace('{$PHP_VER}', php_ver)
content = content.replace('{$BLOWFISH_SECRET}', blowfish_secret)
cfg = getCfg()
content = content.replace('{$PMA_PATH}', cfg['path'])
port = cfg["port"]
rep = r'listen\s*(.*);'
content = re.sub(rep, "listen " + port + ';', content)
return content
def initCfg():
cfg = getServerDir() + "/cfg.json"
if not os.path.exists(cfg):
data = {}
data['port'] = '987'
data['path'] = ''
data['username'] = 'admin'
data['password'] = 'admin'
mw.writeFile(cfg, json.dumps(data))
def setCfg(key, val):
cfg = getServerDir() + "/cfg.json"
data = mw.readFile(cfg)
data = json.loads(data)
data[key] = val
mw.writeFile(cfg, json.dumps(data))
def getCfg():
cfg = getServerDir() + "/cfg.json"
data = mw.readFile(cfg)
data = json.loads(data)
return data
def returnCfg():
cfg = getServerDir() + "/cfg.json"
data = mw.readFile(cfg)
return data
def status():
conf = getConf()
conf_inc = getServerDir() + "/" + getCfg()["path"] + '/config/config.cfg'
# 两个文件都在,才算启动成功
if os.path.exists(conf) and os.path.exists(conf_inc):
return 'start'
return 'stop'
def __release_port(port):
from collections import namedtuple
try:
from utils.firewall import Firewall as MwFirewall
MwFirewall.instance().addAcceptPort(port, 'LAM默认端口', 'port')
return port
except Exception as e:
return "Release failed {}".format(e)
def __delete_port(port):
from collections import namedtuple
try:
from utils.firewall import Firewall as MwFirewall
MwFirewall.instance().delAcceptPortCmd(port, 'tcp')
return port
except Exception as e:
return "Release failed {}".format(e)
def openPort():
conf = getCfg()
port = conf['port']
for i in [port]:
__release_port(i)
return True
def delPort():
conf = getCfg()
port = conf['port']
for i in [port]:
__delete_port(i)
return True
def start():
initCfg()
openPort()
pma_dir = getServerDir() + "/lam"
if os.path.exists(pma_dir):
rand_str = mw.getRandomString(6)
rand_str = rand_str.lower()
pma_dir_dst = pma_dir + "_" + rand_str
mw.execShell("mv " + pma_dir + " " + pma_dir_dst)
mw.execShell("chown -R www:www " + pma_dir_dst)
mw.execShell("chmod -R 777 " + pma_dir_dst+'/sess')
mw.execShell("chmod -R 777 " + pma_dir_dst+'/tmp')
setCfg('path', 'lam_' + rand_str)
file_tpl = getPluginDir() + '/conf/lam.conf'
file_run = getConf()
if not os.path.exists(file_run):
centent = mw.readFile(file_tpl)
centent = contentReplace(centent)
mw.writeFile(file_run, centent)
pma_path = getServerDir() + '/pma.pass'
if not os.path.exists(pma_path):
username = mw.getRandomString(8)
password = mw.getRandomString(10)
pass_cmd = username + ':' + mw.hasPwd(password)
setCfg('username', username)
setCfg('password', password)
mw.writeFile(pma_path, pass_cmd)
tmp = getServerDir() + "/" + getCfg()["path"] + '/tmp'
if not os.path.exists(tmp):
os.mkdir(tmp)
mw.execShell("chown -R www:www " + tmp)
conf_run = getServerDir() + "/" + getCfg()["path"] + '/config/config.cfg'
if not os.path.exists(conf_run):
conf_tpl = getPluginDir() + '/conf/config.cfg'
centent = mw.readFile(conf_tpl)
centent = contentReplace(centent)
mw.writeFile(conf_run, centent)
log_a = accessLog()
log_e = errorLog()
for i in [log_a, log_e]:
if os.path.exists(i):
cmd = "echo '' > " + i
mw.execShell(cmd)
mw.restartWeb()
return 'ok'
def stop():
conf = getConf()
if os.path.exists(conf):
os.remove(conf)
delPort()
mw.restartWeb()
return 'ok'
def restart():
return start()
def reload():
file_tpl = getPluginDir() + '/conf/lam.conf'
file_run = getConf()
if os.path.exists(file_run):
centent = mw.readFile(file_tpl)
centent = contentReplace(centent)
mw.writeFile(file_run, centent)
return start()
def setPhpVer():
args = getArgs()
if not 'phpver' in args:
return 'phpver missing'
cacheFile = getServerDir() + '/php.pl'
mw.writeFile(cacheFile, args['phpver'])
file_tpl = getPluginDir() + '/conf/lam.conf'
file_run = getConf()
content = mw.readFile(file_tpl)
content = contentReplace(content)
mw.writeFile(file_run, content)
mw.restartWeb()
return 'ok'
def getSetPhpVer():
cacheFile = getServerDir() + '/php.pl'
if os.path.exists(cacheFile):
return mw.readFile(cacheFile).strip()
return ''
def getPmaOption():
data = getCfg()
return mw.returnJson(True, 'ok', data)
def getPmaPort():
try:
port = getPort()
return mw.returnJson(True, 'OK', port)
except Exception as e:
# print(e)
return mw.returnJson(False, '插件未启动!')
def setPmaPort():
args = getArgs()
data = checkArgs(args, ['port'])
if not data[0]:
return data[1]
port = args['port']
if port == '80':
return mw.returnJson(False, '80端不能使用!')
file = getConf()
if not os.path.exists(file):
return mw.returnJson(False, '插件未启动!')
content = mw.readFile(file)
rep = r'listen\s*(.*);'
content = re.sub(rep, "listen " + port + ';', content)
mw.writeFile(file, content)
setCfg("port", port)
mw.restartWeb()
return mw.returnJson(True, '修改成功!')
def setPmaUsername():
args = getArgs()
data = checkArgs(args, ['username'])
if not data[0]:
return data[1]
username = args['username']
setCfg('username', username)
cfg = getCfg()
pma_path = getServerDir() + '/pma.pass'
username = mw.getRandomString(10)
pass_cmd = cfg['username'] + ':' + mw.hasPwd(cfg['password'])
mw.writeFile(pma_path, pass_cmd)
mw.restartWeb()
return mw.returnJson(True, '修改成功!')
def setPmaPassword():
args = getArgs()
data = checkArgs(args, ['password'])
if not data[0]:
return data[1]
password = args['password']
setCfg('password', password)
cfg = getCfg()
pma_path = getServerDir() + '/pma.pass'
username = mw.getRandomString(10)
pass_cmd = cfg['username'] + ':' + mw.hasPwd(cfg['password'])
mw.writeFile(pma_path, pass_cmd)
mw.restartWeb()
return mw.returnJson(True, '修改成功!')
def setPmaPath():
args = getArgs()
data = checkArgs(args, ['path'])
if not data[0]:
return data[1]
path = args['path']
if len(path) < 5:
return mw.returnJson(False, '不能小于5位!')
old_path = getServerDir() + "/" + getCfg()['path']
new_path = getServerDir() + "/" + path
mw.execShell("mv " + old_path + " " + new_path)
setCfg('path', path)
return mw.returnJson(True, '修改成功!')
def accessLog():
return getServerDir() + '/access.log'
def errorLog():
return getServerDir() + '/error.log'
def installVersion():
return mw.readFile(getServerDir() + '/version.pl')
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 == 'conf':
print(getConf())
elif func == 'version':
print(installVersion())
elif func == 'get_cfg':
print(returnCfg())
elif func == 'config_inc':
print(getConfInc())
elif func == 'get_home_page':
print(getHomePage())
elif func == 'set_php_ver':
print(setPhpVer())
elif func == 'get_set_php_ver':
print(getSetPhpVer())
elif func == 'get_pma_port':
print(getPmaPort())
elif func == 'set_pma_port':
print(setPmaPort())
elif func == 'get_pma_option':
print(getPmaOption())
elif func == 'set_pma_username':
print(setPmaUsername())
elif func == 'set_pma_password':
print(setPmaPassword())
elif func == 'set_pma_path':
print(setPmaPath())
elif func == 'access_log':
print(accessLog())
elif func == 'error_log':
print(errorLog())
else:
print('error')

@ -0,0 +1,15 @@
{
"title":"LAM",
"tip":"soft",
"name":"lam",
"type":"运行环境",
"ps":"LDAP管理工具(LAM)",
"versions":["9.0"],
"shell":"install.sh",
"checks":"server/lam",
"path": "server/lam",
"author":"gruberroland",
"home":"https://github.com/LDAPAccountManager",
"date":"2025-1-28",
"pid": "2"
}

@ -0,0 +1,90 @@
#!/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")
# cd /www/server/mdserver-web/plugins/lam && bash install.sh install 9.0
# cd /www/server/mdserver-web && python3 plugins/lam/index.py start
if [ -f ${rootPath}/bin/activate ];then
source ${rootPath}/bin/activate
fi
if [ "$sys_os" == "Darwin" ];then
BAK='_bak'
else
BAK=''
fi
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
Install_App()
{
if [ -d $serverPath/lam ];then
exit 0
fi
mkdir -p ${serverPath}/lam
mkdir -p ${serverPath}/source/lam
echo "${1}" > ${serverPath}/lam/version.pl
VER=$1
# https://github.com/LDAPAccountManager/lam/releases/download/9.0/ldap-account-manager-9.0.tar.bz2
FDIR=ldap-account-manager-${VER}
FILE=ldap-account-manager-${VER}.tar.bz2
DOWNLOAD=https://github.com/LDAPAccountManager/lam/releases/download/9.0/${FILE}
if [ ! -f $serverPath/source/phpmyadmin/$FILE ];then
wget --no-check-certificate -O $serverPath/source/lam/$FILE $DOWNLOAD
fi
if [ ! -d $serverPath/source/lam/$FDIR ];then
cd $serverPath/source/lam && tar jxvf $FILE
fi
cp -r $serverPath/source/lam/$FDIR $serverPath/lam/
cd $serverPath/lam/ && mv $FDIR lam
# rm -rf $serverPath/source/lam/$FDIR
cd ${rootPath} && python3 ${rootPath}/plugins/lam/index.py start
echo '安装完成'
}
Uninstall_App()
{
cd ${rootPath} && python3 ${rootPath}/plugins/lam/index.py stop
rm -rf ${serverPath}/lam
echo '卸载完成'
}
action=$1
if [ "${1}" == 'install' ];then
Install_App $2
else
Uninstall_App $2
fi

@ -0,0 +1,164 @@
function str2Obj(str){
var data = {};
kv = str.split('&');
for(i in kv){
v = kv[i].split('=');
data[v[0]] = v[1];
}
return data;
}
function pmaPost(method,args,callback){
var _args = null;
if (typeof(args) == 'string'){
_args = JSON.stringify(str2Obj(args));
} else {
_args = JSON.stringify(args);
}
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'lam', func:method, args:_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 pmaAsyncPost(method,args){
var _args = null;
if (typeof(args) == 'string'){
_args = JSON.stringify(str2Obj(args));
} else {
_args = JSON.stringify(args);
}
return syncPost('/plugins/run', {name:'lam', func:method, args:_args});
}
function homePage(){
pmaPost('get_home_page', '', function(data){
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
var con = '<button class="btn btn-default btn-sm" onclick="window.open(\'' + rdata.data + '\')">主页</button>';
$(".soft-man-con").html(con);
});
}
//phpmyadmin切换php版本
function phpVer(version) {
var _version = pmaAsyncPost('get_set_php_ver','')
if (_version['data'] != ''){
version = _version['data'];
}
$.post('/site/get_php_version', function(data) {
var rdata = data['data'];
// console.log(rdata);
var body = "<div class='ver line'><span class='tname'>PHP版本</span><select id='phpver' class='bt-input-text mr20' name='phpVersion' style='width:110px'>";
var optionSelect = '';
for (var i = 0; i < rdata.length; i++) {
optionSelect = rdata[i].version == version ? 'selected' : '';
body += "<option value='" + rdata[i].version + "' " + optionSelect + ">" + rdata[i].name + "</option>"
}
body += '</select><button class="btn btn-success btn-sm" onclick="phpVerChange(\'phpversion\',\'get\')">保存</button></div>';
$(".soft-man-con").html(body);
},'json');
}
function phpVerChange(type, msg) {
var phpver = $("#phpver").val();
pmaPost('set_php_ver', 'phpver='+phpver, function(data){
if ( data.data == 'ok' ){
layer.msg('设置成功!',{icon:1,time:2000,shade: [0.3, '#000']});
} else {
layer.msg('设置失败!',{icon:2,time:2000,shade: [0.3, '#000']});
}
});
}
//phpmyadmin安全设置
function safeConf() {
pmaPost('get_pma_option', {}, function(rdata){
var rdata = $.parseJSON(rdata.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,time:2000,shade: [0.3, '#000']});
return;
}
var cfg = rdata.data;
var con = '<div class="ver line">\
<span class="tname">访问端口</span>\
<input style="width:110px" class="bt-input-text phpmyadmindk mr20" name="Name" id="pmport" value="' + cfg['port'] + '" placeholder="phpmyadmin访问端口" maxlength="5" type="number">\
<button class="btn btn-success btn-sm" onclick="setPamPort()">保存</button>\
</div>\
<div class="ver line">\
<span class="tname">用户名</span>\
<input style="width:110px" class="bt-input-text mr20" name="username" id="pmport" value="' + cfg['username'] + '" placeholder="认证用户名" type="text">\
<button class="btn btn-success btn-sm" onclick="setPmaUsername()">保存</button>\
</div>\
<div class="ver line">\
<span class="tname">密码</span>\
<input style="width:110px" class="bt-input-text mr20" name="password" id="pmport" value="' + cfg['password'] + '" placeholder="密码" type="text">\
<button class="btn btn-success btn-sm" onclick="setPmaPassword()">保存</button>\
</div>\
<hr/>\
<div class="ver line">\
<span class="tname">路径名</span>\
<input style="width:180px" class="bt-input-text mr20" name="path" id="pmport" value="' + cfg['path'] + '" placeholder="" type="text">\
<button class="btn btn-success btn-sm" onclick="setPmaPath()">保存</button>\
</div>';
$(".soft-man-con").html(con);
});
}
function setPmaUsername(){
var username = $("input[name=username]").val();
pmaPost('set_pma_username',{'username':username}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function setPmaPassword(){
var password = $("input[name=password]").val();
pmaPost('set_pma_password',{'password':password}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function setPmaPath(){
var path = $("input[name=path]").val();
pmaPost('set_pma_path',{'path':path}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
//修改phpmyadmin端口
function setPamPort() {
var pmport = $("#pmport").val();
if (pmport < 80 || pmport > 65535) {
layer.msg('端口范围不合法!', { icon: 2 });
return;
}
var data = 'port=' + pmport;
pmaPost('set_pma_port',data, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}

@ -5,8 +5,8 @@
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
BASE dc=mw,dc=com
URI ldap://{$IP} ldap://{$IP}:666
#SIZELIMIT 12
#TIMELIMIT 15

@ -48,7 +48,7 @@ def getConf():
def getConfTpl():
path = getPluginDir() + "/config/redis.conf"
path = getPluginDir() + "/config/ldap.conf"
return path
@ -128,6 +128,13 @@ def contentReplace(content):
def initDreplace():
service_path = mw.getServerDir()
conf = getConf()
conf_tpl = getConfTpl()
if not os.path.exists(conf):
content = mw.readFile(conf_tpl)
content = contentReplace(content)
mw.writeFile(conf, content)
return True
@ -302,6 +309,13 @@ def submitRedisConf():
reload()
return mw.returnJson(True, '设置成功')
def installPreInspection():
slapd_path = '/etc/ldap/slapd.d'
if not os.path.exists(slapd_path):
return "需要手动执行:apt install -y slapd ldap-utils"
return 'ok'
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
@ -320,6 +334,8 @@ if __name__ == "__main__":
print(initdInstall())
elif func == 'initd_uninstall':
print(initdUinstall())
elif func == 'install_pre_inspection':
print(installPreInspection())
elif func == 'run_info':
print(runInfo())
elif func == 'conf':

@ -6,6 +6,7 @@
"shell": "install.sh",
"versions":["1.0"],
"tip": "soft",
"install_pre_inspection":true,
"checks": "server/ldap",
"path": "server/ldap",
"display": 1,

@ -14,6 +14,8 @@ VERSION=$2
# https://juejin.cn/post/7309323953683480588
# dpkg-reconfigure slapd
# 该命令将在本地服务器上查找并返回在 “dc=bytedance,dc=local” 这个起点(和其下的所有子目录)下,所有 cn 属性有值的条目的详细信息
# ldapsearch -x -H ldap://localhost -b "dc=bytedance,dc=local" "(cn=*)"
@ -29,7 +31,9 @@ Install_App()
Uninstall_App()
{
apt remove -y slapd ldap-utils
rm -rf $serverPath/ldap/version.pl
rm -rf $serverPath/ldap
echo "卸载ldap成功"
}

@ -0,0 +1,44 @@
#!/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")
sysName=`uname`
sysArch=`arch`
VERSION=$2
# https://juejin.cn/post/7309323953683480588
# dpkg-reconfigure slapd
# slappasswd 修改密码
# 该命令将在本地服务器上查找并返回在 “dc=bytedance,dc=local” 这个起点(和其下的所有子目录)下,所有 cn 属性有值的条目的详细信息
# ldapsearch -x -H ldap://localhost -b "dc=bytedance,dc=local" "(cn=*)"
Install_App()
{
echo '正在安装脚本文件...'
apt install -y slapd ldap-utils
mkdir -p $serverPath/ldap
echo "${VERSION}" > $serverPath/ldap/version.pl
echo "${VERSION}安装完成"
}
Uninstall_App()
{
rm -rf $serverPath/ldap/version.pl
echo "卸载ldap成功"
}
action=$1
if [ "${1}" == 'install' ];then
Install_App
else
Uninstall_App
fi

@ -464,12 +464,10 @@ def setFpmConfig(version):
conf = re.sub(rep, "\npm.start_servers = " + start_servers, conf)
rep = r"\s*pm.min_spare_servers\s*=\s*([0-9]+)\s*"
conf = re.sub(rep, "\npm.min_spare_servers = " +
min_spare_servers, conf)
conf = re.sub(rep, "\npm.min_spare_servers = " + min_spare_servers, conf)
rep = r"\s*pm.max_spare_servers \s*=\s*([0-9]+)\s*"
conf = re.sub(rep, "\npm.max_spare_servers = " +
max_spare_servers + "\n", conf)
conf = re.sub(rep, "\npm.max_spare_servers = " + max_spare_servers + "\n", conf)
rep = r"\s*pm\s*=\s*(\w+)\s*"
conf = re.sub(rep, "\npm = " + pm + "\n", conf)

@ -198,6 +198,48 @@
"shell": "mcrypt.sh",
"check": "mcrypt"
},
{
"name": "ldap",
"versions": [
"55",
"56",
"70",
"71",
"72",
"73",
"74",
"80",
"81",
"82",
"83",
"84"
],
"type": "通用扩展",
"msg": "轻型目录访问协议",
"shell": "ldap.sh",
"check": "ldap"
},
{
"name": "gmp",
"versions": [
"55",
"56",
"70",
"71",
"72",
"73",
"74",
"80",
"81",
"82",
"83",
"84"
],
"type": "通用扩展",
"msg": "数学扩展",
"shell": "gmp.sh",
"check": "gmp"
},
{
"name": "brotli",
"versions": [

@ -639,6 +639,11 @@ $servers->setValue('server','custom_attrs',array('nsRoleDN','nsRole','nsAccountL
$servers->setValue('server','force_may',array('uidNumber','gidNumber','sambaSID'));
*/
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('login','auth_type','session');
$servers->setValue('server','base',array('dc=local,dc=com'));
$servers->setValue('login','bind_id','cn=admin,dc=local,dc=com');
/***********************************************************************************
* If you want to configure Google reCAPTCHA on autentication form, do so below. *

@ -98,6 +98,11 @@ def getPhpVer(expect=74):
if (t == expect):
is_find = True
return str(t)
expect_str = str(expect)
new_ex = expect_str[0:1]+"."+expect_str[1:2]
if t.find(new_ex) > -1:
is_find = True
return str(t)
if not is_find:
if len(v) > 1:
return v[1]['version']
@ -130,23 +135,6 @@ def contentReplace(content):
content = content.replace('{$BLOWFISH_SECRET}', blowfish_secret)
cfg = getCfg()
if cfg['choose'] == "mysql":
content = content.replace('{$CHOOSE_DB}', 'mysql')
content = content.replace('{$CHOOSE_DB_DIR}', 'mysql')
elif cfg['choose'] == "mysql-community":
content = content.replace('{$CHOOSE_DB}', 'mysql-community')
content = content.replace('{$CHOOSE_DB_DIR}', 'mysql-community')
elif cfg['choose'] == "mysql-apt":
content = content.replace('{$CHOOSE_DB}', 'mysql')
content = content.replace('{$CHOOSE_DB_DIR}', 'mysql-apt')
elif cfg['choose'] == "mysql-yum":
content = content.replace('{$CHOOSE_DB}', 'mysql')
content = content.replace('{$CHOOSE_DB_DIR}', 'mysql-yum')
else:
content = content.replace('{$CHOOSE_DB}', 'MariaDB')
content = content.replace('{$CHOOSE_DB_DIR}', 'mariadb')
content = content.replace('{$PMA_PATH}', cfg['path'])
port = cfg["port"]
@ -160,7 +148,6 @@ def initCfg():
if not os.path.exists(cfg):
data = {}
data['port'] = '988'
data['choose'] = 'mysql'
data['path'] = ''
data['username'] = 'admin'
data['password'] = 'admin'
@ -440,35 +427,6 @@ def errorLog():
def installVersion():
return mw.readFile(getServerDir() + '/version.pl')
def pluginsDbSupport():
data = {}
data['installed'] = 'no'
install_path = getServerDir()
if not os.path.exists(install_path):
return mw.returnJson(True, 'ok', data)
data['installed'] = 'ok'
data['status'] = status()
if (data['status'] == 'stop'):
return mw.returnJson(True, 'ok', data)
data['cfg'] = getCfg()
port = getPort()
ip = '127.0.0.1'
if not mw.isAppleSystem():
ip = thisdb.getOption('server_ip')
cfg = data['cfg']
auth = cfg['username']+':'+cfg['password']
rand_path = cfg['path']
home_page = 'http://' + auth + '@' + ip + ':' + port + '/' + rand_path + '/index.php'
data['home_page'] = home_page
data['version'] = installVersion().strip()
return mw.returnJson(True, 'ok', data)
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
@ -511,7 +469,5 @@ if __name__ == "__main__":
print(accessLog())
elif func == 'error_log':
print(errorLog())
elif func == 'plugins_db_support':
print(pluginsDbSupport())
else:
print('error')

@ -98,6 +98,11 @@ def getPhpVer(expect=55):
if (t == expect):
is_find = True
return str(t)
expect_str = str(expect)
new_ex = expect_str[0:1]+"."+expect_str[1:2]
if t.find(new_ex) > -1:
is_find = True
return str(t)
if not is_find:
if len(v) > 1:
return v[1]['version']

@ -52,7 +52,12 @@ def send_msg(bot, tag='ad', trigger_time=300):
# 综合包网/NG接口开户 | 28/m | 6m | next,4/28 | x
# 实名认证/过人脸🕵各种账号处理✅ | 30/m| next,6/30 | @nngzs
# 桃花资源采集| 13/m| next,7/13 | @xiaolizi1122
# D0抗投诉| 5/m | @lebo665544
keyboard = [
[
types.InlineKeyboardButton(
text="D0抗投诉微信支付宝不限行业支付", url='https://www.ymzf.org?mw')
],
[
types.InlineKeyboardButton(
text="SJ资源网播放计费", url='https://sjzy.tv?mw')

@ -61,7 +61,12 @@ def send_msg(bot, tag='ad', trigger_time=300):
# 综合包网/NG接口开户 | 28/m | 6m | next,4/28 | x
# 实名认证/过人脸🕵各种账号处理✅ | 30/m| next,6/30 | @nngzs
# 桃花资源采集| 13/m| next,7/13 | @xiaolizi1122
# D0抗投诉| 5/m | @lebo665544
keyboard = [
[
types.InlineKeyboardButton(
text="D0抗投诉微信支付宝不限行业支付", url='https://www.ymzf.org?mw')
],
[
types.InlineKeyboardButton(
text="SJ资源网播放计费", url='https://sjzy.tv?mw')

@ -23,7 +23,8 @@ apt install ntpdate -y
apt update -y
apt autoremove -y
apt install -y wget curl lsof unzip
apt install -y wget curl unzip
apt install -y lsof
apt install -y rar unrar
apt install -y xz-utils
apt install -y python3-pip

@ -205,7 +205,7 @@ $('#login-button').click(function(){
var data = 'username='+username+'&password='+password+'&code='+code;
var loadT = layer.msg("正在登录中...",{icon:16,time:0,shade: [0.3, '#000']});
$.post('/do_login',data,function(rdata){
console.log('do_login',rdata);
// console.log('do_login',rdata);
layer.close(loadT);
if(!rdata.status || rdata.status < 0){
if(username == 'admin' && rdata.msg.indexOf('用户名') != -1){

@ -63,8 +63,12 @@ class Firewall(object):
all_port = t[0].strip()
ports_list = all_port.split('\n')
ports_all = []
for pinfo in ports_list:
if pinfo.strip() == "":
continue
info = pinfo.split('/')
is_same = False

Loading…
Cancel
Save