mirror of https://github.com/midoks/mdserver-web
parent
11f42d5d2c
commit
966506bb8d
@ -0,0 +1,306 @@ |
||||
# coding=utf-8 |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# MW-Linux面板 |
||||
# --------------------------------------------------------------------------------- |
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. |
||||
# --------------------------------------------------------------------------------- |
||||
# Author: midoks <midoks@163.com> |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# 工具箱 |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
|
||||
import sys |
||||
import os |
||||
import json |
||||
import time |
||||
import re |
||||
|
||||
web_dir = os.getcwd() + "/web" |
||||
os.chdir(web_dir) |
||||
sys.path.append(web_dir) |
||||
|
||||
import core.mw as mw |
||||
import core.db as db |
||||
|
||||
# cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\'' |
||||
# info = mw.execShell(cmd) |
||||
# p = "/usr/local/lib/" + info[0].strip() + "/site-packages" |
||||
# sys.path.append(p) |
||||
|
||||
INIT_DIR = "/etc/rc.d/init.d" |
||||
if mw.isAppleSystem(): |
||||
INIT_DIR = mw.getPanelDir() + "/scripts/init.d" |
||||
|
||||
INIT_CMD = INIT_DIR + "/mw" |
||||
|
||||
|
||||
def mw_input_cmd(msg): |
||||
if sys.version_info[0] == 2: |
||||
in_val = raw_input(msg) |
||||
else: |
||||
in_val = input(msg) |
||||
return in_val |
||||
|
||||
|
||||
def mwcli(mw_input=0): |
||||
raw_tip = "======================================================" |
||||
if not mw_input: |
||||
print("===============mdserver-web cli tools=================") |
||||
print("(1) 重启面板服务") |
||||
print("(2) 停止面板服务") |
||||
print("(3) 启动面板服务") |
||||
print("(4) 重载面板服务") |
||||
print("(5) 修改面板端口") |
||||
print("(10) 查看面板默认信息") |
||||
print("(11) 修改面板密码") |
||||
print("(12) 修改面板用户名") |
||||
print("(13) 显示面板错误日志") |
||||
print("(20) 关闭BasicAuth认证") |
||||
print("(21) 解除域名绑定") |
||||
print("(22) 解除面板SSL绑定") |
||||
print("(23) 开启IPV6支持") |
||||
print("(24) 关闭IPV6支持") |
||||
print("(25) 开启防火墙SSH端口") |
||||
print("(26) 关闭二次验证") |
||||
print("(27) 查看防火墙信息") |
||||
print("(100) 开启PHP52显示") |
||||
print("(101) 关闭PHP52显示") |
||||
print("(200) 切换Linux系统软件源") |
||||
print("(201) 简单速度测试") |
||||
print("(0) 取消") |
||||
print(raw_tip) |
||||
try: |
||||
mw_input = input("请输入命令编号:") |
||||
if sys.version_info[0] == 3: |
||||
mw_input = int(mw_input) |
||||
except: |
||||
mw_input = 0 |
||||
|
||||
nums = [ |
||||
1, 2, 3, 4, 5, 10, 11, 12, 13, |
||||
20, 21, 22, 23, 24, 25, 26, 27, |
||||
100, 101, |
||||
200, 201 |
||||
] |
||||
if not mw_input in nums: |
||||
print(raw_tip) |
||||
print("已取消!") |
||||
exit() |
||||
|
||||
if mw_input == 1: |
||||
os.system(INIT_CMD + " restart") |
||||
elif mw_input == 2: |
||||
os.system(INIT_CMD + " stop") |
||||
elif mw_input == 3: |
||||
os.system(INIT_CMD + " start") |
||||
elif mw_input == 4: |
||||
os.system(INIT_CMD + " reload") |
||||
elif mw_input == 5: |
||||
in_port = mw_input_cmd("请输入新的面板端口:") |
||||
in_port_int = int(in_port.strip()) |
||||
if in_port_int < 65536 and in_port_int > 0: |
||||
import firewall_api |
||||
firewall_api.firewall_api().addAcceptPortArgs( |
||||
in_port, 'WEB面板[TOOLS修改]', 'port') |
||||
mw.writeFile('data/port.pl', in_port) |
||||
os.system(INIT_CMD + " restart_panel") |
||||
os.system(INIT_CMD + " default") |
||||
else: |
||||
print("|-端口范围在0-65536之间") |
||||
return |
||||
elif mw_input == 10: |
||||
os.system(INIT_CMD + " default") |
||||
elif mw_input == 11: |
||||
input_pwd = mw_input_cmd("请输入新的面板密码:") |
||||
if len(input_pwd.strip()) < 5: |
||||
print("|-错误,密码长度不能小于5位") |
||||
return |
||||
set_panel_pwd(input_pwd.strip(), True) |
||||
elif mw_input == 12: |
||||
input_user = mw_input_cmd("请输入新的面板用户名(>=5位):") |
||||
set_panel_username(input_user.strip()) |
||||
elif mw_input == 13: |
||||
os.system('tail -100 ' + mw.getPanelDir() + '/logs/error.log') |
||||
elif mw_input == 20: |
||||
basic_auth = 'data/basic_auth.json' |
||||
if os.path.exists(basic_auth): |
||||
os.remove(basic_auth) |
||||
os.system(INIT_CMD + " restart") |
||||
print("|-关闭basic_auth成功") |
||||
elif mw_input == 21: |
||||
bind_domain = 'data/bind_domain.pl' |
||||
if os.path.exists(bind_domain): |
||||
os.remove(bind_domain) |
||||
os.system(INIT_CMD + " unbind_domain") |
||||
print("|-解除域名绑定成功") |
||||
elif mw_input == 22: |
||||
ssl_choose = 'ssl/choose.pl' |
||||
if os.path.exists(ssl_choose): |
||||
os.remove(ssl_choose) |
||||
os.system(INIT_CMD + " unbind_ssl") |
||||
print("|-解除面板SSL绑定成功") |
||||
elif mw_input == 23: |
||||
listen_ipv6 = 'data/ipv6.pl' |
||||
if not os.path.exists(listen_ipv6): |
||||
mw.writeFile(listen_ipv6,'True') |
||||
os.system(INIT_CMD + " restart") |
||||
print("|-开启IPv6支持了") |
||||
else: |
||||
print("|-已开启IPv6支持!") |
||||
elif mw_input == 24: |
||||
listen_ipv6 = 'data/ipv6.pl' |
||||
if not os.path.exists(listen_ipv6): |
||||
print("|-已关闭IPv6支持!") |
||||
else: |
||||
os.remove(listen_ipv6) |
||||
os.system(INIT_CMD + " restart") |
||||
print("|-关闭IPv6支持了") |
||||
elif mw_input == 25: |
||||
open_ssh_port() |
||||
print("|-已开启!") |
||||
elif mw_input == 26: |
||||
auth_secret = 'data/auth_secret.pl' |
||||
if os.path.exists(auth_secret): |
||||
os.remove(auth_secret) |
||||
print("|-关闭二次验证成功!") |
||||
else: |
||||
print("|-二次验证已关闭!") |
||||
elif mw_input == 27: |
||||
cmd = 'which ufw' |
||||
run_cmd = False |
||||
find_cmd = mw.execShell(cmd) |
||||
if find_cmd[0].strip() != '': |
||||
run_cmd = True |
||||
os.system('ufw status') |
||||
|
||||
cmd = 'which firewall-cmd' |
||||
find_cmd = mw.execShell(cmd) |
||||
if find_cmd[0].strip() != '': |
||||
run_cmd = True |
||||
os.system('firewall-cmd --list-all') |
||||
if not run_cmd: |
||||
mw.echoInfo("未检测到防火墙!") |
||||
elif mw_input == 100: |
||||
php_conf = 'plugins/php/info.json' |
||||
if os.path.exists(php_conf): |
||||
cont = mw.readFile(php_conf) |
||||
cont = re.sub("\"53\"", "\"52\",\"53\"", cont) |
||||
cont = re.sub("\"5.3.29\"", "\"5.2.17\",\"5.3.29\"", cont) |
||||
mw.writeFile(php_conf, cont) |
||||
print("|-执行PHP52显示成功!") |
||||
elif mw_input == 101: |
||||
php_conf = 'plugins/php/info.json' |
||||
if os.path.exists(php_conf): |
||||
cont = mw.readFile(php_conf) |
||||
cont = re.sub("\"52\",", "", cont) |
||||
cont = re.sub("\"5.2.17\",", cont) |
||||
mw.writeFile(php_conf, cont) |
||||
print("|-执行PHP52隐藏成功!") |
||||
elif mw_input == 200: |
||||
os.system(INIT_CMD + " mirror") |
||||
elif mw_input == 201: |
||||
os.system('curl -Lso- bench.sh | bash') |
||||
|
||||
|
||||
def open_ssh_port(): |
||||
import firewall_api |
||||
find_ssh_port_cmd = "cat /etc/ssh/sshd_config | grep '^Port \\d*' | tail -1" |
||||
cmd_data = mw.execShell(find_ssh_port_cmd) |
||||
ssh_port = cmd_data[0].replace("Port ", '').strip() |
||||
if ssh_port == '': |
||||
ssh_port = '22' |
||||
|
||||
print("|-SSH端口: "+ str(ssh_port)) |
||||
firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port') |
||||
return True |
||||
|
||||
|
||||
def set_panel_pwd(password, ncli=False): |
||||
# 设置面板密码 |
||||
import db |
||||
sql = db.Sql() |
||||
result = sql.table('users').where('id=?', (1,)).setField( |
||||
'password', mw.md5(password)) |
||||
username = sql.table('users').where('id=?', (1,)).getField('username') |
||||
if ncli: |
||||
print("|-用户名: " + username) |
||||
print("|-新密码: " + password) |
||||
else: |
||||
print(username) |
||||
|
||||
|
||||
def show_panel_pwd(): |
||||
# 设置面板密码 |
||||
import db |
||||
sql = db.Sql() |
||||
password = sql.table('users').where('id=?', (1,)).getField('password') |
||||
|
||||
file_pwd = '' |
||||
if os.path.exists('data/default.pl'): |
||||
file_pwd = mw.readFile('data/default.pl').strip() |
||||
|
||||
if mw.md5(file_pwd) == password: |
||||
print('password: ' + file_pwd) |
||||
return |
||||
print("password has been changed!") |
||||
|
||||
|
||||
def set_panel_username(username=None): |
||||
# 随机面板用户名 |
||||
import db |
||||
sql = db.Sql() |
||||
if username: |
||||
if len(username) < 5: |
||||
print("|-错误,用户名长度不能少于5位") |
||||
return |
||||
if username in ['admin', 'root']: |
||||
print("|-错误,不能使用过于简单的用户名") |
||||
return |
||||
|
||||
sql.table('users').where('id=?', (1,)).setField('username', username) |
||||
print("|-新用户名: %s" % username) |
||||
return |
||||
|
||||
username = sql.table('users').where('id=?', (1,)).getField('username') |
||||
if username == 'admin': |
||||
username = mw.getRandomString(8).lower() |
||||
sql.table('users').where('id=?', (1,)).setField('username', username) |
||||
print('username: ' + username) |
||||
|
||||
|
||||
def getServerIp(): |
||||
version = sys.argv[2] |
||||
# ip = mw.execShell( |
||||
# "curl --insecure -{} -sS --connect-timeout 5 -m 60 https://v6r.ipip.net/?format=text".format(version)) |
||||
ip = mw.execShell( |
||||
"curl --insecure -{} -sS --connect-timeout 5 -m 60 https://ip.cachecha.com/?format=text".format(version)) |
||||
print(ip[0]) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
method = sys.argv[1] |
||||
if method == 'panel': |
||||
set_panel_pwd(sys.argv[2]) |
||||
elif method == 'username': |
||||
if len(sys.argv) > 2: |
||||
set_panel_username(sys.argv[2]) |
||||
else: |
||||
set_panel_username() |
||||
elif method == 'password': |
||||
show_panel_pwd() |
||||
elif method == 'getServerIp': |
||||
getServerIp() |
||||
elif method == "cli": |
||||
clinum = 0 |
||||
try: |
||||
if len(sys.argv) > 2: |
||||
clinum = int(sys.argv[2]) if sys.argv[2][:6] else sys.argv[2] |
||||
except: |
||||
clinum = sys.argv[2] |
||||
mwcli(clinum) |
||||
else: |
||||
print('ERROR: Parameter error') |
@ -0,0 +1,182 @@ |
||||
#!/bin/bash |
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin |
||||
export PATH |
||||
# LANG=en_US.UTF-8 |
||||
is64bit=`getconf LONG_BIT` |
||||
|
||||
echo -e "您正在安装的是\033[31mmdserver-web测试版\033[0m,非开发测试用途请使用正式版 install.sh !" |
||||
echo -e "You are installing\033[31m mdserver-web dev version\033[0m, normally use install.sh for production.\n" |
||||
sleep 1 |
||||
|
||||
LOG_FILE=/var/log/mw-install.log |
||||
|
||||
{ |
||||
|
||||
if [ -f /etc/motd ];then |
||||
echo "welcome to mdserver-web panel" > /etc/motd |
||||
fi |
||||
|
||||
startTime=`date +%s` |
||||
|
||||
_os=`uname` |
||||
echo "use system: ${_os}" |
||||
|
||||
|
||||
if [ ${_os} == "Darwin" ]; then |
||||
OSNAME='macos' |
||||
elif grep -Eq "openSUSE" /etc/*-release; then |
||||
OSNAME='opensuse' |
||||
zypper refresh |
||||
zypper install -y wget curl zip unzip unrar rar |
||||
elif grep -Eq "FreeBSD" /etc/*-release; then |
||||
OSNAME='freebsd' |
||||
pkg install -y wget curl zip unzip unrar rar |
||||
elif grep -Eqi "EulerOS" /etc/*-release || grep -Eqi "openEuler" /etc/*-release; then |
||||
OSNAME='euler' |
||||
yum install -y wget curl zip unzip tar crontabs |
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then |
||||
OSNAME='rhel' |
||||
yum install -y wget zip unzip tar |
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then |
||||
OSNAME='rhel' |
||||
yum install -y wget zip unzip tar |
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then |
||||
OSNAME='rhel' |
||||
yum install -y wget zip unzip |
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then |
||||
OSNAME='rhel' |
||||
yum install -y wget zip unzip tar |
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then |
||||
OSNAME='amazon' |
||||
yum install -y wget zip unzip tar |
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/*-release; then |
||||
OSNAME='ubuntu' |
||||
apt install -y wget zip unzip tar |
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/*-release; then |
||||
OSNAME='debian' |
||||
apt update -y |
||||
apt install -y devscripts |
||||
apt install -y wget zip unzip tar |
||||
else |
||||
OSNAME='unknow' |
||||
fi |
||||
|
||||
if [ "$EUID" -ne 0 ] && [ "$OSNAME" != "macos" ];then |
||||
echo "Please run as root!" |
||||
exit |
||||
fi |
||||
|
||||
# HTTP_PREFIX="https://" |
||||
# LOCAL_ADDR=common |
||||
# ping -c 1 github.com > /dev/null 2>&1 |
||||
# if [ "$?" != "0" ];then |
||||
# LOCAL_ADDR=cn |
||||
# HTTP_PREFIX="https://mirror.ghproxy.com/" |
||||
# fi |
||||
|
||||
HTTP_PREFIX="https://" |
||||
LOCAL_ADDR=common |
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"") |
||||
if [ ! -z "$cn" ] || [ "$?" == "0" ] ;then |
||||
LOCAL_ADDR=cn |
||||
HTTP_PREFIX="https://mirror.ghproxy.com/" |
||||
fi |
||||
|
||||
echo "local:${LOCAL_ADDR}" |
||||
echo "OSNAME:${OSNAME}" |
||||
|
||||
if [ $OSNAME != "macos" ];then |
||||
|
||||
if id www &> /dev/null ;then |
||||
echo "" |
||||
else |
||||
groupadd www |
||||
useradd -g www -s /usr/sbin/nologin www |
||||
fi |
||||
|
||||
mkdir -p /www/server |
||||
mkdir -p /www/wwwroot |
||||
mkdir -p /www/wwwlogs |
||||
mkdir -p /www/backup/database |
||||
mkdir -p /www/backup/site |
||||
|
||||
if [ ! -d /www/server/mdserver-web ];then |
||||
|
||||
if [ "$LOCAL_ADDR" == "common" ];then |
||||
curl --insecure -sSLo /tmp/dev.zip ${HTTP_PREFIX}github.com/midoks/mdserver-web/archive/refs/heads/dev.zip |
||||
cd /tmp && unzip /tmp/dev.zip |
||||
mv -f /tmp/mdserver-web-dev /www/server/mdserver-web |
||||
rm -rf /tmp/dev.zip |
||||
rm -rf /tmp/mdserver-web-dev |
||||
else |
||||
# curl --insecure -sSLo /tmp/dev.zip https://code.midoks.icu/midoks/mdserver-web/archive/dev.zip |
||||
wget --no-check-certificate -O /tmp/dev.zip https://code.midoks.icu/midoks/mdserver-web/archive/dev.zip |
||||
cd /tmp && unzip /tmp/dev.zip |
||||
mv -f /tmp/mdserver-web /www/server/mdserver-web |
||||
rm -rf /tmp/dev.zip |
||||
rm -rf /tmp/mdserver-web |
||||
fi |
||||
fi |
||||
|
||||
# install acme.sh |
||||
if [ ! -d /root/.acme.sh ];then |
||||
if [ "$LOCAL_ADDR" != "common" ];then |
||||
# curl -sSL -o /tmp/acme.tar.gz ${HTTP_PREFIX}github.com/acmesh-official/acme.sh/archive/master.tar.gz |
||||
curl --insecure -sSLo /tmp/acme.tar.gz https://gitee.com/neilpang/acme.sh/repository/archive/master.tar.gz |
||||
tar xvzf /tmp/acme.tar.gz -C /tmp |
||||
cd /tmp/acme.sh-master |
||||
bash acme.sh install |
||||
fi |
||||
|
||||
if [ ! -d /root/.acme.sh ];then |
||||
curl https://get.acme.sh | sh |
||||
fi |
||||
fi |
||||
fi |
||||
|
||||
echo "use system version: ${OSNAME}" |
||||
|
||||
if [ "${OSNAME}" == "macos" ];then |
||||
curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/master/scripts/install/macos.sh | bash |
||||
else |
||||
cd /www/server/mdserver-web && bash scripts/install/${OSNAME}.sh |
||||
fi |
||||
|
||||
if [ "${OSNAME}" == "macos" ];then |
||||
echo "macos end" |
||||
exit 0 |
||||
fi |
||||
|
||||
cd /www/server/mdserver-web && bash cli_new.sh start |
||||
isStart=`ps -ef|grep 'gunicorn -c setting.py app:app' |grep -v grep|awk '{print $2}'` |
||||
n=0 |
||||
while [ ! -f /etc/rc.d/init.d/mw ]; |
||||
do |
||||
echo -e ".\c" |
||||
sleep 1 |
||||
let n+=1 |
||||
if [ $n -gt 20 ];then |
||||
echo -e "start mw fail" |
||||
exit 1 |
||||
fi |
||||
done |
||||
|
||||
cd /www/server/mdserver-web && bash /etc/rc.d/init.d/mw stop |
||||
cd /www/server/mdserver-web && bash /etc/rc.d/init.d/mw start |
||||
cd /www/server/mdserver-web && bash /etc/rc.d/init.d/mw default |
||||
|
||||
sleep 2 |
||||
if [ ! -e /usr/bin/mw ]; then |
||||
if [ -f /etc/rc.d/init.d/mw ];then |
||||
ln -s /etc/rc.d/init.d/mw /usr/bin/mw |
||||
fi |
||||
fi |
||||
|
||||
endTime=`date +%s` |
||||
((outTime=(${endTime}-${startTime})/60)) |
||||
echo -e "Time consumed:\033[32m $outTime \033[0mMinute!" |
||||
|
||||
} 1> >(tee $LOG_FILE) 2>&1 |
||||
|
||||
echo -e "\nInstall completed. If error occurs, please contact us with the log file mw-install.log ." |
||||
echo "安装完毕,如果出现错误,请带上同目录下的安装日志 mw-install.log 联系我们反馈." |
@ -0,0 +1,72 @@ |
||||
# coding:utf-8 |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# MW-Linux面板 |
||||
# --------------------------------------------------------------------------------- |
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. |
||||
# --------------------------------------------------------------------------------- |
||||
# Author: midoks <midoks@163.com> |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# 配置文件 |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
|
||||
import time |
||||
import sys |
||||
import random |
||||
import os |
||||
|
||||
|
||||
import core.mw as mw |
||||
|
||||
|
||||
import utils.system as system |
||||
cpu_info = system.getCpuInfo() |
||||
workers = cpu_info[1] |
||||
|
||||
panel_dir = mw.getPanelDir() |
||||
|
||||
|
||||
log_dir = mw.getMWLogs() |
||||
if not os.path.exists(log_dir): |
||||
os.mkdir(log_dir) |
||||
|
||||
# default port |
||||
mw_port = '7200' |
||||
if os.path.exists(panel_dir+'/data/port.pl'): |
||||
mw_port = mw.readFile(panel_dir+'/data/port.pl') |
||||
mw_port.strip() |
||||
# else: |
||||
# import firewall_api |
||||
# import common |
||||
# common.initDB() |
||||
# mw_port = str(random.randint(10000, 65530)) |
||||
# firewall_api.firewall_api().addAcceptPortArgs(mw_port, 'WEB面板', 'port') |
||||
# mw.writeFile('data/port.pl', mw_port) |
||||
|
||||
bind = [] |
||||
if os.path.exists('data/ipv6.pl'): |
||||
bind.append('[0:0:0:0:0:0:0:0]:%s' % mw_port) |
||||
else: |
||||
bind.append('0.0.0.0:%s' % mw_port) |
||||
|
||||
print(mw_port) |
||||
if workers > 2: |
||||
workers = 2 |
||||
|
||||
threads = workers * 1 |
||||
backlog = 512 |
||||
reload = False |
||||
daemon = True |
||||
# worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker' |
||||
timeout = 7200 |
||||
keepalive = 60 |
||||
preload_app = True |
||||
capture_output = True |
||||
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' |
||||
loglevel = 'info' |
||||
errorlog = log_dir + '/panel_error.log' |
||||
accesslog = log_dir + '/panel.log' |
||||
pidfile = log_dir + '/mw.pid' |
Loading…
Reference in new issue