修复bug

main
周平 1 year ago
parent 734ba9818c
commit baef5ee8a9

@ -216,11 +216,11 @@ class EnterpriseDeviceRepository(object):
logging.error("Failed to list devices") logging.error("Failed to list devices")
raise e raise e
device_dicts = [] device_dicts = []
for device in devices: for device, cname in devices:
device_dict = { device_dict = {
"id": device.id, "id": device.id,
"name": device.name, "name": device.name,
"classification_name": device.classification_name, "classification_name": cname,
} }
device_dicts.append(device_dict) device_dicts.append(device_dict)
return device_dicts return device_dicts

@ -20,14 +20,14 @@ class EnterpriseNodeAlertRepository(object):
return to_json_list(cursor) return to_json_list(cursor)
def get_one( def get_one(
self, enterprise_suid: str, enterprise_node_id: int self, entity_suid: str, node_id: int
) -> Union[Dict, None]: ) -> Union[Dict, None]:
with get_session() as session: with get_session() as session:
sql = text( sql = text(
"""SELECT * FROM `enterprise_alert` WHERE `enterprise_suid`=:enterprise_suid and `node_id`=:node_id;""" """SELECT * FROM `enterprise_alert` WHERE `entity_suid`=:entity_suid and `node_id`=:node_id;"""
) )
cursor = session.execute( cursor = session.execute(
sql, {"enterprise_suid": enterprise_suid, "node_id": enterprise_node_id} sql, {"entity_suid": entity_suid, "node_id": node_id}
) )
return to_json(cursor) return to_json(cursor)
@ -35,11 +35,10 @@ class EnterpriseNodeAlertRepository(object):
with get_session() as session: with get_session() as session:
sql = text( sql = text(
""" """
INSERT INTO `enterprise_alert` (`enterprise_suid`, `node_id`, `node_suid`, `is_sms`, `sms_to`, `is_email`, `email_to`, `freq`) INSERT INTO `enterprise_alert` (`entity_suid`, `node_id`, `node_suid`, `is_sms`, `sms_to`, `is_email`, `email_to`, `freq`)
VALUES (:enterprise_suid, :node_id, :node_suid, :is_sms, :sms_to, :is_email, :email_to, :freq) VALUES (:entity_suid, :node_id, :node_suid, :is_sms, :sms_to, :is_email, :email_to, :freq)
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
`node_suid`=:node_suid, `is_sms`=:is_sms, `sms_to`=:sms_to, `is_email`=:is_email, `email_to`=:email_to, `freq`=:freq `node_suid`=:node_suid, `is_sms`=:is_sms, `sms_to`=:sms_to, `is_email`=:is_email, `email_to`=:email_to, `freq`=:freq
WHERE `enterprise_suid` = :enterprise_suid AND `node_id` = :node_id;
""" """
) )
session.execute(sql, data) session.execute(sql, data)

@ -50,11 +50,12 @@ class EnterpriseNodeDeviceBMCusConfRepository():
session.commit() session.commit()
return return
def get_busi_model_custom_config(self, node_id: int, device_id: int, busi_model_id: int): def get_busi_model_custom_config(self, node_id: int, device_id: int, busi_model_id: int, base_model_id: int):
with get_session() as session: with get_session() as session:
data = session.query(EnterpriseNodeDeviceBMCusConf).filter( data = session.query(EnterpriseNodeDeviceBMCusConf).filter(
EnterpriseNodeDeviceBMCusConf.node_id == node_id, EnterpriseNodeDeviceBMCusConf.node_id == node_id,
EnterpriseNodeDeviceBMCusConf.device_id == device_id, EnterpriseNodeDeviceBMCusConf.device_id == device_id,
EnterpriseNodeDeviceBMCusConf.busi_model_id == busi_model_id EnterpriseNodeDeviceBMCusConf.busi_model_id == busi_model_id,
EnterpriseNodeDeviceBMCusConf.base_model_id == base_model_id
).first() ).first()
return data return data

