mirror of https://github.com/midoks/mdserver-web
parent
6c40e92a15
commit
dc5670fc39
@ -0,0 +1,43 @@ |
||||
CREATE TABLE IF NOT EXISTS `config` ( |
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
`mysql_root` TEXT |
||||
); |
||||
|
||||
INSERT INTO `config` (`id`, `mysql_root`) VALUES (1, 'admin'); |
||||
|
||||
CREATE TABLE IF NOT EXISTS `databases` ( |
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
`pid` INTEGER, |
||||
`name` TEXT, |
||||
`username` TEXT, |
||||
`password` TEXT, |
||||
`accept` TEXT, |
||||
`rw` TEXT DEFAULT 'rw', |
||||
`ps` TEXT, |
||||
`addtime` TEXT |
||||
); |
||||
-- ALTER TABLE `databases` ADD COLUMN `rw` TEXT DEFAULT 'rw'; |
||||
|
||||
CREATE TABLE IF NOT EXISTS `master_replication_user` ( |
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
`username` TEXT, |
||||
`password` TEXT, |
||||
`accept` TEXT, |
||||
`ps` TEXT, |
||||
`addtime` TEXT |
||||
); |
||||
|
||||
-- 从库配置主库的[ssh private key] |
||||
-- drop table `slave_id_rsa`; |
||||
CREATE TABLE IF NOT EXISTS `slave_id_rsa` ( |
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT, |
||||
`ip` TEXT, |
||||
`port` TEXT, |
||||
`user` TEXT, |
||||
`db_user` TEXT, |
||||
`id_rsa` TEXT, |
||||
`ps` TEXT, |
||||
`addtime` TEXT |
||||
); |
||||
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@ -0,0 +1,32 @@ |
||||
<div class="bt-form"> |
||||
<div class='plugin_version'></div> |
||||
<div class="bt-w-main"> |
||||
<div class="bt-w-menu"> |
||||
<!-- <script type="text/javascript">console.log($('.plugin_version').attr('version'));</script> --> |
||||
<p class="bgw" onclick="pluginService('postgresql', $('.plugin_version').attr('version'));">服务</p> |
||||
<p onclick="pluginInitD('postgresql', $('.plugin_version').attr('version'));">自启动</p> |
||||
<p onclick="pluginConfig('postgresql', $('.plugin_version').attr('version'));">配置文件</p> |
||||
<!--<p onclick="myDbPos();">存储位置</p> |
||||
<p onclick="myPort();">端口</p> |
||||
<p onclick="runInfo();">当前状态</p> |
||||
<p onclick="myPerfOpt();">性能优化</p> |
||||
<p onclick="myLogs();">日志</p> |
||||
<p onclick="pluginLogs('postgresql',$('.plugin_version').attr('version'),'show_log');">慢日志</p> |
||||
<p onclick="dbList()">管理列表</p> |
||||
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p> --> |
||||
</div> |
||||
<div class="bt-w-con pd15"> |
||||
<div class="soft-man-con" style="height: 530px; overflow: auto;"></div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
<script type="text/javascript"> |
||||
resetPluginWinWidth(800); |
||||
var loading = layer.msg("资源加载中...", { icon: 16, time: 0, shade: 0.3 }); |
||||
$.getScript( "/plugins/file?name=postgresql&f=js/postgresql.js", function(){ |
||||
layer.close(loading); |
||||
pluginService('postgresql',$('.plugin_version').attr('version')); |
||||
}); |
||||
</script> |
@ -0,0 +1,745 @@ |
||||
# coding:utf-8 |
||||
|
||||
import sys |
||||
import io |
||||
import os |
||||
import time |
||||
import subprocess |
||||
import re |
||||
import json |
||||
|
||||
|
||||
# reload(sys) |
||||
# sys.setdefaultencoding('utf-8') |
||||
|
||||
sys.path.append(os.getcwd() + "/class/core") |
||||
import mw |
||||
|
||||
|
||||
if mw.isAppleSystem(): |
||||
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) |
||||
|
||||
|
||||
app_debug = False |
||||
if mw.isAppleSystem(): |
||||
app_debug = True |
||||
|
||||
|
||||
def getPluginName(): |
||||
return 'postgresql' |
||||
|
||||
|
||||
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 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(): |
||||
path = getServerDir() + '/data/postgresql.conf' |
||||
return path |
||||
|
||||
|
||||
def getDbPort(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'port\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def getSocketFile(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'socket\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def getInitdTpl(version=''): |
||||
path = getPluginDir() + '/init.d/postgresql.tpl' |
||||
if not os.path.exists(path): |
||||
path = getPluginDir() + '/init.d/postgresql.tpl' |
||||
return path |
||||
|
||||
|
||||
def contentReplace(content): |
||||
service_path = mw.getServerDir() |
||||
content = content.replace('{$ROOT_PATH}', mw.getRootDir()) |
||||
content = content.replace('{$SERVER_PATH}', service_path) |
||||
content = content.replace('{$APP_PATH}', service_path + '/postgresql') |
||||
return content |
||||
|
||||
|
||||
def pSqliteDb(dbname='databases'): |
||||
file = getServerDir() + '/pgsql.db' |
||||
name = 'pgsql' |
||||
if not os.path.exists(file): |
||||
conn = mw.M(dbname).dbPos(getServerDir(), name) |
||||
csql = mw.readFile(getPluginDir() + '/conf/pgsql.sql') |
||||
csql_list = csql.split(';') |
||||
for index in range(len(csql_list)): |
||||
conn.execute(csql_list[index], ()) |
||||
else: |
||||
# 现有run |
||||
# conn = mw.M(dbname).dbPos(getServerDir(), name) |
||||
# csql = mw.readFile(getPluginDir() + '/conf/mysql.sql') |
||||
# csql_list = csql.split(';') |
||||
# for index in range(len(csql_list)): |
||||
# conn.execute(csql_list[index], ()) |
||||
conn = mw.M(dbname).dbPos(getServerDir(), name) |
||||
return conn |
||||
|
||||
|
||||
def pMysqlDb(): |
||||
# pymysql |
||||
db = mw.getMyORM() |
||||
# MySQLdb | |
||||
# db = mw.getMyORMDb() |
||||
|
||||
db.setPort(getDbPort()) |
||||
db.setSocket(getSocketFile()) |
||||
# db.setCharset("utf8") |
||||
db.setPwd(pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')) |
||||
return db |
||||
|
||||
|
||||
def initDreplace(version=''): |
||||
|
||||
conf_dir = getServerDir() + '/etc' |
||||
log_dir = getServerDir() + "/logs" |
||||
conf_list = [ |
||||
conf_dir, |
||||
log_dir |
||||
] |
||||
for conf in conf_list: |
||||
if not os.path.exists(conf): |
||||
os.mkdir(conf) |
||||
|
||||
my_conf = conf_dir + '/my.cnf' |
||||
if not os.path.exists(my_conf): |
||||
tpl = getPluginDir() + '/conf/my.cnf' |
||||
content = mw.readFile(tpl) |
||||
content = contentReplace(content) |
||||
mw.writeFile(my_conf, content) |
||||
|
||||
# systemd |
||||
system_dir = mw.systemdCfgDir() |
||||
service = system_dir + '/postgresql.service' |
||||
if os.path.exists(system_dir) and not os.path.exists(service): |
||||
tpl = getPluginDir() + '/init.d/postgresql.service.tpl' |
||||
service_path = mw.getServerDir() |
||||
content = mw.readFile(tpl) |
||||
content = content.replace('{$SERVER_PATH}', service_path) |
||||
mw.writeFile(service, content) |
||||
mw.execShell('systemctl daemon-reload') |
||||
|
||||
if not mw.isAppleSystem(): |
||||
mw.execShell('chown -R postgresql:postgresql ' + getServerDir()) |
||||
|
||||
initd_path = getServerDir() + '/init.d' |
||||
if not os.path.exists(initd_path): |
||||
os.mkdir(initd_path) |
||||
|
||||
file_bin = initd_path + '/' + getPluginName() |
||||
if not os.path.exists(file_bin): |
||||
initd_tpl = getInitdTpl(version) |
||||
content = mw.readFile(initd_tpl) |
||||
content = contentReplace(content) |
||||
mw.writeFile(file_bin, content) |
||||
mw.execShell('chmod +x ' + file_bin) |
||||
return file_bin |
||||
|
||||
|
||||
def status(version=''): |
||||
data = mw.execShell( |
||||
"ps -ef|grep postgres |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'") |
||||
if data[0] == '': |
||||
return 'stop' |
||||
return 'start' |
||||
|
||||
|
||||
def getDataDir(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'datadir\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def getPidFile(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'pid-file\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def getErrorLog(): |
||||
args = getArgs() |
||||
path = getDataDir() |
||||
filename = '' |
||||
for n in os.listdir(path): |
||||
if len(n) < 5: |
||||
continue |
||||
if n == 'error.log': |
||||
filename = path + '/' + n |
||||
break |
||||
# print filename |
||||
if not os.path.exists(filename): |
||||
return mw.returnJson(False, '指定文件不存在!') |
||||
if 'close' in args: |
||||
mw.writeFile(filename, '') |
||||
return mw.returnJson(False, '日志已清空') |
||||
info = mw.getNumLines(filename, 18) |
||||
return mw.returnJson(True, 'OK', info) |
||||
|
||||
|
||||
def getShowLogFile(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'slow-query-log-file\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def pGetDbUser(): |
||||
if mw.isAppleSystem(): |
||||
user = mw.execShell( |
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip() |
||||
return user |
||||
return 'postgresql' |
||||
|
||||
|
||||
def initPgData(): |
||||
datadir = getDataDir() |
||||
if not os.path.exists(datadir + '/postgresql'): |
||||
serverdir = getServerDir() |
||||
myconf = serverdir + "/etc/my.cnf" |
||||
user = pGetDbUser() |
||||
cmd = 'cd ' + serverdir + ' && ./bin/initdb -D ' + serverdir + "/data" |
||||
mw.execShell(cmd) |
||||
return False |
||||
return True |
||||
|
||||
|
||||
def initPgPwd(): |
||||
|
||||
serverdir = getServerDir() |
||||
pwd = mw.getRandomString(16) |
||||
|
||||
cmd_pass = serverdir + '/bin/mysql -uroot -e' |
||||
cmd_pass = cmd_pass + "\"UPDATE mysql.user SET password=PASSWORD('" + \ |
||||
pwd + "') WHERE user='root';" |
||||
cmd_pass = cmd_pass + "flush privileges;\"" |
||||
data = mw.execShell(cmd_pass) |
||||
# print(cmd_pass) |
||||
# print(data) |
||||
|
||||
# 删除测试数据库 |
||||
drop_test_db = serverdir + '/bin/mysql -uroot -p' + \ |
||||
pwd + ' -e "drop database test";' |
||||
mw.execShell(drop_test_db) |
||||
|
||||
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,)) |
||||
return True |
||||
|
||||
|
||||
def myOp(version, method): |
||||
# import commands |
||||
init_file = initDreplace() |
||||
cmd = init_file + ' ' + method |
||||
try: |
||||
isInited = initPgData() |
||||
if not isInited: |
||||
if mw.isAppleSystem(): |
||||
cmd_init_start = init_file + ' start' |
||||
subprocess.Popen(cmd_init_start, stdout=subprocess.PIPE, shell=True, |
||||
bufsize=4096, stderr=subprocess.PIPE) |
||||
|
||||
time.sleep(6) |
||||
else: |
||||
mw.execShell('systemctl start postgresql') |
||||
|
||||
initPgPwd() |
||||
|
||||
if mw.isAppleSystem(): |
||||
cmd_init_stop = init_file + ' stop' |
||||
subprocess.Popen(cmd_init_stop, stdout=subprocess.PIPE, shell=True, |
||||
bufsize=4096, stderr=subprocess.PIPE) |
||||
time.sleep(3) |
||||
else: |
||||
mw.execShell('systemctl stop postgresql') |
||||
|
||||
if mw.isAppleSystem(): |
||||
sub = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, |
||||
bufsize=4096, stderr=subprocess.PIPE) |
||||
sub.wait(5) |
||||
else: |
||||
mw.execShell('systemctl ' + method + ' postgresql') |
||||
return 'ok' |
||||
except Exception as e: |
||||
return str(e) |
||||
|
||||
|
||||
def appCMD(version, action): |
||||
return myOp(version, action) |
||||
|
||||
|
||||
def start(version=''): |
||||
return appCMD(version, 'start') |
||||
|
||||
|
||||
def stop(version=''): |
||||
return appCMD(version, 'stop') |
||||
|
||||
|
||||
def restart(version=''): |
||||
return appCMD(version, 'restart') |
||||
|
||||
|
||||
def reload(version=''): |
||||
return appCMD(version, 'reload') |
||||
|
||||
|
||||
def initdStatus(): |
||||
if mw.isAppleSystem(): |
||||
return "Apple Computer does not support" |
||||
|
||||
shell_cmd = 'systemctl status mysql | grep loaded | grep "enabled;"' |
||||
data = mw.execShell(shell_cmd) |
||||
if data[0] == '': |
||||
return 'fail' |
||||
return 'ok' |
||||
|
||||
|
||||
def initdInstall(): |
||||
if mw.isAppleSystem(): |
||||
return "Apple Computer does not support" |
||||
|
||||
mw.execShell('systemctl enable mysql') |
||||
return 'ok' |
||||
|
||||
|
||||
def initdUinstall(): |
||||
if mw.isAppleSystem(): |
||||
return "Apple Computer does not support" |
||||
|
||||
mw.execShell('systemctl disable mysql') |
||||
return 'ok' |
||||
|
||||
|
||||
def getMyDbPos(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'datadir\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def setMyDbPos(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['datadir']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
s_datadir = getMyDbPos() |
||||
t_datadir = args['datadir'] |
||||
if t_datadir == s_datadir: |
||||
return mw.returnJson(False, '与当前存储目录相同,无法迁移文件!') |
||||
|
||||
if not os.path.exists(t_datadir): |
||||
mw.execShell('mkdir -p ' + t_datadir) |
||||
|
||||
# mw.execShell('/etc/init.d/mysqld stop') |
||||
stop() |
||||
mw.execShell('cp -rf ' + s_datadir + '/* ' + t_datadir + '/') |
||||
mw.execShell('chown -R mysql mysql ' + t_datadir) |
||||
mw.execShell('chmod -R 755 ' + t_datadir) |
||||
mw.execShell('rm -f ' + t_datadir + '/*.pid') |
||||
mw.execShell('rm -f ' + t_datadir + '/*.err') |
||||
|
||||
path = getServerDir() |
||||
myfile = path + '/etc/my.cnf' |
||||
mycnf = mw.readFile(myfile) |
||||
mw.writeFile(path + '/etc/my_backup.cnf', mycnf) |
||||
|
||||
mycnf = mycnf.replace(s_datadir, t_datadir) |
||||
mw.writeFile(myfile, mycnf) |
||||
start() |
||||
|
||||
result = mw.execShell( |
||||
'ps aux|grep mysqld| grep -v grep|grep -v python') |
||||
if len(result[0]) > 10: |
||||
mw.writeFile('data/datadir.pl', t_datadir) |
||||
return mw.returnJson(True, '存储目录迁移成功!') |
||||
else: |
||||
mw.execShell('pkill -9 mysqld') |
||||
mw.writeFile(myfile, mw.readFile(path + '/etc/my_backup.cnf')) |
||||
start() |
||||
return mw.returnJson(False, '文件迁移失败!') |
||||
|
||||
|
||||
def getMyPort(): |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = 'port\s*=\s*(.*)' |
||||
tmp = re.search(rep, content) |
||||
return tmp.groups()[0].strip() |
||||
|
||||
|
||||
def setMyPort(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['port']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
port = args['port'] |
||||
file = getConf() |
||||
content = mw.readFile(file) |
||||
rep = "port\s*=\s*([0-9]+)\s*\n" |
||||
content = re.sub(rep, 'port = ' + port + '\n', content) |
||||
mw.writeFile(file, content) |
||||
restart() |
||||
return mw.returnJson(True, '编辑成功!') |
||||
|
||||
|
||||
def runInfo(): |
||||
|
||||
if status(version) == 'stop': |
||||
return mw.returnJson(False, 'PG未启动', []) |
||||
|
||||
db = pMysqlDb() |
||||
data = db.query('show global status') |
||||
gets = ['Max_used_connections', 'Com_commit', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes', |
||||
'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects', |
||||
'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join', |
||||
'Select_range_check', 'Sort_merge_passes', 'Table_locks_waited', 'Threads_cached', 'Threads_connected', 'Threads_created', 'Threads_running', 'Connections', 'Uptime'] |
||||
|
||||
result = {} |
||||
# print(data) |
||||
for d in data: |
||||
vname = d["Variable_name"] |
||||
for g in gets: |
||||
if vname == g: |
||||
result[g] = d["Value"] |
||||
|
||||
# print(result, int(result['Uptime'])) |
||||
result['Run'] = int(time.time()) - int(result['Uptime']) |
||||
tmp = db.query('show master status') |
||||
try: |
||||
result['File'] = tmp[0]["File"] |
||||
result['Position'] = tmp[0]["Position"] |
||||
except: |
||||
result['File'] = 'OFF' |
||||
result['Position'] = 'OFF' |
||||
return mw.getJson(result) |
||||
|
||||
|
||||
def myDbStatus(): |
||||
result = {} |
||||
db = pMysqlDb() |
||||
data = db.query('show variables') |
||||
isError = isSqlError(data) |
||||
if isError != None: |
||||
return isError |
||||
|
||||
gets = ['table_open_cache', 'thread_cache_size', 'key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size', |
||||
'innodb_additional_mem_pool_size', 'innodb_log_buffer_size', 'max_connections', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size'] |
||||
result['mem'] = {} |
||||
for d in data: |
||||
vname = d['Variable_name'] |
||||
for g in gets: |
||||
# print(g) |
||||
if vname == g: |
||||
result['mem'][g] = d["Value"] |
||||
return mw.getJson(result) |
||||
|
||||
|
||||
def setDbStatus(): |
||||
gets = ['key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'max_connections', |
||||
'table_open_cache', 'thread_cache_size', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size'] |
||||
emptys = ['max_connections', 'thread_cache_size', 'table_open_cache'] |
||||
args = getArgs() |
||||
conFile = getConf() |
||||
content = mw.readFile(conFile) |
||||
n = 0 |
||||
for g in gets: |
||||
s = 'M' |
||||
if n > 5: |
||||
s = 'K' |
||||
if g in emptys: |
||||
s = '' |
||||
rep = '\s*' + g + '\s*=\s*\d+(M|K|k|m|G)?\n' |
||||
c = g + ' = ' + args[g] + s + '\n' |
||||
if content.find(g) != -1: |
||||
content = re.sub(rep, '\n' + c, content, 1) |
||||
else: |
||||
content = content.replace('[mysqld]\n', '[mysqld]\n' + c) |
||||
n += 1 |
||||
mw.writeFile(conFile, content) |
||||
return mw.returnJson(True, '设置成功!') |
||||
|
||||
|
||||
def isSqlError(mysqlMsg): |
||||
# 检测数据库执行错误 |
||||
mysqlMsg = str(mysqlMsg) |
||||
if "MySQLdb" in mysqlMsg: |
||||
return mw.returnJson(False, 'MySQLdb组件缺失! <br>进入SSH命令行输入: pip install mysql-python | pip install mysqlclient==2.0.3') |
||||
if "2002," in mysqlMsg: |
||||
return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!') |
||||
if "2003," in mysqlMsg: |
||||
return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)") |
||||
if "using password:" in mysqlMsg: |
||||
return mw.returnJson(False, '数据库管理密码错误!') |
||||
if "1045" in mysqlMsg: |
||||
return mw.returnJson(False, '连接错误!') |
||||
if "SQL syntax" in mysqlMsg: |
||||
return mw.returnJson(False, 'SQL语法错误!') |
||||
if "Connection refused" in mysqlMsg: |
||||
return mw.returnJson(False, '数据库连接失败,请检查数据库服务是否启动!') |
||||
if "1133" in mysqlMsg: |
||||
return mw.returnJson(False, '数据库用户不存在!') |
||||
if "1007" in mysqlMsg: |
||||
return mw.returnJson(False, '数据库已经存在!') |
||||
return None |
||||
|
||||
|
||||
def __createUser(dbname, username, password, address): |
||||
pdb = pMysqlDb() |
||||
|
||||
if username == 'root': |
||||
dbname = '*' |
||||
|
||||
pdb.execute( |
||||
"CREATE USER `%s`@`localhost` IDENTIFIED BY '%s'" % (username, password)) |
||||
pdb.execute( |
||||
"grant all privileges on %s.* to `%s`@`localhost`" % (dbname, username)) |
||||
for a in address.split(','): |
||||
pdb.execute( |
||||
"CREATE USER `%s`@`%s` IDENTIFIED BY '%s'" % (username, a, password)) |
||||
pdb.execute( |
||||
"grant all privileges on %s.* to `%s`@`%s`" % (dbname, username, a)) |
||||
pdb.execute("flush privileges") |
||||
|
||||
|
||||
def getDbBackupListFunc(dbname=''): |
||||
bkDir = mw.getRootDir() + '/backup/database' |
||||
blist = os.listdir(bkDir) |
||||
r = [] |
||||
|
||||
bname = 'db_' + dbname |
||||
blen = len(bname) |
||||
for x in blist: |
||||
fbstr = x[0:blen] |
||||
if fbstr == bname: |
||||
r.append(x) |
||||
return r |
||||
|
||||
|
||||
def setDbBackup(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['name']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
scDir = mw.getRunDir() + '/scripts/backup.py' |
||||
|
||||
cmd = 'python ' + scDir + ' database ' + args['name'] + ' 3' |
||||
os.system(cmd) |
||||
return mw.returnJson(True, 'ok') |
||||
|
||||
|
||||
def importDbBackup(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['file', 'name']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
file = args['file'] |
||||
name = args['name'] |
||||
|
||||
file_path = mw.getRootDir() + '/backup/database/' + file |
||||
file_path_sql = mw.getRootDir() + '/backup/database/' + file.replace('.gz', '') |
||||
|
||||
if not os.path.exists(file_path_sql): |
||||
cmd = 'cd ' + mw.getRootDir() + '/backup/database && gzip -d ' + file |
||||
mw.execShell(cmd) |
||||
|
||||
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') |
||||
|
||||
mysql_cmd = mw.getRootDir() + '/server/mysql/bin/mysql -uroot -p' + pwd + \ |
||||
' ' + name + ' < ' + file_path_sql |
||||
|
||||
# print(mysql_cmd) |
||||
os.system(mysql_cmd) |
||||
return mw.returnJson(True, 'ok') |
||||
|
||||
|
||||
def deleteDbBackup(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['filename']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
bkDir = mw.getRootDir() + '/backup/database' |
||||
|
||||
os.remove(bkDir + '/' + args['filename']) |
||||
return mw.returnJson(True, 'ok') |
||||
|
||||
|
||||
def getDbBackupList(): |
||||
args = getArgs() |
||||
data = checkArgs(args, ['name']) |
||||
if not data[0]: |
||||
return data[1] |
||||
|
||||
r = getDbBackupListFunc(args['name']) |
||||
bkDir = mw.getRootDir() + '/backup/database' |
||||
rr = [] |
||||
for x in range(0, len(r)): |
||||
p = bkDir + '/' + r[x] |
||||
data = {} |
||||
data['name'] = r[x] |
||||
|
||||
rsize = os.path.getsize(p) |
||||
data['size'] = mw.toSize(rsize) |
||||
|
||||
t = os.path.getctime(p) |
||||
t = time.localtime(t) |
||||
|
||||
data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t) |
||||
rr.append(data) |
||||
|
||||
data['file'] = p |
||||
|
||||
return mw.returnJson(True, 'ok', rr) |
||||
|
||||
|
||||
def getDbList(): |
||||
args = getArgs() |
||||
page = 1 |
||||
page_size = 10 |
||||
search = '' |
||||
data = {} |
||||
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'] |
||||
|
||||
conn = pSqliteDb('databases') |
||||
limit = str((page - 1) * page_size) + ',' + str(page_size) |
||||
condition = '' |
||||
if not search == '': |
||||
condition = "name like '%" + search + "%'" |
||||
field = 'id,pid,name,username,password,accept,rw,ps,addtime' |
||||
clist = conn.where(condition, ()).field( |
||||
field).limit(limit).order('id desc').select() |
||||
|
||||
for x in range(0, len(clist)): |
||||
dbname = clist[x]['name'] |
||||
blist = getDbBackupListFunc(dbname) |
||||
# print(blist) |
||||
clist[x]['is_backup'] = False |
||||
if len(blist) > 0: |
||||
clist[x]['is_backup'] = True |
||||
|
||||
count = conn.where(condition, ()).count() |
||||
_page = {} |
||||
_page['count'] = count |
||||
_page['p'] = page |
||||
_page['row'] = page_size |
||||
_page['tojs'] = 'dbList' |
||||
data['page'] = mw.getPage(_page) |
||||
data['data'] = clist |
||||
|
||||
info = {} |
||||
info['root_pwd'] = pSqliteDb('config').where( |
||||
'id=?', (1,)).getField('mysql_root') |
||||
data['info'] = info |
||||
|
||||
return mw.getJson(data) |
||||
|
||||
|
||||
def installPreInspection(version): |
||||
return 'ok' |
||||
|
||||
|
||||
def uninstallPreInspection(version): |
||||
# return "请手动删除MySQL[{}]".format(version) |
||||
return 'ok' |
||||
|
||||
if __name__ == "__main__": |
||||
func = sys.argv[1] |
||||
|
||||
version = "14.4" |
||||
version_pl = getServerDir() + "/version.pl" |
||||
if os.path.exists(version_pl): |
||||
version = mw.readFile(version_pl).strip() |
||||
|
||||
if func == 'status': |
||||
print(status(version)) |
||||
elif func == 'start': |
||||
print(start(version)) |
||||
elif func == 'stop': |
||||
print(stop(version)) |
||||
elif func == 'restart': |
||||
print(restart(version)) |
||||
elif func == 'reload': |
||||
print(reload(version)) |
||||
elif func == 'initd_status': |
||||
print(initdStatus()) |
||||
elif func == 'initd_install': |
||||
print(initdInstall()) |
||||
elif func == 'initd_uninstall': |
||||
print(initdUinstall()) |
||||
elif func == 'install_pre_inspection': |
||||
print(installPreInspection(version)) |
||||
elif func == 'uninstall_pre_inspection': |
||||
print(uninstallPreInspection(version)) |
||||
elif func == 'conf': |
||||
print(getConf()) |
||||
elif func == 'run_info': |
||||
print(runInfo()) |
||||
else: |
||||
print('error') |
@ -0,0 +1,18 @@ |
||||
{ |
||||
"title":"PostgreSQL", |
||||
"tip":"soft", |
||||
"name":"postgresql", |
||||
"type":"运行环境", |
||||
"ps":"功能强大的开源数据库", |
||||
"coexist": false, |
||||
"install_pre_inspection":true, |
||||
"uninstall_pre_inspection":true, |
||||
"versions":["14.4"], |
||||
"shell":"install.sh", |
||||
"checks":"server/postgresql", |
||||
"path":"server/postgresql", |
||||
"author":"postgresql", |
||||
"home":"https://www.postgresql.org/", |
||||
"date":"2022-08-07", |
||||
"pid": "2" |
||||
} |
@ -0,0 +1,16 @@ |
||||
[Unit] |
||||
Description=PostgreSQL: a powerful open source database |
||||
After=network.target |
||||
|
||||
[Service] |
||||
Type=forking |
||||
User=postgres |
||||
Group=postgres |
||||
WorkingDirectory={$APP_PATH} |
||||
ExecStart={$APP_PATH}/pg_ctl start -D {$APP_PATH}/data |
||||
ExecReload={$APP_PATH}/pg_ctl restart -D {$APP_PATH}/data |
||||
ExecStop={$APP_PATH}/pg_ctl stop -D {$APP_PATH}/data |
||||
PrivateTmp=false |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,60 @@ |
||||
#!/bin/bash |
||||
# chkconfig: 2345 55 25 |
||||
# description: PostgreSQL Service |
||||
|
||||
### BEGIN INIT INFO |
||||
# Provides: Midoks |
||||
# Required-Start: $all |
||||
# Required-Stop: $all |
||||
# Default-Start: 2 3 4 5 |
||||
# Default-Stop: 0 1 6 |
||||
# Short-Description: starts PostgreSQL |
||||
# Description: starts the PostgreSQL |
||||
### END INIT INFO |
||||
|
||||
|
||||
PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||
export LC_ALL="en_US.UTF-8" |
||||
|
||||
MW_PATH={$SERVER_PATH} |
||||
PATH=$PATH:$MW_PATH/bin |
||||
|
||||
if [ -f $MW_PATH/bin/activate ];then |
||||
source $MW_PATH/bin/activate |
||||
fi |
||||
|
||||
pg_start() |
||||
{ |
||||
touch {$APP_PATH}/logs/server.log |
||||
{$APP_PATH}/bin/pg_ctl -D {$APP_PATH}/data -l {$APP_PATH}/logs/server.log start |
||||
} |
||||
|
||||
|
||||
pg_stop() |
||||
{ |
||||
{$APP_PATH}/bin/pg_ctl -D {$APP_PATH}/data -l {$APP_PATH}/logs/server.log stop |
||||
} |
||||
|
||||
|
||||
|
||||
pg_status() |
||||
{ |
||||
echo "123123" |
||||
} |
||||
|
||||
|
||||
pg_reload() |
||||
{ |
||||
echo "123" |
||||
} |
||||
|
||||
|
||||
|
||||
case "$1" in |
||||
'start') pg_start;; |
||||
'stop') pg_stop;; |
||||
'reload') pg_reload;; |
||||
'restart') |
||||
pg_stop |
||||
pg_start;; |
||||
esac |
@ -0,0 +1,42 @@ |
||||
#!/bin/bash |
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||
export PATH |
||||
|
||||
curPath=`pwd` |
||||
rootPath=$(dirname "$curPath") |
||||
rootPath=$(dirname "$rootPath") |
||||
serverPath=$(dirname "$rootPath") |
||||
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl |
||||
|
||||
action=$1 |
||||
type=$2 |
||||
|
||||
if [ "${2}" == "" ];then |
||||
echo '缺少安装脚本...' > $install_tmp |
||||
exit 0 |
||||
fi |
||||
|
||||
if [ ! -d $curPath/versions/$2 ];then |
||||
echo '缺少安装脚本2...' > $install_tmp |
||||
exit 0 |
||||
fi |
||||
|
||||
# if [ "${action}" == "uninstall" ];then |
||||
# if [ -f /usr/lib/systemd/system/postgresql.service ] || [ -f /lib/systemd/system/postgresql.service ];then |
||||
# systemctl stop postgresql |
||||
# systemctl disable postgresql |
||||
# rm -rf /usr/lib/systemd/system/postgresql.service |
||||
# rm -rf /lib/systemd/system/postgresql.service |
||||
# systemctl daemon-reload |
||||
# fi |
||||
# fi |
||||
|
||||
sh -x $curPath/versions/$2/install.sh $1 |
||||
|
||||
if [ "${action}" == "install" ] && [ -d $serverPath/postgresql ];then |
||||
#初始化 |
||||
# cd ${rootPath} && python3 ${rootPath}/plugins/postgresql/index.py start ${type} |
||||
# cd ${rootPath} && python3 ${rootPath}/plugins/postgresql/index.py initd_install ${type} |
||||
fi |
@ -0,0 +1,97 @@ |
||||
#!/bin/bash |
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||
export PATH |
||||
|
||||
#https://www.postgresql.org/ftp/source/ |
||||
|
||||
curPath=`pwd` |
||||
rootPath=$(dirname "$curPath") |
||||
rootPath=$(dirname "$rootPath") |
||||
serverPath=$(dirname "$rootPath") |
||||
sysName=`uname` |
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl |
||||
postgreDir=${serverPath}/source/postgresql |
||||
|
||||
VERSION=14.4 |
||||
|
||||
Install_App() |
||||
{ |
||||
mkdir -p ${postgreDir} |
||||
echo '正在安装脚本文件...' > $install_tmp |
||||
|
||||
if id postgres &> /dev/null ;then |
||||
echo "postgres UID is `id -u postgres`" |
||||
echo "postgres Shell is `grep "^postgres:" /etc/passwd |cut -d':' -f7 `" |
||||
else |
||||
groupadd postgres |
||||
useradd -g postgres postgres |
||||
fi |
||||
|
||||
if [ "$sysName" != "Darwin" ];then |
||||
mkdir -p /var/log/mariadb |
||||
touch /var/log/mariadb/mariadb.log |
||||
fi |
||||
|
||||
# ----- cpu start ------ |
||||
if [ -z "${cpuCore}" ]; then |
||||
cpuCore="1" |
||||
fi |
||||
|
||||
if [ -f /proc/cpuinfo ];then |
||||
cpuCore=`cat /proc/cpuinfo | grep "processor" | wc -l` |
||||
fi |
||||
|
||||
MEM_INFO=$(free -m|grep Mem|awk '{printf("%.f",($2)/1024)}') |
||||
if [ "${cpuCore}" != "1" ] && [ "${MEM_INFO}" != "0" ];then |
||||
if [ "${cpuCore}" -gt "${MEM_INFO}" ];then |
||||
cpuCore="${MEM_INFO}" |
||||
fi |
||||
else |
||||
cpuCore="1" |
||||
fi |
||||
# ----- cpu end ------ |
||||
|
||||
if [ ! -f ${postgreDir}/postgresql-${VERSION}.tar.bz2 ];then |
||||
wget --no-check-certificate -O ${postgreDir}/postgresql-${VERSION}.tar.bz2 --tries=3 https://ftp.postgresql.org/pub/source/v${VERSION}/postgresql-${VERSION}.tar.bz2 |
||||
fi |
||||
|
||||
if [ ! -d ${postgreDir}/postgresql-${VERSION} ];then |
||||
cd ${postgreDir} && tar -zxvf ${postgreDir}/postgresql-${VERSION}.tar.bz2 |
||||
fi |
||||
|
||||
|
||||
if [ ! -d $serverPath/postgresql ];then |
||||
cd ${postgreDir}/postgresql-${VERSION} && ./configure \ |
||||
--prefix=$serverPath/postgresql |
||||
# --with-openssl \ |
||||
# --with-pgport=33206 |
||||
|
||||
echo "cd ${postgreDir}/postgresql-${VERSION} && ./configure \ |
||||
--prefix=$serverPath/postgresql" |
||||
# --with-openssl \ |
||||
# --with-pgport=33206 |
||||
make -j${cpuCore} && make install && make clean |
||||
fi |
||||
|
||||
if [ -d $serverPath/postgresql ];then |
||||
echo "{$VERSION}" > $serverPath/postgresql/version.pl |
||||
echo 'install successful' > $install_tmp |
||||
else |
||||
echo 'install fail' > $install_tmp |
||||
echo 'install fail'>&2 |
||||
fi |
||||
} |
||||
|
||||
Uninstall_App() |
||||
{ |
||||
rm -rf $serverPath/postgresql |
||||
echo '卸载完成' > $install_tmp |
||||
} |
||||
|
||||
action=$1 |
||||
if [ "${1}" == "install" ];then |
||||
Install_App |
||||
else |
||||
Uninstall_App |
||||
fi |
Loading…
Reference in new issue