add old lci module
This commit is contained in:
1 parent
38a6e815f0
commit
8499631091
171 files changed
+25562
No files matched your search
@@ -0,0 +1,14 @@
|
||||
from app.login.routes import login_bp
|
||||
from app.log.routes import log_bp
|
||||
from app.module.routes import module_bp
|
||||
from app.process.routes import process_bp
|
||||
from app.user.routes import user_bp
|
||||
|
||||
|
||||
def register_blueprints(app):
|
||||
# 默认访问家目录
|
||||
app.register_blueprint(login_bp, url_prefix='/')
|
||||
app.register_blueprint(log_bp, url_prefix='/log')
|
||||
app.register_blueprint(module_bp, url_prefix='/module')
|
||||
app.register_blueprint(process_bp, url_prefix='/process')
|
||||
app.register_blueprint(user_bp, url_prefix='/user')
|
||||
Whitespace-only changes.
@@ -0,0 +1,113 @@
|
||||
import datetime
|
||||
import hashlib
|
||||
from functools import wraps
|
||||
|
||||
from pmc import DnfsComm
|
||||
from dnfs import UsersTable, DnfsTable
|
||||
|
||||
import jwt
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, current_app, make_response, jsonify
|
||||
|
||||
login_bp = Blueprint('login', __name__, template_folder='templates/login')
|
||||
|
||||
|
||||
comm = DnfsComm("http://localhost:8006")
|
||||
|
||||
|
||||
def get_user_from_token():
|
||||
token = request.cookies.get('token')
|
||||
if not token:
|
||||
return None
|
||||
try:
|
||||
payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
|
||||
return payload # 包含 user、user_id、exp 等字段
|
||||
except jwt.ExpiredSignatureError:
|
||||
return None
|
||||
except jwt.InvalidTokenError:
|
||||
return None
|
||||
|
||||
|
||||
@login_bp.after_request
|
||||
def add_cors_headers(response):
|
||||
response.headers['Access-Control-Allow-Origin'] = '*' # 允许所有来源跨域访问,如需限制可替换为具体域名
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
|
||||
return response
|
||||
|
||||
|
||||
def token_required(f):
|
||||
@wraps(f)
|
||||
def decorated(*args, **kwargs):
|
||||
# 从cookie中获取token
|
||||
token = request.cookies.get('token')
|
||||
if not token:
|
||||
return redirect(url_for('login.index'))
|
||||
try:
|
||||
jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
|
||||
except jwt.ExpiredSignatureError:
|
||||
return redirect(url_for('login.index'))
|
||||
except jwt.InvalidTokenError:
|
||||
return redirect(url_for('login.index'))
|
||||
return f(*args, **kwargs)
|
||||
return decorated
|
||||
|
||||
|
||||
@login_bp.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
@login_bp.route('/api/login', methods=['GET', 'POST'])
|
||||
def login():
|
||||
if request.method == 'POST':
|
||||
username = request.form.get('user-name')
|
||||
password = request.form.get('user-passwd')
|
||||
password = password.encode("utf-8")
|
||||
hashed_password = hashlib.sha256(password).hexdigest()
|
||||
try:
|
||||
data = comm.get_and_trans(0)
|
||||
dnfs_tab = DnfsTable(data)
|
||||
users = dnfs_tab.query_by_title('Users')
|
||||
table = UsersTable(users.content)
|
||||
data = table.user_exists(username, hashed_password)
|
||||
if not data:
|
||||
return "用户登录失败", 401
|
||||
_user_id, _username, _password, _role = data
|
||||
except DnfsComm.GetFailed:
|
||||
return "获取数据失败", 500
|
||||
except DnfsTable.NotFound:
|
||||
return "未找到用户表", 404
|
||||
except UsersTable.NotFound:
|
||||
return "用户不存在", 401
|
||||
except Exception as e:
|
||||
return str(e), 404
|
||||
# 生成 Token
|
||||
token = jwt.encode({
|
||||
'user_id': _user_id,
|
||||
'username': _username,
|
||||
'role': _role,
|
||||
'exp': datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=3)
|
||||
}, current_app.config['SECRET_KEY'], algorithm='HS256')
|
||||
|
||||
# 构造 JSON 响应体
|
||||
response = make_response(jsonify({
|
||||
"redirect": url_for('login.mgmt'), # 跳转路径
|
||||
"token": token
|
||||
}))
|
||||
|
||||
# 设置 Cookie
|
||||
response.set_cookie('token', token)
|
||||
return response
|
||||
else:
|
||||
return "登录失败"
|
||||
|
||||
|
||||
@login_bp.route('/api/mgmt')
|
||||
@token_required
|
||||
def mgmt():
|
||||
payload = get_user_from_token()
|
||||
if not payload:
|
||||
return redirect(url_for('login.index'))
|
||||
username = payload.get('username')
|
||||
role = payload.get('role')
|
||||
return render_template('mgmt.html', username=username, role=role)
|
||||
Whitespace-only changes.
@@ -0,0 +1,34 @@
|
||||
from pmc import PmcComm
|
||||
from flask import Blueprint, render_template
|
||||
|
||||
module_bp = Blueprint('module', __name__, template_folder='templates/features/module.html')
|
||||
|
||||
pmc = PmcComm('http://localhost:8012')
|
||||
pmc.Set_RSA_Pri_Key("private_key.pem")
|
||||
pmc.Try_Get_AES_Key()
|
||||
|
||||
|
||||
@module_bp.after_request
|
||||
def add_cors_headers(response):
|
||||
response.headers['Access-Control-Allow-Origin'] = '*' # 允许所有来源跨域访问,如需限制可替换为具体域名
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
|
||||
return response
|
||||
|
||||
|
||||
@module_bp.route('/api/mgmt/module', methods=['GET', 'POST'])
|
||||
def module():
|
||||
data = pmc.list_mods()
|
||||
modules = data.split('\n')
|
||||
return render_template('features/module.html', modules=modules)
|
||||
|
||||
|
||||
@module_bp.route('/create_module<string:mod_name>', methods=['GET', 'POST'])
|
||||
def create_module(mod_name):
|
||||
pass
|
||||
|
||||
|
||||
@module_bp.route('/delete_module<string:mod_name>', methods=['GET', 'POST'])
|
||||
def delete_module(mod_name):
|
||||
pass
|
||||
|
||||
Whitespace-only changes.
@@ -0,0 +1,53 @@
|
||||
from flask import Blueprint, render_template, jsonify, request
|
||||
from pmc import PmcComm
|
||||
|
||||
|
||||
process_bp = Blueprint('process', __name__, template_folder='templates/features/process.html')
|
||||
|
||||
pmc = PmcComm('http://localhost:8012')
|
||||
pmc.Set_RSA_Pri_Key("private_key.pem")
|
||||
pmc.Try_Get_AES_Key()
|
||||
|
||||
|
||||
@process_bp.after_request
|
||||
def add_cors_headers(response):
|
||||
response.headers['Access-Control-Allow-Origin'] = '*' # 允许所有来源跨域访问,如需限制可替换为具体域名
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
|
||||
return response
|
||||
|
||||
|
||||
@process_bp.route('/api/mgmt/process', methods=['GET', 'POST'])
|
||||
def process():
|
||||
pid = []
|
||||
status = []
|
||||
order = []
|
||||
ls = pmc.get_list()
|
||||
if ls != "":
|
||||
ls_1 = ls.split('\n')
|
||||
for l in ls_1:
|
||||
i, j, k = l.split('\t')
|
||||
pid.append(i)
|
||||
status.append(j)
|
||||
order.append(k)
|
||||
data = [{"pid": p, "status": s, "order": o} for p, s, o in zip(pid, status, order)]
|
||||
|
||||
return render_template('features/process.html', response=data)
|
||||
|
||||
|
||||
@process_bp.route('/kill_process<int:pid>', methods=['POST'])
|
||||
def kill_process(pid):
|
||||
pmc.kill(pid)
|
||||
return jsonify({"status": "success"})
|
||||
|
||||
|
||||
@process_bp.route('/clear_process', methods=['POST'])
|
||||
def clear_process():
|
||||
pmc.clear()
|
||||
return jsonify({"status": "success"})
|
||||
|
||||
|
||||
@process_bp.route('/create_process<string:name>', methods=['POST'])
|
||||
def create_process(name):
|
||||
pmc.start(name)
|
||||
return jsonify({"status": "success"})
|
||||
Whitespace-only changes.
@@ -0,0 +1,111 @@
|
||||
import jwt
|
||||
import hashlib
|
||||
from flask import Blueprint, render_template, request, current_app, jsonify
|
||||
from pmc import DnfsComm
|
||||
from dnfs import UsersTable, DnfsTable
|
||||
|
||||
user_bp = Blueprint('user', __name__, template_folder='templates/features/user.html')
|
||||
|
||||
comm = DnfsComm("http://localhost:8006")
|
||||
|
||||
|
||||
|
||||
def get_user_from_token():
|
||||
token = request.cookies.get('token')
|
||||
if not token:
|
||||
return None
|
||||
try:
|
||||
payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
|
||||
return payload # 包含 user、user_id、exp 等字段
|
||||
except jwt.ExpiredSignatureError:
|
||||
return None
|
||||
except jwt.InvalidTokenError:
|
||||
return None
|
||||
|
||||
|
||||
def get_node():
|
||||
try:
|
||||
data = comm.get_and_trans(0)
|
||||
except DnfsComm.GetFailed:
|
||||
return "获取数据失败", 500
|
||||
for item in data:
|
||||
if item['title'] == 'Users':
|
||||
node_id = item['id']
|
||||
node_content = item['content']
|
||||
return node_id, node_content
|
||||
return None
|
||||
|
||||
|
||||
@user_bp.after_request
|
||||
def add_cors_headers(response):
|
||||
response.headers['Access-Control-Allow-Origin'] = '*' # 允许所有来源跨域访问,如需限制可替换为具体域名
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
|
||||
return response
|
||||
|
||||
|
||||
@user_bp.route('/api/mgmt/user', methods=['GET', 'POST'])
|
||||
def user():
|
||||
try:
|
||||
data = comm.get_and_trans(0)
|
||||
dnfs_tab = DnfsTable(data)
|
||||
users = dnfs_tab.query_by_title('Users')
|
||||
table = UsersTable(users.content)
|
||||
crt_dict = lambda user: {'user_id': user.id, 'username': user.name, 'role': user.privileges}
|
||||
user_list = [crt_dict(user) for user in table.arr]
|
||||
except DnfsComm.GetFailed:
|
||||
return "获取数据失败", 500
|
||||
except DnfsTable.NotFound:
|
||||
return "未找到用户表", 404
|
||||
except UsersTable.NotFound:
|
||||
return "用户不存在", 401
|
||||
except Exception as e:
|
||||
return str(e), 404
|
||||
payload = get_user_from_token()
|
||||
if not payload:
|
||||
return jsonify({"error": "未授权访问"}), 401
|
||||
|
||||
user_id = payload.get('user_id')
|
||||
role = payload.get('role')
|
||||
|
||||
return render_template('features/user.html',
|
||||
response=user_list,
|
||||
current_user_id=user_id,
|
||||
current_role=role)
|
||||
|
||||
|
||||
@user_bp.route('/add_user', methods=['POST'])
|
||||
def add_user():
|
||||
node_id, msg = get_node()
|
||||
username = request.form.get('username')
|
||||
password = request.form.get('password')
|
||||
hashed_password = hashlib.sha256(password.encode("utf-8")).hexdigest()
|
||||
role = "normal"
|
||||
table = UsersTable(msg)
|
||||
table.add_user(username, hashed_password, role)
|
||||
table = str(table)
|
||||
comm.upd(node_id, 0, 'Users', table)
|
||||
return jsonify({"message": "用户添加成功"})
|
||||
|
||||
|
||||
@user_bp.route('/change_password', methods=['POST'])
|
||||
def change_password():
|
||||
node_id, msg = get_node()
|
||||
user_id = request.form.get('user_id')
|
||||
new_password = request.form.get('new_password')
|
||||
hashed_password = hashlib.sha256(new_password.encode("utf-8")).hexdigest()
|
||||
table = UsersTable(msg)
|
||||
table.change_password(int(user_id), hashed_password)
|
||||
table = str(table)
|
||||
comm.upd(node_id, 0, 'Users', table)
|
||||
return jsonify({"message": "密码修改成功"})
|
||||
|
||||
|
||||
@user_bp.route('/delete_user<int:user_id>', methods=['POST'])
|
||||
def delete_user(user_id):
|
||||
node_id, msg = get_node()
|
||||
table = UsersTable(msg)
|
||||
table.del_user(user_id)
|
||||
table = str(table)
|
||||
comm.upd(node_id, 0, 'Users', table)
|
||||
return jsonify({"message": "用户删除成功"})
|
||||
Reference in new issue
Block a user