@ -2,18 +2,19 @@
import ast import ast
import functools import functools
import hashlib import hashlib
import json
import logging import logging
import re import re
import time import time
import traceback import traceback
import urllib import urllib
import json from typing import Any
# import urlparse # import urlparse
from urllib.parse import parse_qs, unquote from urllib.parse import parse_qs, unquote
from typing import Any
# from urllib import unquote
# from urllib import unquote
import tornado import tornado
from sqlalchemy import text
from tornado import escape from tornado import escape
from tornado.httpclient import AsyncHTTPClient, HTTPRequest from tornado.httpclient import AsyncHTTPClient, HTTPRequest
from tornado.options import options from tornado.options import options
@ -102,6 +103,7 @@ class BaseHandler(BaseRequestHandler):
@property @property
def kafka_producer(self): def kafka_producer(self):
return self.application.kafka_producer return self.application.kafka_producer
# #
@property @property
def es(self): def es(self):
@ -326,6 +328,7 @@ class BaseHandler(BaseRequestHandler):
current_pos += len(substring) current_pos += len(substring)
current_pos = target.find(substring, current_pos) current_pos = target.find(substring, current_pos)
class WebHandler(BaseHandler): class WebHandler(BaseHandler):
def finish(self, chunk=None, message=None): def finish(self, chunk=None, message=None):
callback = escape.utf8(self.get_argument("callback", None)) callback = escape.utf8(self.get_argument("callback", None))
@ -467,6 +470,7 @@ def authenticated(method):
# raise HTTPError(401) # raise HTTPError(401)
raise errors.HTTPAPIError(errors.ERROR_UNAUTHORIZED, "登录失效") raise errors.HTTPAPIError(errors.ERROR_UNAUTHORIZED, "登录失效")
return method(self, *args, **kwargs) return method(self, *args, **kwargs)
return wrapper return wrapper
@ -481,28 +485,41 @@ def authenticated_admin(method):
return wrapper return wrapper
def operation_log(primary_module, secondary_module, operation_type, content, desc): def operation_log(primary_menu, sub_menu, ope_type, content, comment):
""" """
Add logging to a function. level is the logging Add logging to a function. level is the logging
level, name is the logger name, and message is the level, name is the logger name, and message is the
log message. If name and message aren't specified, log message. If name and message aren't specified,
they default to the function's module and name. they default to the function's module and name.
""" """
def decorate(func):
def decorate(func):
@functools.wraps(func) @functools.wraps(func)
def wrapper(self, *args, **kwargs): def wrapper(self, *args, **kwargs):
self.db_app.insert( with self.app_mysql.connect() as conn:
"insert into system_log(user, ip, first_module, second_module, op_type, op_content, description) " conn.execute(text(
"values(%s, %s, %s, %s, %s, %s, %s)", "insert into sys_log(user, ip, primary_menu, sub_menu, op_type, content, comment) "
self.current_user.name, self.request.headers["X-Forwarded-For"], primary_module, secondary_module, operation_type, "values(:user, :ip, :primary_menu, :sub_menu, :op_type, :content, :comment)"
content, desc ),
{"user": self.current_user.name,
"ip": self.request.headers[
"X-Forwarded-For"] if "X-Forwarded-For" in self.request.headers else self.request.remote_ip,
"primary_menu": primary_menu,
"sub_menu": sub_menu,
"op_type": ope_type,
"content": content,
"comment": comment
}
) )
conn.commit()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
return wrapper return wrapper
return decorate return decorate
def permission(codes): def permission(codes):
def decorate(func): def decorate(func):
@functools.wraps(func) @functools.wraps(func)
@ -517,9 +534,12 @@ def permission(codes):
raise errors.HTTPAPIError(errors.ERROR_FORBIDDEN, "permission denied") raise errors.HTTPAPIError(errors.ERROR_FORBIDDEN, "permission denied")
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
return wrapper return wrapper
return decorate return decorate
def license_validate(codes): def license_validate(codes):
def decorate(func): def decorate(func):
@functools.wraps(func) @functools.wraps(func)
@ -531,7 +551,8 @@ def license_validate(codes):
else: else:
row = self.db_app.get("select syscode, expireat from license limit 1") row = self.db_app.get("select syscode, expireat from license limit 1")
if row: if row:
self.r_app.set("system:license", json.dumps({"syscode":row["syscode"], "expireat":row["expireat"]})) self.r_app.set("system:license",
json.dumps({"syscode": row["syscode"], "expireat": row["expireat"]}))
license_info = row license_info = row
license_status = get_license_status(license_info) license_status = get_license_status(license_info)
@ -546,9 +567,12 @@ def license_validate(codes):
# raise errors.HTTPAPIError(errors.ERROR_LICENSE_NOT_ACTIVE, "License授权过期") # raise errors.HTTPAPIError(errors.ERROR_LICENSE_NOT_ACTIVE, "License授权过期")
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
return wrapper return wrapper
return decorate return decorate
def userlog(method): def userlog(method):
@functools.wraps(method) @functools.wraps(method)
def wrapper(self, *args, **kwargs): def wrapper(self, *args, **kwargs):

