Files
2026-04-07 02:04:22 +05:30

118 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# coding: utf-8
# -------------------------------------------------------------------
# YakPanel
# -------------------------------------------------------------------
# Copyright (c) 2015-2099 YakPanel(www.yakpanel.com) All rights reserved.
# -------------------------------------------------------------------
# Author: wzz <wzz@yakpanel.com>
# -------------------------------------------------------------------
# ------------------------------
# Docker模型
# ------------------------------
import public, os
from btdockerModelV2 import dk_public as dp
class dockerBase(object):
def __init__(self):
# self._db_path = "/www/server/panel/data/db/docker.db"
self._db_path = "/www/server/panel/data/docker.db"
self._backup_log = '/tmp/backup.log'
self._log_path = '/tmp/dockertmp.log'
self._rCmd_log = '/tmp/dockerRun.log'
self._url = "unix:///var/run/docker.sock"
self.compose_path = "{}/data/compose".format(public.get_panel_path())
self.aes_key = "btdockerModel_QWERAS"
self.moinitor_lock = "/tmp/bt_docker_monitor.lock"
def get_ws_log(self, get):
"""
获取日志websocket
@param get:
@return:
"""
if not hasattr(get, "_ws"):
return True
import time
sum = 0
with open(get._log_path, "r") as file:
position = file.tell()
get._ws.send(public.lang("{}\r\n",get.wsLogTitle))
while True:
current_position = file.tell()
line = file.readline()
if current_position > position:
file.seek(position)
new_content = file.read(current_position - position)
if "nohup" not in new_content:
for i in new_content.split('\n'):
if i == "": continue
get._ws.send(i.strip("\n") + "\r\n")
position = current_position
if "bt_successful" in line:
get._ws.send(public.lang("successful\r\n"))
del get._ws
break
elif "bt_failed" in line:
get._ws.send(public.lang("failed\r\n"))
del get._ws
break
if sum > 0:
sum = 0
else:
sum += 1
if sum >= 6000:
get._ws.send(public.lang("\r\nNo response for more than 10 minutes!\r\n"))
break
time.sleep(0.1)
return True
# 命令行创建 拉取容器
def run_cmd(self, get):
"""
命令行创建运行容器(docker run / docker pull),需要做危险命令校验,存在危险命令则不执行
@param get:
@return:
"""
import re
if not hasattr(get, 'cmd'):
return public.return_message(-1, 0, public.lang("Please pass in cmd"))
if "docker run" not in get.cmd and "docker pull" not in get.cmd:
return public.return_message(-1, 0, public.lang("Only docker run or docker pull commands can be executed"))
danger_cmd = ['rm', 'rmi', 'kill', 'stop', 'pause', 'unpause', 'restart', 'update', 'exec', 'init',
'shutdown', 'reboot', 'chmod', 'chown', 'dd', 'fdisk', 'killall', 'mkfs', 'mkswap', 'mount',
'swapoff', 'swapon', 'umount', 'userdel', 'usermod', 'passwd', 'groupadd', 'groupdel',
'groupmod', 'chpasswd', 'chage', 'usermod', 'useradd', 'userdel', 'pkill']
danger_symbol = ['&', '&&', '||', '|', ';']
for d in danger_cmd:
if get.cmd.startswith(d) or re.search(r'\s{}\s'.format(d), get.cmd):
return public.return_message(-1, 0, public.lang("Dangerous command exists: [ {}], execution is not allowed!", d))
for d in danger_symbol:
if d in get.cmd:
return public.return_message(-1, 0, public.lang("Dangerous symbol exists: [ {}], execution is not allowed!", d))
os.system("echo -n > {}".format(self._rCmd_log))
os.system("nohup {} >> {} 2>&1 && echo 'bt_successful' >> {} || echo 'bt_failed' >> {} &".format(
get.cmd,
self._rCmd_log,
self._rCmd_log,
self._rCmd_log,
))
return public.return_message(0, 0, public.lang("The command has been executed!"))