Simple Linux Panel
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mdserver-web/panel_tools.py

371 lines
12 KiB

6 months ago
# 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)
6 months ago
from utils.firewall import Firewall as MwFirewall
6 months ago
import core.mw as mw
import thisdb
6 months ago
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 getRemainLen(cmd, max_length=100):
cmd_len = len(cmd)
cmd_u8_len = len(cmd.encode('utf-8'))
return max_length-int((cmd_u8_len - cmd_len)/2+cmd_len)
6 months ago
def mwcli(mw_input=0):
panel_dir = mw.getPanelDir()
raw_tip = "========================================================================"
6 months ago
if not mw_input:
print("========================mdserver-web cli tools==========================")
cmd_list = [
'(1) 重启面板服务',
'(2) 停止面板服务',
'(3) 启动面板服务',
'(4) 重载面板服务',
'(5) 修改面板端口',
5 months ago
'(6) 关闭安全入口',
'(10) 查看面板默认信息',
'(11) 修改面板密码',
'(12) 修改面板用户名',
'(13) 显示面板错误日志',
'(14) 关闭面板访问',
'(15) 开启面板访问',
'(20) 关闭BasicAuth认证',
'(21) 解除域名绑定',
'(22) 解除面板SSL绑定',
'(23) 开启IPV6支持',
'(24) 关闭IPV6支持',
'(25) 开启防火墙SSH端口',
'(26) 关闭二次验证',
'(27) 查看防火墙信息',
'(28) 自动识别防火墙端口到面板',
'(100) 开启PHP52显示',
'(101) 关闭PHP52显示',
'(200) 切换Linux系统软件源',
'(201) 简单速度测试',
'(0) 取消'
]
cmd_list_num = len(cmd_list)
for index in range(cmd_list_num):
cmd = cmd_list[index]
if index % 2 == 0:
if index == (cmd_list_num-1):
print(cmd)
else:
print(cmd + " " * getRemainLen(cmd, 40), end="")
if index % 2 == 1:
print(cmd)
6 months ago
print(raw_tip)
try:
mw_input = input("请输入命令编号:")
if sys.version_info[0] == 3:
mw_input = int(mw_input)
except:
mw_input = 0
nums = [
5 months ago
1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15,
20, 21, 22, 23, 24, 25, 26, 27, 28,
6 months ago
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:
MwFirewall.instance().addAcceptPort(in_port, 'WEB面板[TOOLS修改]', 'port')
panel_port = panel_dir + '/data/port.pl'
mw.writeFile(panel_port, in_port)
6 months ago
os.system(INIT_CMD + " restart_panel")
os.system(INIT_CMD + " default")
else:
mw.echoInfo("端口范围在0-65536之间")
6 months ago
return
5 months ago
elif mw_input == 6:
thisdb.setOption('admin_path', '')
mw.echoInfo("关闭安全入口成功!")
6 months ago
elif mw_input == 10:
os.system(INIT_CMD + " default")
elif mw_input == 11:
input_pwd = mw_input_cmd("请输入新的面板密码:")
if len(input_pwd.strip()) < 5:
mw.echoInfo("错误,密码长度不能小于5位")
6 months ago
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 ' + panel_dir + '/logs/panel_error.log')
5 months ago
elif mw_input == 14:
admin_close = thisdb.getOption('admin_close')
if admin_close == 'no':
thisdb.setOption('admin_close', 'yes')
mw.echoInfo("关闭面板访问成功!")
5 months ago
else:
mw.echoInfo("已关闭面板访问!")
5 months ago
elif mw_input == 15:
admin_close = thisdb.getOption('admin_close')
if admin_close == 'yes':
thisdb.setOption('admin_close', 'no')
mw.echoInfo("开启面板访问成功!")
5 months ago
else:
mw.echoInfo("已开启面板访问!")
6 months ago
elif mw_input == 20:
basic_auth = thisdb.getOptionByJson('basic_auth', default={'open':False})
if basic_auth['open']:
basic_auth['open'] = False
thisdb.setOption('basic_auth', json.dumps(basic_auth))
6 months ago
os.system(INIT_CMD + " restart")
mw.echoInfo("关闭basic_auth成功")
6 months ago
elif mw_input == 21:
panel_domain = thisdb.getOption('panel_domain', default='')
if panel_domain != '':
thisdb.setOption('panel_domain', '')
6 months ago
os.system(INIT_CMD + " unbind_domain")
mw.echoInfo("解除域名绑定成功")
else:
mw.echoInfo("面板未绑定域名!")
6 months ago
elif mw_input == 22:
panel_ssl = thisdb.getOptionByJson('panel_ssl', default={'open':False})
if panel_ssl['open']:
panel_ssl['open'] = False
thisdb.setOption('panel_ssl', json.dumps(panel_ssl))
6 months ago
os.system(INIT_CMD + " unbind_ssl")
mw.echoInfo("解除面板SSL绑定成功")
6 months ago
elif mw_input == 23:
listen_ipv6 = panel_dir + '/data/ipv6.pl'
6 months ago
if not os.path.exists(listen_ipv6):
mw.writeFile(listen_ipv6, 'True')
6 months ago
os.system(INIT_CMD + " restart")
mw.echoInfo("开启IPv6支持了")
6 months ago
else:
mw.echoInfo("已开启IPv6支持!")
6 months ago
elif mw_input == 24:
listen_ipv6 = panel_dir + '/data/ipv6.pl'
6 months ago
if not os.path.exists(listen_ipv6):
mw.echoInfo("已关闭IPv6支持!")
6 months ago
else:
os.remove(listen_ipv6)
os.system(INIT_CMD + " restart")
mw.echoInfo("关闭IPv6支持了")
6 months ago
elif mw_input == 25:
open_ssh_port()
mw.echoInfo("已开启!")
6 months ago
elif mw_input == 26:
6 months ago
two_step_verification = thisdb.getOptionByJson('two_step_verification', default={'open':False})
if two_step_verification['open']:
two_step_verification['open'] = False
thisdb.setOption('two_step_verification', json.dumps(two_step_verification))
mw.echoInfo("关闭二次验证成功!")
6 months ago
else:
mw.echoInfo("二次验证已关闭!")
6 months ago
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("未检测到防火墙!")
5 months ago
elif mw_input == 28:
MwFirewall.instance().aIF()
mw.echoInfo("执行自动识别防火墙端口到面板成功!")
6 months ago
elif mw_input == 100:
php_conf = panel_dir + '/plugins/php/info.json'
6 months ago
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)
6 months ago
mw.echoInfo("执行PHP52显示成功!")
6 months ago
elif mw_input == 101:
php_conf = panel_dir + '/plugins/php/info.json'
6 months ago
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)
6 months ago
mw.echoInfo("执行PHP52隐藏成功!")
6 months ago
elif mw_input == 200:
os.system(INIT_CMD + " mirror")
elif mw_input == 201:
os.system('curl -Lso- bench.sh | bash')
def open_ssh_port():
6 months ago
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'
mw.echoInfo("SSH端口: "+ str(ssh_port))
MwFirewall.instance().addAcceptPort(ssh_port, 'SSH远程管理服务', 'port')
6 months ago
return True
def set_panel_pwd(password, ncli=False):
info = thisdb.getUserByRoot()
thisdb.setUserByRoot(password=password)
6 months ago
if ncli:
mw.echoInfo("username: " + info['name'])
mw.echoInfo("password: " + password)
6 months ago
else:
print(username)
def show_panel_pwd():
6 months ago
# 面板密码展示
info = thisdb.getUserByRoot()
6 months ago
defailt_pwd_file = mw.getPanelDir()+'/data/default.pl'
pwd = ''
if os.path.exists(defailt_pwd_file):
pwd = mw.readFile(defailt_pwd_file).strip()
6 months ago
6 months ago
if mw.md5(pwd) == info['password']:
mw.echoInfo('password: ' + pwd)
6 months ago
return
print("*-password has been changed!")
6 months ago
6 months ago
def show_panel_adminpath():
6 months ago
admin_path = thisdb.getOption('admin_path')
print('/'+admin_path)
6 months ago
6 months ago
def set_panel_username(username=None):
# 随机面板用户名
if username:
if len(username) < 5:
mw.echoInfo("错误,用户名长度不能少于5位")
6 months ago
return
if username in ['admin', 'root']:
mw.echoInfo("错误,不能使用过于简单的用户名")
6 months ago
return
6 months ago
thisdb.setUserByRoot(name=username)
mw.echoInfo("username: %s" % username)
6 months ago
return
6 months ago
info = thisdb.getUserByRoot()
6 months ago
if info['name'] == 'admin':
6 months ago
username = mw.getRandomString(8).lower()
6 months ago
thisdb.setUserByRoot(name=username)
mw.echoInfo('username: ' + info['name'])
6 months ago
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))
5 months ago
# print(ip[0])
return ip[0]
6 months ago
5 months ago
def getPanelSslType():
scheme = 'http'
panel_ssl = thisdb.getOptionByJson('panel_ssl', default={'open':False})
if panel_ssl['open']:
scheme = 'https'
return scheme
5 months ago
def getPanelBindDomain():
return thisdb.getOption('panel_domain', default='')
5 months ago
def main():
6 months ago
if len(sys.argv) == 1:
print('ERROR: Parameter error!')
exit(-2)
6 months ago
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()
6 months ago
elif method == 'test':
thisdb.getOption('admin_path')
6 months ago
elif method == 'admin_path':
show_panel_adminpath()
6 months ago
elif method == 'getServerIp':
5 months ago
print(getServerIp())
5 months ago
elif method == 'panel_ssl_type':
print(getPanelSslType())
5 months ago
elif method == 'panel_bind_domain':
print(getPanelBindDomain())
6 months ago
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')
if __name__ == "__main__":
6 months ago
main()