@ -395,6 +395,9 @@ class DeviceBasemodelListHandler(APIHandler):
busi_model_id = item["busi_model_id"] busi_model_id = item["busi_model_id"]
busi_model_name = item["name"] busi_model_name = item["name"]
base_model_list = json.loads(item["base_models"]) base_model_list = json.loads(item["base_models"])
logging.info("##############################################################")
logging.info(base_model_list)
logging.info("##############################################################")
base_models = [] base_models = []
for base_model in base_model_list: for base_model in base_model_list:
base_model_id = base_model["id"] base_model_id = base_model["id"]
@ -404,8 +407,12 @@ class DeviceBasemodelListHandler(APIHandler):
base_model = db_alg_model.get_model_dict_by_id(base_model_id) base_model = db_alg_model.get_model_dict_by_id(base_model_id)
base_model_version = base_model["default_version"] base_model_version = base_model["default_version"]
db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository() db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository()
conf = db_conf.get_busi_model_custom_config(busi_model_id=busi_model_id, device_id=device_id, conf = db_conf.get_busi_model_custom_config(
node_id=item["node_id"]) node_id=item["node_id"],
device_id=device_id,
busi_model_id=busi_model_id,
base_model_id=base_model_id
)
base_model_hub_image = "" base_model_hub_image = ""
if conf: if conf:
base_model_hub_image = conf.model_hub_image base_model_hub_image = conf.model_hub_image

