update admin_panel & backup via python
This commit is contained in:
parent
dc6eb82af1
commit
a8702ae1af
196
serverfiles/baks/backup_db.py
Normal file
196
serverfiles/baks/backup_db.py
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
#### @martysama0134 backup scripts ####
|
||||||
|
### Inside /etc/crontab paste:
|
||||||
|
## for automatic backups every hour:
|
||||||
|
# 0 * * * * root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_db.py dump
|
||||||
|
## for automatic clean of backups older than 7 days every week:
|
||||||
|
# 0 0 * * 1 root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_db.py wclean
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
import platform
|
||||||
|
|
||||||
|
from subprocess import check_output as sp_co, call as sp_call, CalledProcessError as sp_CalledProcessError
|
||||||
|
def fShell(szCmd, bRet=False):
|
||||||
|
try:
|
||||||
|
if bRet:
|
||||||
|
return sp_co(szCmd, shell=True)[:-1] # remove final \n
|
||||||
|
else:
|
||||||
|
return sp_call(szCmd, shell=True)
|
||||||
|
except sp_CalledProcessError:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def SlashFix(pathname):
|
||||||
|
if platform.system() in ("FreeBSD", "Linux"):
|
||||||
|
return pathname.replace("\\", "/")
|
||||||
|
elif platform.system()=="Windows":
|
||||||
|
return pathname.replace("/", "\\")
|
||||||
|
return pathname
|
||||||
|
|
||||||
|
def SymLinkCreate(src, dst, is_file):
|
||||||
|
src = SlashFix(src)
|
||||||
|
dst = SlashFix(dst)
|
||||||
|
if platform.system() == "FreeBSD":
|
||||||
|
fShell(f"ln -Ffnsw {src} {dst}")
|
||||||
|
elif platform.system() == "Linux":
|
||||||
|
fShell(f"ln -Ffns {src} {dst}")
|
||||||
|
elif platform.system() == "Windows":
|
||||||
|
if is_file:
|
||||||
|
fShell(f"mklink {dst} {src}")
|
||||||
|
else:
|
||||||
|
fShell(f"mklink /D {dst} {src}")
|
||||||
|
|
||||||
|
def IsWindows(): return platform.system()=="Windows"
|
||||||
|
def cecho(text): print(text) if IsWindows() else print("\033[36m" + text + "\033[0m")
|
||||||
|
|
||||||
|
DATE = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||||
|
|
||||||
|
OUTPATH = "db"
|
||||||
|
MY_LOGF = os.path.join(OUTPATH, "log.txt")
|
||||||
|
|
||||||
|
MYSQLDUMP = "/usr/local/bin/mysqldump"
|
||||||
|
if IsWindows():
|
||||||
|
MYSQLDUMP = "mysqldump"
|
||||||
|
|
||||||
|
MY_HOST = "localhost"
|
||||||
|
MY_USER = "root"
|
||||||
|
MY_PASS = "password"
|
||||||
|
PREFIX = "srv1_"
|
||||||
|
DATABASES = [
|
||||||
|
"mysql",
|
||||||
|
PREFIX+"account",
|
||||||
|
PREFIX+"common",
|
||||||
|
PREFIX+"player",
|
||||||
|
PREFIX+"log",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Determine MySQL version
|
||||||
|
def process_flags(FLAGS):
|
||||||
|
global mysql_version
|
||||||
|
mysql_version = subprocess.check_output(["mysql", "--version"]).decode("utf-8").split()[4]
|
||||||
|
if mysql_version.startswith("8."):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif mysql_version.startswith("5.7"):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif mysql_version.startswith("5.6"):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif "MariaDB" in mysql_version:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
logging.error(f"Unknown MySQL version: {mysql_version}")
|
||||||
|
|
||||||
|
def delete_old_backups():
|
||||||
|
for entry in os.listdir(OUTPATH):
|
||||||
|
# Check if entry is a directory and matches the format "YYYYmmdd-HHMMSS"
|
||||||
|
if os.path.isdir(os.path.join(OUTPATH, entry)) and re.match(r'\d{8}-\d{6}', entry):
|
||||||
|
shutil.rmtree(os.path.join(OUTPATH, entry))
|
||||||
|
logging.info(f"Deleted old backup: {entry}")
|
||||||
|
|
||||||
|
def delete_1week_old_backups():
|
||||||
|
for entry in os.listdir(OUTPATH):
|
||||||
|
# Check if entry is a directory and matches the format "YYYYmmdd-HHMMSS"
|
||||||
|
if os.path.isdir(os.path.join(OUTPATH, entry)) and re.match(r'\d{8}-\d{6}', entry):
|
||||||
|
try:
|
||||||
|
# Convert the directory name to datetime format
|
||||||
|
backup_date = datetime.strptime(entry, "%Y%m%d-%H%M%S")
|
||||||
|
# Delete the directory if it's older than a certain threshold
|
||||||
|
if datetime.now() - backup_date > timedelta(days=7):
|
||||||
|
shutil.rmtree(os.path.join(OUTPATH, entry))
|
||||||
|
logging.info(f"Deleted old backup: {entry}")
|
||||||
|
except ValueError:
|
||||||
|
# Skip directories that do not match the expected format
|
||||||
|
continue
|
||||||
|
|
||||||
|
def init_logging():
|
||||||
|
logging.basicConfig(filename=MY_LOGF, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler = logging.StreamHandler(sys.stdout)
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(console_formatter)
|
||||||
|
logging.getLogger('').addHandler(console_handler)
|
||||||
|
|
||||||
|
def dump():
|
||||||
|
"""Save backups"""
|
||||||
|
os.makedirs(os.path.join(OUTPATH, DATE), exist_ok=True)
|
||||||
|
for db in DATABASES:
|
||||||
|
logging.info(f"Dumping {DATE}/{db}.sql.gz...")
|
||||||
|
FLAGS = []
|
||||||
|
process_flags(FLAGS)
|
||||||
|
if db==PREFIX+"log":
|
||||||
|
FLAGS.append("--no-data")
|
||||||
|
command = f"{MYSQLDUMP} {' '.join(FLAGS)} -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db} | gzip -9 > {OUTPATH}/{DATE}/{db}.sql.gz"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
# create symlink
|
||||||
|
SymLinkCreate(f"{DATE}/{db}.sql.gz", f"{OUTPATH}/{db}.sql.gz", is_file=True)
|
||||||
|
|
||||||
|
def recovery():
|
||||||
|
"""Recovery backups"""
|
||||||
|
for db in DATABASES:
|
||||||
|
logging.info(f"Recovering {db}.sql.gz...")
|
||||||
|
command = f"gunzip < {OUTPATH}/{db}.sql.gz | mysql -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db}"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def clean():
|
||||||
|
"""Delete all the backups"""
|
||||||
|
delete_old_backups()
|
||||||
|
|
||||||
|
def lclean():
|
||||||
|
"""Delete the log file"""
|
||||||
|
if os.path.exists(MY_LOGF):
|
||||||
|
os.remove(MY_LOGF)
|
||||||
|
|
||||||
|
def wclean():
|
||||||
|
"""Delete the backups older than 1 week"""
|
||||||
|
delete_1week_old_backups()
|
||||||
|
|
||||||
|
def cleanall():
|
||||||
|
"""Delete all the backups and logs"""
|
||||||
|
clean()
|
||||||
|
lclean()
|
||||||
|
|
||||||
|
actions = {
|
||||||
|
"dump": dump,
|
||||||
|
"recovery": recovery,
|
||||||
|
"clean": clean,
|
||||||
|
"lclean": lclean,
|
||||||
|
"wclean": wclean,
|
||||||
|
"cleanall": cleanall
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute the appropriate function based on user input
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if not os.path.exists(OUTPATH):
|
||||||
|
os.makedirs(OUTPATH)
|
||||||
|
|
||||||
|
init_logging()
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Available actions:")
|
||||||
|
for action in actions.keys():
|
||||||
|
print(" {}".format(action))
|
||||||
|
|
||||||
|
ret = input('Enter an action: ').split()
|
||||||
|
if not ret:
|
||||||
|
cecho('No argument provided. Quitting.')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
action = ret[0]
|
||||||
|
commands = ret[1:] if len(ret) >= 2 else []
|
||||||
|
else:
|
||||||
|
action = sys.argv[1]
|
||||||
|
commands = sys.argv[2:] if len(sys.argv) >= 3 else []
|
||||||
|
# print(" ".join(sys.argv[1:]))
|
||||||
|
|
||||||
|
commands = " ".join(commands)
|
||||||
|
|
||||||
|
selected_action = actions.get(action)
|
||||||
|
if selected_action:
|
||||||
|
logging.info(f"Started action {action}")
|
||||||
|
selected_action()
|
||||||
|
logging.info(f"Stopped action {action}")
|
||||||
|
else:
|
||||||
|
print("Invalid action. Please choose one of: {}".format(", ".join(actions.keys())))
|
||||||
156
serverfiles/baks/backup_dbrev.py
Normal file
156
serverfiles/baks/backup_dbrev.py
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
#### @martysama0134 backup scripts ####
|
||||||
|
### Inside /etc/crontab paste:
|
||||||
|
## for automatic backups every hour:
|
||||||
|
# 0 * * * * root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_dbrev.py dump
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
import platform
|
||||||
|
|
||||||
|
def IsWindows(): return platform.system()=="Windows"
|
||||||
|
def cecho(text): print(text) if IsWindows() else print("\033[36m" + text + "\033[0m")
|
||||||
|
|
||||||
|
OUTPATH = "dbrev"
|
||||||
|
MY_LOGF = os.path.join(OUTPATH, "log.txt")
|
||||||
|
|
||||||
|
MYSQLDUMP = "/usr/local/bin/mysqldump"
|
||||||
|
if IsWindows():
|
||||||
|
MYSQLDUMP = "mysqldump"
|
||||||
|
|
||||||
|
MY_HOST = "localhost"
|
||||||
|
MY_USER = "root"
|
||||||
|
MY_PASS = "password"
|
||||||
|
PREFIX = "srv1_"
|
||||||
|
DATABASES = [
|
||||||
|
"mysql",
|
||||||
|
PREFIX+"account",
|
||||||
|
PREFIX+"common",
|
||||||
|
PREFIX+"player",
|
||||||
|
PREFIX+"log",
|
||||||
|
]
|
||||||
|
TABLES = {
|
||||||
|
PREFIX+"account" : "block_exception GameTime GameTimeIP iptocountry string",
|
||||||
|
PREFIX+"common" : "",
|
||||||
|
PREFIX+"player" : "banword item_attr item_attr_rare item_proto land mob_proto object_proto refine_proto shop shop_item skill_proto string",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine MySQL version
|
||||||
|
def process_flags(FLAGS):
|
||||||
|
global mysql_version
|
||||||
|
mysql_version = subprocess.check_output(["mysql", "--version"]).decode("utf-8").split()[4]
|
||||||
|
if mysql_version.startswith("8."):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif mysql_version.startswith("5.7"):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif mysql_version.startswith("5.6"):
|
||||||
|
FLAGS.append("--set-gtid-purged=OFF")
|
||||||
|
elif "MariaDB" in mysql_version:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
logging.error(f"Unknown MySQL version: {mysql_version}")
|
||||||
|
|
||||||
|
def delete_old_backups():
|
||||||
|
for entry in os.listdir(OUTPATH):
|
||||||
|
# Check if entry is a file and matches the format "*.sql"
|
||||||
|
if os.path.isfile(os.path.join(OUTPATH, entry)) and re.match(r'.*\.sql$', entry):
|
||||||
|
os.remove(os.path.join(OUTPATH, entry))
|
||||||
|
logging.info(f"Deleted old backup: {entry}")
|
||||||
|
|
||||||
|
def init_logging():
|
||||||
|
logging.basicConfig(filename=MY_LOGF, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler = logging.StreamHandler(sys.stdout)
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(console_formatter)
|
||||||
|
logging.getLogger('').addHandler(console_handler)
|
||||||
|
|
||||||
|
def dump():
|
||||||
|
"""Save backups"""
|
||||||
|
os.makedirs(OUTPATH, exist_ok=True)
|
||||||
|
|
||||||
|
for db in DATABASES:
|
||||||
|
logging.info(f"Dumping {db}-schema.sql...")
|
||||||
|
FLAGS = ["--no-data","--skip-extended-insert","--skip-dump-date"]
|
||||||
|
process_flags(FLAGS)
|
||||||
|
command = f"{MYSQLDUMP} {' '.join(FLAGS)} -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db} > {OUTPATH}/{db}-schema.sql"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
for db, tables in TABLES.items():
|
||||||
|
logging.info(f"Dumping {db}-data.sql...")
|
||||||
|
FLAGS = ["--no-create-info","--skip-extended-insert","--skip-dump-date"]
|
||||||
|
process_flags(FLAGS)
|
||||||
|
command = f"{MYSQLDUMP} {' '.join(FLAGS)} -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db} {tables} > {OUTPATH}/{db}-data.sql"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def recovery():
|
||||||
|
"""Recovery backups"""
|
||||||
|
for db in DATABASES:
|
||||||
|
logging.info(f"Recovering {db}-schema.sql...")
|
||||||
|
command = f"mysql -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db} 2>> {MY_LOGF} < {OUTPATH}/{db}-schema.sql"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
for db, tables in TABLES.items():
|
||||||
|
logging.info(f"Recovering {db}-data.sql...")
|
||||||
|
command = f"mysql -u {MY_USER} -p{MY_PASS} -h {MY_HOST} {db} 2>> {MY_LOGF} < {OUTPATH}/{db}-data.sql"
|
||||||
|
subprocess.run(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def clean():
|
||||||
|
"""Delete all the backups"""
|
||||||
|
delete_old_backups()
|
||||||
|
|
||||||
|
def lclean():
|
||||||
|
"""Delete the log file"""
|
||||||
|
if os.path.exists(MY_LOGF):
|
||||||
|
os.remove(MY_LOGF)
|
||||||
|
|
||||||
|
def cleanall():
|
||||||
|
"""Delete all the backups and logs"""
|
||||||
|
clean()
|
||||||
|
lclean()
|
||||||
|
|
||||||
|
actions = {
|
||||||
|
"dump": dump,
|
||||||
|
"recovery": recovery,
|
||||||
|
"clean": clean,
|
||||||
|
"lclean": lclean,
|
||||||
|
"cleanall": cleanall,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute the appropriate function based on user input
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if not os.path.exists(OUTPATH):
|
||||||
|
os.makedirs(OUTPATH)
|
||||||
|
|
||||||
|
init_logging()
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Available actions:")
|
||||||
|
for action in actions.keys():
|
||||||
|
print(" {}".format(action))
|
||||||
|
|
||||||
|
ret = input('Enter an action: ').split()
|
||||||
|
if not ret:
|
||||||
|
cecho('No argument provided. Quitting.')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
action = ret[0]
|
||||||
|
commands = ret[1:] if len(ret) >= 2 else []
|
||||||
|
else:
|
||||||
|
action = sys.argv[1]
|
||||||
|
commands = sys.argv[2:] if len(sys.argv) >= 3 else []
|
||||||
|
# print(" ".join(sys.argv[1:]))
|
||||||
|
|
||||||
|
commands = " ".join(commands)
|
||||||
|
|
||||||
|
selected_action = actions.get(action)
|
||||||
|
if selected_action:
|
||||||
|
logging.info(f"Started action {action}")
|
||||||
|
selected_action()
|
||||||
|
logging.info(f"Stopped action {action}")
|
||||||
|
else:
|
||||||
|
print("Invalid action. Please choose one of: {}".format(", ".join(actions.keys())))
|
||||||
172
serverfiles/baks/backup_fs.py
Normal file
172
serverfiles/baks/backup_fs.py
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
#### @martysama0134 backup scripts ####
|
||||||
|
### Inside /etc/crontab paste:
|
||||||
|
## for automatic backups every hour:
|
||||||
|
# 0 * * * * root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_fs.py dump
|
||||||
|
## for automatic clean of backups older than 7 days every week:
|
||||||
|
# 0 0 * * 1 root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_fs.py wclean
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
import platform
|
||||||
|
|
||||||
|
from subprocess import check_output as sp_co, call as sp_call, CalledProcessError as sp_CalledProcessError
|
||||||
|
def fShell(szCmd, bRet=False):
|
||||||
|
try:
|
||||||
|
if bRet:
|
||||||
|
return sp_co(szCmd, shell=True)[:-1] # remove final \n
|
||||||
|
else:
|
||||||
|
return sp_call(szCmd, shell=True)
|
||||||
|
except sp_CalledProcessError:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def SlashFix(pathname):
|
||||||
|
if platform.system() in ("FreeBSD", "Linux"):
|
||||||
|
return pathname.replace("\\", "/")
|
||||||
|
elif platform.system()=="Windows":
|
||||||
|
return pathname.replace("/", "\\")
|
||||||
|
return pathname
|
||||||
|
|
||||||
|
def SymLinkCreate(src, dst, is_file):
|
||||||
|
src = SlashFix(src)
|
||||||
|
dst = SlashFix(dst)
|
||||||
|
if platform.system() == "FreeBSD":
|
||||||
|
fShell(f"ln -Ffnsw {src} {dst}")
|
||||||
|
elif platform.system() == "Linux":
|
||||||
|
fShell(f"ln -Ffns {src} {dst}")
|
||||||
|
elif platform.system() == "Windows":
|
||||||
|
if is_file:
|
||||||
|
fShell(f"mklink {dst} {src}")
|
||||||
|
else:
|
||||||
|
fShell(f"mklink /D {dst} {src}")
|
||||||
|
|
||||||
|
def IsWindows(): return platform.system()=="Windows"
|
||||||
|
def cecho(text): print(text) if IsWindows() else print("\033[36m" + text + "\033[0m")
|
||||||
|
|
||||||
|
DATE = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||||
|
PYBIN = "python3"
|
||||||
|
if IsWindows():
|
||||||
|
PYBIN = 'python'
|
||||||
|
|
||||||
|
BASEPATH = os.getcwd()
|
||||||
|
SVFPATH = os.path.join(BASEPATH, "..")
|
||||||
|
MAINPATH = os.path.join(SVFPATH, "main")
|
||||||
|
|
||||||
|
OUTPATH = "fs"
|
||||||
|
MY_LOGF = os.path.join(OUTPATH, "log.txt")
|
||||||
|
|
||||||
|
def delete_old_backups():
|
||||||
|
for entry in os.listdir(OUTPATH):
|
||||||
|
# Check if entry is a directory and matches the format "YYYYmmdd-HHMMSS"
|
||||||
|
if os.path.isdir(os.path.join(OUTPATH, entry)) and re.match(r'\d{8}-\d{6}', entry):
|
||||||
|
shutil.rmtree(os.path.join(OUTPATH, entry))
|
||||||
|
logging.info(f"Deleted old backup: {entry}")
|
||||||
|
|
||||||
|
def delete_1week_old_backups():
|
||||||
|
for entry in os.listdir(OUTPATH):
|
||||||
|
# Check if entry is a directory and matches the format "YYYYmmdd-HHMMSS"
|
||||||
|
if os.path.isdir(os.path.join(OUTPATH, entry)) and re.match(r'\d{8}-\d{6}', entry):
|
||||||
|
try:
|
||||||
|
# Convert the directory name to datetime format
|
||||||
|
backup_date = datetime.strptime(entry, "%Y%m%d-%H%M%S")
|
||||||
|
# Delete the directory if it's older than a certain threshold
|
||||||
|
if datetime.now() - backup_date > timedelta(days=7):
|
||||||
|
shutil.rmtree(os.path.join(OUTPATH, entry))
|
||||||
|
logging.info(f"Deleted old backup: {entry}")
|
||||||
|
except ValueError:
|
||||||
|
# Skip directories that do not match the expected format
|
||||||
|
continue
|
||||||
|
|
||||||
|
def init_logging():
|
||||||
|
logging.basicConfig(filename=MY_LOGF, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler = logging.StreamHandler(sys.stdout)
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(console_formatter)
|
||||||
|
logging.getLogger('').addHandler(console_handler)
|
||||||
|
|
||||||
|
def dump():
|
||||||
|
"""Save backups"""
|
||||||
|
os.makedirs(os.path.join(OUTPATH, DATE), exist_ok=True)
|
||||||
|
|
||||||
|
# clear fs logs
|
||||||
|
os.chdir(MAINPATH)
|
||||||
|
logging.info(f"Clearing the logs...")
|
||||||
|
subprocess.run(f"{PYBIN} clear.py", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
os.chdir(BASEPATH)
|
||||||
|
logging.info(f"Dumping {DATE}/mt2.tgz...")
|
||||||
|
subprocess.run(f"tar -czf {OUTPATH}/{DATE}/mt2.tgz -C {SVFPATH} main", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
# create symlink
|
||||||
|
SymLinkCreate(f"{DATE}/mt2.tgz", f"{OUTPATH}/mt2.tgz", is_file=True)
|
||||||
|
|
||||||
|
def recovery():
|
||||||
|
"""Recovery backups"""
|
||||||
|
logging.info(f"Recovering mt2.tgz...")
|
||||||
|
subprocess.run(f"tar -xzf {OUTPATH}/mt2.tgz -C {SVFPATH}", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def clean():
|
||||||
|
"""Delete all the backups"""
|
||||||
|
delete_old_backups()
|
||||||
|
|
||||||
|
def lclean():
|
||||||
|
"""Delete the log file"""
|
||||||
|
if os.path.exists(MY_LOGF):
|
||||||
|
os.remove(MY_LOGF)
|
||||||
|
|
||||||
|
def wclean():
|
||||||
|
"""Delete the backups older than 1 week"""
|
||||||
|
delete_1week_old_backups()
|
||||||
|
|
||||||
|
def cleanall():
|
||||||
|
"""Delete all the backups and logs"""
|
||||||
|
clean()
|
||||||
|
lclean()
|
||||||
|
|
||||||
|
actions = {
|
||||||
|
"dump": dump,
|
||||||
|
"recovery": recovery,
|
||||||
|
"clean": clean,
|
||||||
|
"lclean": lclean,
|
||||||
|
"wclean": wclean,
|
||||||
|
"cleanall": cleanall
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute the appropriate function based on user input
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if not os.path.exists(OUTPATH):
|
||||||
|
os.makedirs(OUTPATH)
|
||||||
|
|
||||||
|
init_logging()
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Available actions:")
|
||||||
|
for action in actions.keys():
|
||||||
|
print(" {}".format(action))
|
||||||
|
|
||||||
|
ret = input('Enter an action: ').split()
|
||||||
|
if not ret:
|
||||||
|
cecho('No argument provided. Quitting.')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
action = ret[0]
|
||||||
|
commands = ret[1:] if len(ret) >= 2 else []
|
||||||
|
else:
|
||||||
|
action = sys.argv[1]
|
||||||
|
commands = sys.argv[2:] if len(sys.argv) >= 3 else []
|
||||||
|
# print(" ".join(sys.argv[1:]))
|
||||||
|
|
||||||
|
commands = " ".join(commands)
|
||||||
|
|
||||||
|
selected_action = actions.get(action)
|
||||||
|
if selected_action:
|
||||||
|
logging.info(f"Started action {action}")
|
||||||
|
selected_action()
|
||||||
|
logging.info(f"Stopped action {action}")
|
||||||
|
else:
|
||||||
|
print("Invalid action. Please choose one of: {}".format(", ".join(actions.keys())))
|
||||||
@ -1,55 +0,0 @@
|
|||||||
#### @martysama0134 backup scripts ####
|
|
||||||
### Inside /etc/crontab paste:
|
|
||||||
## for automatic backups every hour:
|
|
||||||
# 0 * * * * root make -C /home/serverfiles/baks/db dump
|
|
||||||
## for automatic clean of backups older than 7 days every week:
|
|
||||||
# 0 0 * * 1 root make -C /home/serverfiles/baks/db wclean
|
|
||||||
|
|
||||||
DATE != date +%Y%m%d-%H%M%S
|
|
||||||
|
|
||||||
MY_HOST = localhost
|
|
||||||
MY_USER = root
|
|
||||||
MY_PASS = your_password
|
|
||||||
MY_LOGF = log.txt
|
|
||||||
PREFIX = srv1_
|
|
||||||
OUTPATH = .
|
|
||||||
|
|
||||||
all:
|
|
||||||
@echo "available all, dump, recovery, clean, lclean, wclean, cleanall"
|
|
||||||
@echo "TEST: -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) > $(PREFIX)$(DATE).sql"
|
|
||||||
|
|
||||||
dump:
|
|
||||||
@echo "### dump begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@mkdir $(DATE)/
|
|
||||||
@/usr/local/bin/mysqldump -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account | gzip -9 > $(OUTPATH)/$(DATE)/$(PREFIX)account.sql.gz 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common | gzip -9 > $(OUTPATH)/$(DATE)/$(PREFIX)common.sql.gz 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player | gzip -9 > $(OUTPATH)/$(DATE)/$(PREFIX)player.sql.gz 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-data -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)log | gzip -9 > $(OUTPATH)/$(DATE)/$(PREFIX)log.sql.gz 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) mysql | gzip -9 > $(OUTPATH)/$(DATE)/mysql.sql.gz 2>> $(MY_LOGF)
|
|
||||||
@echo "### dump end $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
recovery:
|
|
||||||
@echo "### recovery begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@gunzip < mysql.sql.gz | mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) mysql 2>> $(MY_LOGF)
|
|
||||||
@gunzip < $(PREFIX)account.sql.gz | mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account 2>> $(MY_LOGF)
|
|
||||||
@gunzip < $(PREFIX)common.sql.gz | mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common 2>> $(MY_LOGF)
|
|
||||||
@gunzip < $(PREFIX)player.sql.gz | mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player 2>> $(MY_LOGF)
|
|
||||||
@gunzip < $(PREFIX)log.sql.gz | mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)log 2>> $(MY_LOGF)
|
|
||||||
@echo "### recovery end $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@find $(OUTPATH) ! -name Makefile ! -name $(OUTPATH) -exec rm -rf {} +
|
|
||||||
|
|
||||||
lclean:
|
|
||||||
@cat /dev/null > $(MY_LOGF)
|
|
||||||
|
|
||||||
wclean:
|
|
||||||
@echo "### clean week begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@find $(OUTPATH) ! -name Makefile ! -name $(OUTPATH) -type d -mtime +7 -print -exec rm -rf {} + >> $(MY_LOGF)
|
|
||||||
@echo "### clean week end $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
cleanall: clean lclean
|
|
||||||
@echo "### clean all done $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
#### @martysama0134 backup scripts ####
|
|
||||||
### Inside /etc/crontab paste:
|
|
||||||
## for automatic backups every hour:
|
|
||||||
# 0 * * * * root make -C /home/metin2/baks/db-rev dump
|
|
||||||
|
|
||||||
DATE != date +%Y%m%d-%H%M%S
|
|
||||||
|
|
||||||
MY_HOST = localhost
|
|
||||||
MY_USER = root
|
|
||||||
MY_PASS = password
|
|
||||||
MY_LOGF = /dev/null #log.txt
|
|
||||||
PREFIX = srv1_
|
|
||||||
ACCOUNT_TABLES = block_exception GameTime GameTimeIP iptocountry string
|
|
||||||
PLAYER_TABLES = banword item_attr item_attr_rare item_proto land mob_proto object_proto refine_proto shop shop_item skill_proto string
|
|
||||||
OUTPATH = .
|
|
||||||
|
|
||||||
all:
|
|
||||||
@echo "available all, dump, recovery, clean, lclean, cleanall"
|
|
||||||
@echo "TEST: -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) > $(PREFIX)$(DATE).sql"
|
|
||||||
|
|
||||||
dump:
|
|
||||||
@echo "### dump begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@### struct only
|
|
||||||
@/usr/local/bin/mysqldump --no-data --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account > $(OUTPATH)/$(PREFIX)account-schema.sql 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-data --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common > $(OUTPATH)/$(PREFIX)common-schema.sql 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-data --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player > $(OUTPATH)/$(PREFIX)player-schema.sql 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-data --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)log > $(OUTPATH)/$(PREFIX)log-schema.sql 2>> $(MY_LOGF)
|
|
||||||
@### data only
|
|
||||||
@/usr/local/bin/mysqldump --no-create-info --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account $(ACCOUNT_TABLES) > $(OUTPATH)/$(PREFIX)common-data.sql 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-create-info --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common > $(OUTPATH)/$(PREFIX)common-data.sql 2>> $(MY_LOGF)
|
|
||||||
@/usr/local/bin/mysqldump --no-create-info --skip-extended-insert --skip-dump-date -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player $(PLAYER_TABLES) > $(OUTPATH)/$(PREFIX)player-data.sql 2>> $(MY_LOGF)
|
|
||||||
@echo "### dump end $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
recovery:
|
|
||||||
@echo "### recovery begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@# schema
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)account-schema.sql
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)common-schema.sql
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)log 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)log-schema.sql
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)player-schema.sql
|
|
||||||
@# data
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)account 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)account-data.sql
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)common 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)common-data.sql
|
|
||||||
@# @mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)log 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)log-data.sql
|
|
||||||
@mysql -u $(MY_USER) -p$(MY_PASS) -h $(MY_HOST) $(PREFIX)player 2>> $(MY_LOGF) < $(OUTPATH)/$(PREFIX)player-data.sql
|
|
||||||
@echo "### recovery end $(DATE)" >> $(MY_LOGF)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -f $(OUTPATH)/*.sql
|
|
||||||
|
|
||||||
lclean:
|
|
||||||
@cat /dev/null > $(MY_LOGF)
|
|
||||||
|
|
||||||
cleanall: clean lclean
|
|
||||||
@echo "### clean all done $(DATE)" >> $(MY_LOGF)
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
#### @martysama0134 backup scripts ####
|
|
||||||
## Inside /etc/crontab paste: (for automatic backups every hour)
|
|
||||||
# 0 * * * * root make -C /home/serverfiles/baks/fs dump
|
|
||||||
## for automatic clean of backups older than 7 days every week:
|
|
||||||
# 0 0 * * 1 root make -C /home/serverfiles/baks/fs wclean
|
|
||||||
|
|
||||||
DATE != date +%Y%m%d-%H%M%S
|
|
||||||
|
|
||||||
CURPATH != pwd
|
|
||||||
PATH = ../../
|
|
||||||
FOLD = main
|
|
||||||
PATH2 = $(PATH)$(FOLD)
|
|
||||||
OUTPATH = .
|
|
||||||
|
|
||||||
all:
|
|
||||||
@echo "available all, dump, recovery and clean"
|
|
||||||
|
|
||||||
dump:
|
|
||||||
@cd $(PATH)$(FOLD) && python clear.py
|
|
||||||
@cd $(CURPATH) && cd $(PATH) && tar -czf mt2_$(DATE).tgz $(FOLD)
|
|
||||||
@mv $(PATH)mt2_$(DATE).tgz $(OUTPATH)
|
|
||||||
@echo "backup di $(PATH2) finito"
|
|
||||||
|
|
||||||
recovery:
|
|
||||||
@tar -xzf mt2.tgz -C $(PATH)
|
|
||||||
@echo "recovery di $(PATH2) finito"
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -f $(OUTPATH)/*.tgz
|
|
||||||
|
|
||||||
lclean:
|
|
||||||
@cat /dev/null > $(MY_LOGF)
|
|
||||||
|
|
||||||
wclean:
|
|
||||||
@echo "### clean week begin $(DATE)" >> $(MY_LOGF)
|
|
||||||
@find $(OUTPATH) -name "*.tgz" -type f -mtime +7 -print -delete >> $(MY_LOGF)
|
|
||||||
@echo "### clean week end $(DATE)" >> $(MY_LOGF)
|
|
||||||
@ -19,9 +19,7 @@ python admin_panel.py start
|
|||||||
|
|
||||||
# via name as input
|
# via name as input
|
||||||
python admin_panel.py
|
python admin_panel.py
|
||||||
|
start
|
||||||
# and also... via sh
|
|
||||||
python admin_panel.py
|
|
||||||
|
|
||||||
|
|
||||||
### List of the admin_panel.sh options:
|
### List of the admin_panel.sh options:
|
||||||
|
|||||||
@ -15,26 +15,26 @@ MY_PASS = password
|
|||||||
|
|
||||||
OUTPATH = . # output folder by default (.=current)
|
OUTPATH = . # output folder by default (.=current)
|
||||||
|
|
||||||
## Other things
|
### DB BACKUPS
|
||||||
|
## Setup the DB backup:
|
||||||
|
|
||||||
# Make manual backups
|
# Make manual backups
|
||||||
cd baks/db/
|
cd baks/
|
||||||
make dump
|
python backup_db.py dump
|
||||||
|
|
||||||
# Clean all the backups
|
# Clean all the backups
|
||||||
cd baks/db/
|
cd baks/
|
||||||
make clean
|
python backup_db.py clean
|
||||||
|
|
||||||
# Setup automatic backups every hour pasting this inside the system file /etc/crontab (the path must be correct!)
|
# Setup automatic backups every hour pasting this inside the system file /etc/crontab (the path must be correct!)
|
||||||
0 * * * * root make -C /home/metin2/baks/db dump
|
0 * * * * root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_db.py dump
|
||||||
|
|
||||||
# Setup automatic backups cleaning every week pasting this inside the system file /etc/crontab (the path must be correct!)
|
# Setup automatic backups cleaning every week pasting this inside the system file /etc/crontab (the path must be correct!)
|
||||||
0 0 * * 1 root make -C /home/metin2/baks/db wclean
|
0 0 * * 1 root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_db.py wclean
|
||||||
|
|
||||||
## Recovery from backup
|
## Recovery from backup
|
||||||
cd baks/db/
|
cd baks/
|
||||||
# rename the specific backups as account.sql.gz common.sql.gz log.sql.gz player.sql.gz inside the folder
|
python backup_db.py recovery
|
||||||
make recovery
|
|
||||||
|
|
||||||
|
|
||||||
### FS BACKUPS
|
### FS BACKUPS
|
||||||
@ -46,23 +46,22 @@ OUTPATH = . #output folder by default (.=current)
|
|||||||
|
|
||||||
|
|
||||||
# Make manual backups
|
# Make manual backups
|
||||||
cd baks/fs/
|
cd baks/
|
||||||
make dump
|
python backup_fs.py dump
|
||||||
|
|
||||||
# Clean all the backups
|
# Clean all the backups
|
||||||
cd baks/fs/
|
cd baks/
|
||||||
make clean
|
python backup_fs.py clean
|
||||||
|
|
||||||
# Setup automatic backups every hour pasting this inside the system file /etc/crontab (the path must be correct!)
|
# Setup automatic backups every hour pasting this inside the system file /etc/crontab (the path must be correct!)
|
||||||
0 * * * * root make -C /home/metin2/baks/fs dump
|
0 * * * * root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_fs.py dump
|
||||||
|
|
||||||
# Setup automatic backups cleaning every week pasting this inside the system file /etc/crontab (the path must be correct!)
|
# Setup automatic backups cleaning every week pasting this inside the system file /etc/crontab (the path must be correct!)
|
||||||
0 0 * * 1 root make -C /home/metin2/baks/fs wclean
|
0 0 * * 1 root cd /home/metin2/baks/ && /usr/local/bin/python3 backup_fs.py wclean
|
||||||
|
|
||||||
## Recovery from backup
|
## Recovery from backup
|
||||||
cd baks/fs/
|
cd baks/
|
||||||
# rename the specific backup as mt2.tgz inside the folder
|
python backup_fs.py recovery
|
||||||
make recovery
|
|
||||||
|
|
||||||
|
|
||||||
### How to generate the server structure:
|
### How to generate the server structure:
|
||||||
@ -86,6 +85,11 @@ python admin_panel.py stop
|
|||||||
## To clear the logs:
|
## To clear the logs:
|
||||||
python admin_panel.py clear
|
python admin_panel.py clear
|
||||||
|
|
||||||
|
## To force stop the server: (kill -9)
|
||||||
|
python admin_panel.py stop --level 9
|
||||||
|
python admin_panel.py stop -l 9
|
||||||
|
python admin_panel.py stop -l9
|
||||||
|
|
||||||
|
|
||||||
### Additional notes:
|
### Additional notes:
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
from gen import IsWindows
|
from gen import IsWindows,SymLinkCreate
|
||||||
|
|
||||||
def fecho(text): print(text) if IsWindows() else print("\033[35m" + text + "\033[0m")
|
def fecho(text): print(text) if IsWindows() else print("\033[35m" + text + "\033[0m")
|
||||||
def _fecho(text): print(text) if IsWindows() else print("\033[4;35m" + text + "\033[0m")
|
def _fecho(text): print(text) if IsWindows() else print("\033[4;35m" + text + "\033[0m")
|
||||||
@ -48,75 +48,76 @@ def delete_symlink(filepath):
|
|||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
v_base = os.getcwd()
|
if __name__ == "__main__":
|
||||||
v_mt2f = v_base
|
v_base = os.getcwd()
|
||||||
v_bakf = os.path.join(v_base, '..', 'baks')
|
v_mt2f = v_base
|
||||||
v_dbf = os.path.join(v_bakf, 'db')
|
v_bakf = os.path.join(v_base, '..', 'baks')
|
||||||
v_dbrevf = os.path.join(v_bakf, 'dbrev')
|
v_foldername = 'srv1'
|
||||||
v_fsf = os.path.join(v_bakf, 'fs')
|
v_localename = 'germany'
|
||||||
v_foldername = 'srv1'
|
v_bin = 'python3'
|
||||||
v_localename = 'germany'
|
if IsWindows():
|
||||||
v_bin = 'python3'
|
|
||||||
if IsWindows():
|
|
||||||
v_bin = 'python'
|
v_bin = 'python'
|
||||||
|
|
||||||
r_echo(".:. AdminPanel .:.")
|
r_echo(".:. AdminPanel .:.")
|
||||||
gecho("What do you want to do?")
|
gecho("What do you want to do?")
|
||||||
recho("1. Start (start)")
|
recho("1. Start (start)")
|
||||||
recho("1i. Start Interactive (starti)")
|
recho("1i. Start Interactive (starti)")
|
||||||
recho("111. Restart (restart)")
|
recho("111. Restart (restart)")
|
||||||
recho("111a. Restart+Daemon (restartall)")
|
recho("111a. Restart+Daemon (restartall)")
|
||||||
recho("111b. Restart+Gen+Quest (fullrestart)")
|
recho("111b. Restart+Gen+Quest (fullrestart)")
|
||||||
recho("2. Stop (stop|close)")
|
recho("2. Stop (stop|close)")
|
||||||
recho("2i. Stop Interactive (stopi|closei)")
|
recho("2i. Stop Interactive (stopi|closei)")
|
||||||
recho("3. Clean (clean|clear)")
|
recho("3. Clean (clean|clear)")
|
||||||
recho("33. Clean All (cleanall|clearall)")
|
recho("33. Clean All (cleanall|clearall)")
|
||||||
recho("4. Backup mysql/db (bak1|db|db_backup)")
|
recho("4. Backup mysql/db (bak1|db|db_backup)")
|
||||||
recho("4b. Backup mysql no user-data (dbrev)")
|
recho("4b. Backup mysql no user-data (dbrev)")
|
||||||
recho("5. Backup game/fs (bak2|fs|fs_backup)")
|
recho("5. Backup game/fs (bak2|fs|fs_backup)")
|
||||||
recho("666. Generate (gen)")
|
recho("666. Generate (gen)")
|
||||||
recho("777. Compile Quests (quest)")
|
recho("777. Compile Quests (quest)")
|
||||||
recho("888. Game Symlink (symlink)")
|
recho("888. Game Symlink (symlink)")
|
||||||
recho("999. Search (search)")
|
recho("999. Search (search)")
|
||||||
_yecho("1a. Start+Daemon (startall)")
|
_yecho("1a. Start+Daemon (startall)")
|
||||||
_yecho("2a. Stop+Daemon (stopall|closeall)")
|
_yecho("2a. Stop+Daemon (stopall|closeall)")
|
||||||
_recho("0. Quit (quit)")
|
_recho("0. Quit (quit)")
|
||||||
|
|
||||||
|
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
ret = input('Enter a phase: ').split()
|
ret = input('Enter a phase: ').split()
|
||||||
|
if not ret:
|
||||||
|
cecho('No argument provided. Quitting.')
|
||||||
|
sys.exit()
|
||||||
phase = ret[0]
|
phase = ret[0]
|
||||||
commands = ret[1:] if len(ret) >= 2 else []
|
commands = ret[1:] if len(ret) >= 2 else []
|
||||||
else:
|
else:
|
||||||
phase = sys.argv[1]
|
phase = sys.argv[1]
|
||||||
commands = sys.argv[2:] if len(sys.argv) >= 3 else []
|
commands = sys.argv[2:] if len(sys.argv) >= 3 else []
|
||||||
# print(" ".join(sys.argv[1:]))
|
# print(" ".join(sys.argv[1:]))
|
||||||
|
|
||||||
commands = " ".join(commands)
|
commands = " ".join(commands)
|
||||||
|
|
||||||
if phase in ['111', 'restart']:
|
if phase in ['111', 'restart']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} stop.py')
|
run_command(f'{v_bin} stop.py')
|
||||||
run_command(f'{v_bin} start.py')
|
run_command(f'{v_bin} start.py')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('restart completed')
|
cecho('restart completed')
|
||||||
|
|
||||||
elif phase in ['111a', 'restartall']:
|
elif phase in ['111a', 'restartall']:
|
||||||
p = subprocess.run(['ps', 'afx'], stdout=subprocess.PIPE)
|
p = subprocess.run(['ps', 'afx'], stdout=subprocess.PIPE)
|
||||||
ps_output = p.stdout.decode()
|
ps_output = p.stdout.decode()
|
||||||
for line in ps_output.split('\n'):
|
for line in ps_output.split('\n'):
|
||||||
if 'python daemon_srv1.py' in line and 'grep' not in line:
|
if f'{v_bin} daemon_srv1.py' in line and 'grep' not in line:
|
||||||
pid = line.split()[0]
|
pid = line.split()[0]
|
||||||
os.kill(pid, 9)
|
os.kill(pid, 9)
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} stop.py')
|
run_command(f'{v_bin} stop.py')
|
||||||
run_command(f'{v_bin} start.py')
|
run_command(f'{v_bin} start.py')
|
||||||
os.system(f'{v_bin} daemon_srv1.py &')
|
os.system(f'{v_bin} daemon_srv1.py &')
|
||||||
# subprocess.Popen(["python", "daemon_srv1.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, preexec_fn=os.setsid)
|
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('restartall completed')
|
cecho('restartall completed')
|
||||||
|
|
||||||
elif phase in ['111b', 'fullrestart']:
|
elif phase in ['111b', 'fullrestart']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} admin_panel.py clear')
|
run_command(f'{v_bin} admin_panel.py clear')
|
||||||
run_command(f'{v_bin} admin_panel.py gen')
|
run_command(f'{v_bin} admin_panel.py gen')
|
||||||
@ -125,38 +126,37 @@ elif phase in ['111b', 'fullrestart']:
|
|||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('restart completed')
|
cecho('restart completed')
|
||||||
|
|
||||||
elif phase in ['1', 'start']:
|
elif phase in ['1', 'start']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} start.py {commands}')
|
run_command(f'{v_bin} start.py {commands}')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('start completed')
|
cecho('start completed')
|
||||||
|
|
||||||
elif phase in ['1i', 'starti']:
|
elif phase in ['1i', 'starti']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} start.py --prompt')
|
run_command(f'{v_bin} start.py --prompt')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('starti completed')
|
cecho('starti completed')
|
||||||
|
|
||||||
elif phase in ['1a', 'startall']:
|
elif phase in ['1a', 'startall']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
os.system(f'{v_bin} daemon_srv1.py &')
|
os.system(f'{v_bin} daemon_srv1.py &')
|
||||||
# subprocess.Popen(["python", "daemon_srv1.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, preexec_fn=os.setsid)
|
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('startall completed')
|
cecho('startall completed')
|
||||||
|
|
||||||
elif phase in ['2', 'stop', 'close']:
|
elif phase in ['2', 'stop', 'close']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} stop.py {commands}')
|
run_command(f'{v_bin} stop.py {commands}')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('stop completed')
|
cecho('stop completed')
|
||||||
|
|
||||||
elif phase in ['2i', 'stopi', 'closei']:
|
elif phase in ['2i', 'stopi', 'closei']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} stop.py --prompt')
|
run_command(f'{v_bin} stop.py --prompt')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('stopi completed')
|
cecho('stopi completed')
|
||||||
|
|
||||||
elif phase in ['2a', 'stopall', 'closeall']:
|
elif phase in ['2a', 'stopall', 'closeall']:
|
||||||
p = subprocess.run(['ps', 'afx'], stdout=subprocess.PIPE)
|
p = subprocess.run(['ps', 'afx'], stdout=subprocess.PIPE)
|
||||||
ps_output = p.stdout.decode()
|
ps_output = p.stdout.decode()
|
||||||
for line in ps_output.split('\n'):
|
for line in ps_output.split('\n'):
|
||||||
@ -169,44 +169,50 @@ elif phase in ['2a', 'stopall', 'closeall']:
|
|||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('stopall completed')
|
cecho('stopall completed')
|
||||||
|
|
||||||
elif phase in ['3', 'clean', 'clear']:
|
elif phase in ['3', 'clean', 'clear']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
run_command(f'{v_bin} clear.py')
|
run_command(f'{v_bin} clear.py')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('clean completed')
|
cecho('clean completed')
|
||||||
|
|
||||||
elif phase in ['33', 'cleanall', 'clearall']:
|
elif phase in ['33', 'cleanall', 'clearall']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
response = input("Are you sure you want to delete the backups as well? [Ny] ")
|
response = input("Are you sure you want to delete the backups as well? [Ny] ")
|
||||||
if response.lower() == 'y':
|
if response.lower() == 'y':
|
||||||
run_command(f'{v_bin} clear.py')
|
run_command(f'{v_bin} clear.py')
|
||||||
|
os.chdir(v_bakf)
|
||||||
|
run_command(f'{v_bin} backup_db.py clean')
|
||||||
|
run_command(f'{v_bin} backup_fs.py clean')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
run_command(f'make -C {v_dbf} clean')
|
|
||||||
run_command(f'make -C {v_fsf} clean')
|
|
||||||
cecho('cleanall completed')
|
cecho('cleanall completed')
|
||||||
else:
|
else:
|
||||||
cecho('cleanall cancelled')
|
cecho('cleanall cancelled')
|
||||||
|
|
||||||
elif phase in ['4', 'bak1', 'db', 'db_backup']:
|
elif phase in ['4', 'bak1', 'db', 'db_backup']:
|
||||||
run_command(f'make -C {v_dbf} dump')
|
os.chdir(v_bakf)
|
||||||
|
run_command(f'{v_bin} backup_db.py dump')
|
||||||
|
os.chdir(v_base)
|
||||||
cecho('bak db completed')
|
cecho('bak db completed')
|
||||||
|
|
||||||
elif phase in ['4b','dbrev']:
|
elif phase in ['4b','dbrev', 'dbrev_backup']:
|
||||||
run_command(f'make -C {v_dbrevf} dump')
|
os.chdir(v_bakf)
|
||||||
|
run_command(f'{v_bin} backup_dbrev.py dump')
|
||||||
|
os.chdir(v_base)
|
||||||
cecho('bak dbrev completed')
|
cecho('bak dbrev completed')
|
||||||
|
|
||||||
elif phase in ['5', 'bak2', 'fs', 'fs_backup']:
|
elif phase in ['5', 'bak2', 'fs', 'fs_backup']:
|
||||||
run_command(f'make -C {v_fsf} dump')
|
os.chdir(v_bakf)
|
||||||
|
run_command(f'{v_bin} backup_fs.py dump')
|
||||||
|
os.chdir(v_base)
|
||||||
cecho('bak fs completed')
|
cecho('bak fs completed')
|
||||||
|
|
||||||
elif phase in ['666', 'gen']:
|
elif phase in ['666', 'gen']:
|
||||||
os.chdir(v_mt2f)
|
os.chdir(v_mt2f)
|
||||||
# run_command(f'rm -rf {v_foldername}/logs {v_foldername}/auth {v_foldername}/chan {v_foldername}/db')
|
|
||||||
run_command(f'{v_bin} gen.py')
|
run_command(f'{v_bin} gen.py')
|
||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('gen completed')
|
cecho('gen completed')
|
||||||
|
|
||||||
elif phase in ['777', 'quest']:
|
elif phase in ['777', 'quest']:
|
||||||
os.chdir(os.path.join(v_mt2f, v_foldername, 'share', 'locale', v_localename, 'quest'))
|
os.chdir(os.path.join(v_mt2f, v_foldername, 'share', 'locale', v_localename, 'quest'))
|
||||||
if not IsWindows():
|
if not IsWindows():
|
||||||
run_command('chmod u+x qc')
|
run_command('chmod u+x qc')
|
||||||
@ -214,20 +220,26 @@ elif phase in ['777', 'quest']:
|
|||||||
os.chdir(v_base)
|
os.chdir(v_base)
|
||||||
cecho('quest completed')
|
cecho('quest completed')
|
||||||
|
|
||||||
elif phase in ['888', 'symlink']:
|
elif phase in ['888', 'symlink']:
|
||||||
os.chdir(os.path.join(v_mt2f, v_foldername, 'share', 'bin'))
|
os.chdir(os.path.join(v_mt2f, v_foldername, 'share', 'bin'))
|
||||||
|
if IsWindows():
|
||||||
|
delete_symlink('game.exe')
|
||||||
|
delete_symlink('db.exe')
|
||||||
|
os.system(r'mklink game.exe "..\..\..\..\..\source-server\Srcs\Server\game\bin\release\game.exe"')
|
||||||
|
os.system(r'mklink db.exe "..\..\..\..\..\source-server\Srcs\Server\db\bin\release\db.exe"')
|
||||||
|
else:
|
||||||
delete_symlink('game')
|
delete_symlink('game')
|
||||||
delete_symlink('db')
|
delete_symlink('db')
|
||||||
run_command('ln -s /home/source-server/Srcs/Server/game/game_symlink game')
|
run_command('ln -s /home/source-server/Srcs/Server/game/game_symlink game')
|
||||||
run_command('ln -s /home/source-server/Srcs/Server/db/db_symlink db')
|
run_command('ln -s /home/source-server/Srcs/Server/db/db_symlink db')
|
||||||
cecho('symlink completed')
|
cecho('symlink completed')
|
||||||
|
|
||||||
elif phase in ['999', 'search']:
|
elif phase in ['999', 'search']:
|
||||||
search_for_port_in_configs(v_base)
|
search_for_port_in_configs(v_base)
|
||||||
|
|
||||||
elif phase in ['0', 'quit']:
|
elif phase in ['0', 'quit']:
|
||||||
abio('.:|:.')
|
abio('.:|:.')
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
cecho(f'{phase} not found')
|
cecho(f'{phase} not found')
|
||||||
|
|||||||
@ -10,11 +10,21 @@ import shutil
|
|||||||
import time
|
import time
|
||||||
from gen_settings import *
|
from gen_settings import *
|
||||||
|
|
||||||
|
ENABLE_CLEAN_UP_OLD_GEN = True
|
||||||
|
|
||||||
portlist={}
|
portlist={}
|
||||||
clearlist=[]
|
clearlist=[]
|
||||||
startlist=[]
|
startlist=[]
|
||||||
serverinfolist=[]
|
serverinfolist=[]
|
||||||
|
|
||||||
|
#global single server rules
|
||||||
|
genConfig = {}
|
||||||
|
genConfig["all"] = {}
|
||||||
|
#for ipfw rules
|
||||||
|
udp_yes_ports=[]
|
||||||
|
tcp_yes_ports=[]
|
||||||
|
tcp_nop_ports=[]
|
||||||
|
|
||||||
def IsWindows():
|
def IsWindows():
|
||||||
return v_system=="Windows"
|
return v_system=="Windows"
|
||||||
|
|
||||||
@ -81,14 +91,31 @@ def Append2File(text, file_path):
|
|||||||
def DeleteFolder(path):
|
def DeleteFolder(path):
|
||||||
shutil.rmtree(path)
|
shutil.rmtree(path)
|
||||||
|
|
||||||
|
def CleanUpOldGen(working_path):
|
||||||
|
"""Finds folders starting with 'db', 'chan', 'auth', or 'logs' in the working_path and deletes them, excluding subfolders."""
|
||||||
|
if not os.path.exists(working_path):
|
||||||
|
return
|
||||||
|
|
||||||
|
target_prefixes = ("db", "chan", "auth", "logs")
|
||||||
|
folders_to_delete = []
|
||||||
|
|
||||||
|
# Only iterate through the immediate children of working_path
|
||||||
|
for _dir in os.listdir(working_path):
|
||||||
|
if _dir.lower().startswith(target_prefixes):
|
||||||
|
folder_path = os.path.join(working_path, _dir)
|
||||||
|
folders_to_delete.append(folder_path)
|
||||||
|
|
||||||
|
for folder_path in folders_to_delete:
|
||||||
|
DeleteFolder(folder_path)
|
||||||
|
|
||||||
def SymLinkCreate(src, dst, is_file):
|
def SymLinkCreate(src, dst, is_file):
|
||||||
src = SlashFix(src)
|
src = SlashFix(src)
|
||||||
dst = SlashFix(dst)
|
dst = SlashFix(dst)
|
||||||
if v_system=="FreeBSD":
|
if v_system == "FreeBSD":
|
||||||
fShell(f"ln -Ffnsw {src} {dst}")
|
fShell(f"ln -Ffnsw {src} {dst}")
|
||||||
elif v_system=="Linux":
|
elif v_system == "Linux":
|
||||||
fShell(f"ln -Ffns {src} {dst}")
|
fShell(f"ln -Ffns {src} {dst}")
|
||||||
elif v_system=="Windows":
|
elif v_system == "Windows":
|
||||||
if is_file:
|
if is_file:
|
||||||
fShell(f"mklink {dst} {src}")
|
fShell(f"mklink {dst} {src}")
|
||||||
else:
|
else:
|
||||||
@ -110,19 +137,19 @@ def WriteHostConfig(szConfFile, szGameName):
|
|||||||
Append2File(f"HOSTNAME: {szGameName}", szConfFile)
|
Append2File(f"HOSTNAME: {szGameName}", szConfFile)
|
||||||
|
|
||||||
def WriteChannelConfig(szConfFile, dwChannel):
|
def WriteChannelConfig(szConfFile, dwChannel):
|
||||||
if dwChannel==M2TYPE.NOCHAN:
|
if dwChannel == M2TYPE.NOCHAN:
|
||||||
dwChannel=1
|
dwChannel = 1
|
||||||
Append2File(f"CHANNEL: {dwChannel}", szConfFile)
|
Append2File(f"CHANNEL: {dwChannel}", szConfFile)
|
||||||
|
|
||||||
def WriteMapConfig(szConfFile, szMapList):
|
def WriteMapConfig(szConfFile, szMapList):
|
||||||
if len(szMapList.split())>=32:
|
if len(szMapList.split()) >= 32:
|
||||||
print(f"WARNING: MORE THAN 32 MAPS INSIDE: {szConfFile}")
|
print(f"WARNING: MORE THAN 32 MAPS INSIDE: {szConfFile}")
|
||||||
Append2File(f"MAP_ALLOW: {szMapList}", szConfFile)
|
Append2File(f"MAP_ALLOW: {szMapList}", szConfFile)
|
||||||
|
|
||||||
def WritePortConfig(szConfFile, wGenPort, dwType, dwPortType=None):
|
def WritePortConfig(szConfFile, wGenPort, dwType, dwPortType=None):
|
||||||
if dwType==M2TYPE.DB:
|
if dwType == M2TYPE.DB:
|
||||||
Append2File(f"{PORT.lPORT[PORT.BIND_PORT]} = {wGenPort}", szConfFile)
|
Append2File(f"{PORT.lPORT[PORT.BIND_PORT]} = {wGenPort}", szConfFile)
|
||||||
elif dwType==M2TYPE.CORE or dwType==M2TYPE.AUTH:
|
elif dwType == M2TYPE.CORE or dwType == M2TYPE.AUTH:
|
||||||
Append2File(f"{PORT.lPORT[dwPortType]}: {wGenPort}", szConfFile)
|
Append2File(f"{PORT.lPORT[dwPortType]}: {wGenPort}", szConfFile)
|
||||||
|
|
||||||
def genWriteConfig(szConfFile, tuSubConfTable):
|
def genWriteConfig(szConfFile, tuSubConfTable):
|
||||||
@ -135,8 +162,8 @@ def genWriteConfig(szConfFile, tuSubConfTable):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
print(repr(val1))
|
print(repr(val1))
|
||||||
raise IndexError
|
raise IndexError
|
||||||
#skip test server in ch1
|
# skip test server in ch1
|
||||||
if DISABLE_TEST_MODE_IN_CH1 and configValue.strip()=="TEST_SERVER: 1" and "/ch1/" in szConfFile:
|
if DISABLE_TEST_MODE_IN_CH1 and configValue.strip() == "TEST_SERVER: 1" and "/ch1/" in szConfFile:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -288,20 +315,19 @@ def genInitSrv(szSvr):
|
|||||||
CreateFolder("%s/%s"%(szSvr, val1))
|
CreateFolder("%s/%s"%(szSvr, val1))
|
||||||
# print "%s/%s"%(szSvr, val1)
|
# print "%s/%s"%(szSvr, val1)
|
||||||
#
|
#
|
||||||
for val1 in ("share/conf/BANIP","share/conf/CMD","share/conf/CRC","share/conf/VERSION","share/conf/state_user_count","share/bin/db","share/bin/game"):
|
for val1 in ("share/conf/BANIP","share/conf/CMD","share/conf/CRC","share/conf/VERSION","share/conf/state_user_count"):
|
||||||
|
TouchFile("%s/%s" % (szSvr, val1))
|
||||||
|
# print "%s/%s"%(szSvr, val1)
|
||||||
|
#
|
||||||
|
for val1 in ("share/bin/db","share/bin/game"):
|
||||||
|
if IsWindows():
|
||||||
|
val1 += ".exe"
|
||||||
TouchFile("%s/%s" % (szSvr, val1))
|
TouchFile("%s/%s" % (szSvr, val1))
|
||||||
# print "%s/%s"%(szSvr, val1)
|
# print "%s/%s"%(szSvr, val1)
|
||||||
#
|
#
|
||||||
for val1 in ("share/conf/item_names.txt","share/conf/item_proto.txt","share/conf/mob_names.txt","share/conf/mob_proto.txt"):
|
for val1 in ("share/conf/item_names.txt","share/conf/item_proto.txt","share/conf/mob_names.txt","share/conf/mob_proto.txt"):
|
||||||
TouchFile("%s/%s" % (szSvr, val1))
|
TouchFile("%s/%s" % (szSvr, val1))
|
||||||
# print "%s/%s"%(szSvr, val1)
|
# print "%s/%s"%(szSvr, val1)
|
||||||
#global single server rules
|
|
||||||
genConfig = {}
|
|
||||||
genConfig["all"] = {}
|
|
||||||
#for ipfw rules
|
|
||||||
udp_yes_ports=[]
|
|
||||||
tcp_yes_ports=[]
|
|
||||||
tcp_nop_ports=[]
|
|
||||||
|
|
||||||
def genCalcParentRet(szParentName):
|
def genCalcParentRet(szParentName):
|
||||||
return szParentName.count("/")*v_chanPath
|
return szParentName.count("/")*v_chanPath
|
||||||
@ -319,8 +345,9 @@ def genMain(oSub={}, szParentName=[]):
|
|||||||
listTmpParentName=list(szParentName) # list() to bypass variable passed by reference to value
|
listTmpParentName=list(szParentName) # list() to bypass variable passed by reference to value
|
||||||
listTmpParentName.append(k1)
|
listTmpParentName.append(k1)
|
||||||
szTmpParentName=("/".join(listTmpParentName))
|
szTmpParentName=("/".join(listTmpParentName))
|
||||||
# DeleteFolder("%s" % szTmpParentName) # completely unsafe
|
|
||||||
CreateFolder("%s" % szTmpParentName)
|
CreateFolder("%s" % szTmpParentName)
|
||||||
|
if ENABLE_CLEAN_UP_OLD_GEN:
|
||||||
|
CleanUpOldGen(szTmpParentName)
|
||||||
# print szTmpParentName
|
# print szTmpParentName
|
||||||
if v1["type"]==M2TYPE.DB:
|
if v1["type"]==M2TYPE.DB:
|
||||||
k1s=genConfig["active"]
|
k1s=genConfig["active"]
|
||||||
|
|||||||
@ -125,8 +125,6 @@ if __name__ == "__main__":
|
|||||||
szWhichServ = ""
|
szWhichServ = ""
|
||||||
szWhichChan = {}
|
szWhichChan = {}
|
||||||
dwLevel=1
|
dwLevel=1
|
||||||
if v_system=="Windows":
|
|
||||||
dwLevel=9
|
|
||||||
optlist, args = g_getopt(s_argv[1:],"l:ps",('level=','prompt','selective','whichserv=','whichchan='))
|
optlist, args = g_getopt(s_argv[1:],"l:ps",('level=','prompt','selective','whichserv=','whichchan='))
|
||||||
for o, a in optlist:
|
for o, a in optlist:
|
||||||
if o in ('-s', '--selective'):
|
if o in ('-s', '--selective'):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user