@ -364,7 +364,7 @@ class BusimodelDeployHandler(APIHandler):
records.append( records.append(
{ {
"suid": shortuuid.ShortUUID.random(length=10), "suid": shortuuid.ShortUUID().random(length=10),
"entity_suid": entity_suid_row["entity_suid"], "entity_suid": entity_suid_row["entity_suid"],
"node_id": node_id, "node_id": node_id,
"node_suid": node_suid, "node_suid": node_suid,

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging
import random import random
from sqlalchemy import text from sqlalchemy import text
@ -7,7 +8,7 @@ from website import errors
from website import settings from website import settings
from website.db.enterprise_device.enterprise_device import EnterpriseEntityRepository as EntRepo from website.db.enterprise_device.enterprise_device import EnterpriseEntityRepository as EntRepo
from website.db_mysql import to_json_list, to_json from website.db_mysql import to_json_list, to_json
from website.handler import APIHandler, authenticated from website.handler import APIHandler, authenticated, operation_log
from website.util import aes from website.util import aes
from website.util import shortuuid from website.util import shortuuid
@ -28,6 +29,7 @@ class AddHandler(APIHandler):
""" """
@authenticated @authenticated
@operation_log("企业项目", "服务器管理", "新建", "新建服务器", "")
def post(self): def post(self):
entity_id = self.get_int_argument('entity_id') entity_id = self.get_int_argument('entity_id')
name = self.get_escaped_argument('name', '') name = self.get_escaped_argument('name', '')
@ -66,6 +68,34 @@ class AddHandler(APIHandler):
self.finish() self.finish()
class EditHandler(APIHandler):
@authenticated
@operation_log("企业项目", "服务器管理", "编辑", "编辑服务器", "")
def post(self):
server_id = self.get_int_argument("id")
name = self.get_escaped_argument('name', '')
ip = self.get_escaped_argument('ip', '')
port = self.get_int_argument("port", 22)
username = self.get_escaped_argument('username', '')
passwd = self.get_escaped_argument('passwd', '')
with self.app_mysql.connect() as conn:
conn.execute(
text(
"update enterprise_server "
"set name=:name, ip=:ip, port=:port, username=:username, passwd=:passwd where id=:id"
), {
"id": server_id,
"name": name,
"ip": ip,
"port": port,
"username": username,
"passwd": aes.encrypt(settings.enterprise_aes_key, passwd)
})
conn.commit()
self.finish()
class ListHandler(APIHandler): class ListHandler(APIHandler):
""" """
- 描述服务器列表 - 描述服务器列表
@ -96,6 +126,7 @@ class ListHandler(APIHandler):
""" """
@authenticated @authenticated
@operation_log("企业项目", "服务器管理", "查询", "查询服务器列表", "")
def post(self): def post(self):
entity_id = self.get_int_argument('entity_id') entity_id = self.get_int_argument('entity_id')
status = self.get_int_argument("status") status = self.get_int_argument("status")
@ -118,7 +149,12 @@ class ListHandler(APIHandler):
p.update({"status": status}) p.update({"status": status})
count = conn.scalar(text(sql_count), p) count = conn.scalar(text(sql_count), p)
data = conn.execute(text(sql_data), p).limit(pageSize).offset((pageNo - 1) * pageSize)
sql_data += " order by id desc limit :pageSize offset :offset"
p.update({"offset": (pageNo - 1) * pageSize, "pageSize": pageSize})
data = conn.execute(text(sql_data), p)
data = to_json_list(data)
status_dic = {1001: 0, 1002: 0} status_dic = {1001: 0, 1002: 0}
sql_status = "select status, count(id) c from enterprise_server where entity_id=:entity_id group by status" sql_status = "select status, count(id) c from enterprise_server where entity_id=:entity_id group by status"
@ -126,7 +162,8 @@ class ListHandler(APIHandler):
status_list = to_json_list(status_cur) status_list = to_json_list(status_cur)
for item in status_list: for item in status_list:
status_dic[item["status"]] = item["c"] status_dic[item["status"]] = item["c"]
logging.info("####################### ")
logging.info(data)
for item in data: for item in data:
item.update( item.update(
{"cpu": random.randint(20, 30), {"cpu": random.randint(20, 30),
@ -134,7 +171,7 @@ class ListHandler(APIHandler):
"storage": random.randint(20, 30), "storage": random.randint(20, 30),
"gpu": random.randint(20, 30), }) "gpu": random.randint(20, 30), })
self.finish({"count": count, "data": to_json_list(data), "status": status_dic}) self.finish({"count": count, "data": data, "status": status_dic})
class InfoHandler(APIHandler): class InfoHandler(APIHandler):
@ -159,6 +196,7 @@ class InfoHandler(APIHandler):
""" """
@authenticated @authenticated
@operation_log("企业项目", "服务器管理", "查询", "查询服务器信息", "")
def post(self): def post(self):
server_id = self.get_int_argument('server_id') server_id = self.get_int_argument('server_id')
with self.app_mysql.connect() as conn: with self.app_mysql.connect() as conn:
@ -177,6 +215,7 @@ class InfoHandler(APIHandler):
class DeleteHandler(APIHandler): class DeleteHandler(APIHandler):
@authenticated @authenticated
@operation_log("企业项目", "服务器管理", "删除", "删除服务器", "")
def post(self): def post(self):
server_id = self.get_int_argument('server_id') server_id = self.get_int_argument('server_id')
with self.app_mysql.connect() as conn: with self.app_mysql.connect() as conn:
@ -211,8 +250,11 @@ class LogHandler(APIHandler):
p.update({"entity_id": entity_id}) p.update({"entity_id": entity_id})
count = conn.scalar(text(sql_count), p) count = conn.scalar(text(sql_count), p)
data = conn.execute(text(sql_data), p).order_by(text("id desc")).limit(pageSize).offset(
(pageNo - 1) * pageSize) sql_data += " order by id desc limit :pageSize offset :offset"
p.update({"offset": (pageNo - 1) * pageSize, "pageSize": pageSize})
data = conn.execute(text(sql_data), p)
data = to_json_list(data) data = to_json_list(data)
self.finish({"count": count, "data": data}) self.finish({"count": count, "data": data})

@ -4,6 +4,7 @@ from website.handlers.enterprise_server import handler
handlers = [ handlers = [
("/enterprise/server/add", handler.AddHandler), ("/enterprise/server/add", handler.AddHandler),
("/enterprise/server/edit", handler.EditHandler),
("/enterprise/server/list", handler.ListHandler), ("/enterprise/server/list", handler.ListHandler),
("/enterprise/server/info", handler.InfoHandler), ("/enterprise/server/info", handler.InfoHandler),
("/enterprise/server/log", handler.LogHandler), ("/enterprise/server/log", handler.LogHandler),

@ -13,7 +13,9 @@ import datetime
from website import errors from website import errors
from website import settings from website import settings
from website.handler import APIHandler, WebHandler, authenticated, operation_log, permission from website.handler import APIHandler, WebHandler, authenticated, operation_log, permission
from website.db_mysql import to_json_list
from website.util import sysinfo, rsa from website.util import sysinfo, rsa
from sqlalchemy import text
class VersionHandler(APIHandler): class VersionHandler(APIHandler):
@ -125,3 +127,41 @@ class InfoHandler(APIHandler):
def post(self): def post(self):
self.finish() self.finish()
class LogHandler(APIHandler):
@authenticated
def post(self):
user = self.get_escaped_argument("user", "")
start = self.get_escaped_argument("startDate", "")
end = self.get_escaped_argument("endDate", "")
pageNo = self.get_int_argument("pageNo", 1)
pageSize = self.get_int_argument("pageSize", 20)
users = user.split(",")
with self.app_mysql.connect() as conn:
sql = "select user, ip, content, op_type, content from sys_log where 1=1"
sql_count = "select count(*) from sys_log where 1=1"
p = {}
if users:
sql += " and user in :users"
sql_count += " and user in :users"
p["users"] = users
if start:
sql += " and date_format(create_time, '%Y-%m-%d') >= :start"
sql_count += " and date_format(create_time, '%Y-%m-%d') >= :start"
p["start"] = start
if end:
sql += " and date_format(create_time, '%Y-%m-%d') <= :end"
sql_count += " and date_format(create_time, '%Y-%m-%d') <= :end"
p["end"] = end
count = conn.scalar(text(sql_count), p)
sql += " order by create_time desc limit :pageNo, :pageSize"
p["pageNo"] = (pageNo - 1) * pageSize
p["pageSize"] = pageSize
res = conn.execute(text(sql), p)
data = to_json_list(res)
self.finish({"count": count, "data": data})

@ -8,6 +8,8 @@ handlers = [
("/system/license/upload", handler.LicenseUploadHandler), ("/system/license/upload", handler.LicenseUploadHandler),
("/system/activate/info", handler.ActivateInfoHandler), ("/system/activate/info", handler.ActivateInfoHandler),
("/system/info", handler.InfoHandler), ("/system/info", handler.InfoHandler),
("/system/log", handler.LogHandler),
] ]
page_handlers = [ page_handlers = [

@ -1,25 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging
import json
import base64 import base64
import tornado.web import json
import logging
import uuid import uuid
import time from io import BytesIO
import datetime
import itertools from sqlalchemy import text
from io import StringIO, BytesIO
from website import db_mysql
from website import errors from website import errors
from website import settings from website import settings
from website import db_mysql from website.handler import APIHandler, authenticated
from website import consts
from website.handler import APIHandler
from website.util import aes from website.util import aes
from website.util.captcha import create_validate_code
from website.service.license import get_license_status
from website.util import shortuuid from website.util import shortuuid
from sqlalchemy import text from website.util.captcha import create_validate_code
import tornado.escape
class CaptchaHandler(APIHandler): class CaptchaHandler(APIHandler):
@ -40,6 +34,7 @@ class CaptchaHandler(APIHandler):
# output.close() # output.close()
self.finish({"token": self.tostr(token), "captcha": self.tostr(img_b64)}) self.finish({"token": self.tostr(token), "captcha": self.tostr(img_b64)})
class LogoutHandler(APIHandler): class LogoutHandler(APIHandler):
def get(self): def get(self):
if self.current_user: if self.current_user:
@ -52,6 +47,7 @@ class LogoutHandler(APIHandler):
self.r_app.delete(settings.session_key_prefix % self.current_user.uuid) self.r_app.delete(settings.session_key_prefix % self.current_user.uuid)
self.finish() self.finish()
class LoginHandler(APIHandler): class LoginHandler(APIHandler):
def post(self): def post(self):
suid = shortuuid.ShortUUID().random(10) suid = shortuuid.ShortUUID().random(10)
@ -93,7 +89,6 @@ class LoginHandler(APIHandler):
# if self.tostr(captcha).lower() != self.tostr(code).lower(): # if self.tostr(captcha).lower() != self.tostr(code).lower():
# raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "验证码错误") # raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "验证码错误")
username = self.tostr(username) username = self.tostr(username)
password = self.tostr(password) password = self.tostr(password)
@ -182,3 +177,17 @@ class UserInfoHandler(APIHandler):
raise errors.HTTPAPIError(errors.ERROR_UNAUTHORIZED) raise errors.HTTPAPIError(errors.ERROR_UNAUTHORIZED)
self.finish({"name": user.name, "role": user.role}) self.finish({"name": user.name, "role": user.role})
class UserListHandler(APIHandler):
@authenticated
def post(self):
with self.app_mysql.connect() as conn:
cur = conn.execute(
text(
"select name from sys_user"
)
)
res = db_mysql.to_json_list(cur)
names = [row["name"] for row in res]
self.finish({"data": names})

@ -8,6 +8,7 @@ handlers = [
# ("/user/info", handler.UserInfoHandler), # ("/user/info", handler.UserInfoHandler),
("/login", handler.LoginHandler), ("/login", handler.LoginHandler),
("/logout", handler.LogoutHandler), ("/logout", handler.LogoutHandler),
("/users", handler.UserListHandler),
] ]
page_handlers = [ page_handlers = [

Loading…
Cancel
Save