commit
0dfc4dcac4
@ -0,0 +1,8 @@ |
|||||||
|
# Default ignored files |
||||||
|
/shelf/ |
||||||
|
/workspace.xml |
||||||
|
# Editor-based HTTP Client requests |
||||||
|
/httpRequests/ |
||||||
|
# Datasource local storage ignored files |
||||||
|
/dataSources/ |
||||||
|
/dataSources.local.xml |
@ -0,0 +1,27 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<module type="PYTHON_MODULE" version="4"> |
||||||
|
<component name="FacetManager"> |
||||||
|
<facet type="django" name="Django"> |
||||||
|
<configuration> |
||||||
|
<option name="rootFolder" value="" /> |
||||||
|
<option name="settingsModule" value="" /> |
||||||
|
<option name="manageScript" value="" /> |
||||||
|
<option name="environment" value="<map/>" /> |
||||||
|
<option name="doNotUseTestRunner" value="false" /> |
||||||
|
<option name="trackFilePattern" value="" /> |
||||||
|
</configuration> |
||||||
|
</facet> |
||||||
|
</component> |
||||||
|
<component name="NewModuleRootManager"> |
||||||
|
<content url="file://$MODULE_DIR$" /> |
||||||
|
<orderEntry type="jdk" jdkName="Python 2.7 (2)" jdkType="Python SDK" /> |
||||||
|
<orderEntry type="sourceFolder" forTests="false" /> |
||||||
|
</component> |
||||||
|
<component name="PyDocumentationSettings"> |
||||||
|
<option name="format" value="PLAIN" /> |
||||||
|
<option name="myDocStringFormat" value="Plain" /> |
||||||
|
</component> |
||||||
|
<component name="TemplatesService"> |
||||||
|
<option name="TEMPLATE_CONFIGURATION" value="Django" /> |
||||||
|
</component> |
||||||
|
</module> |
@ -0,0 +1,14 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="PublishConfigData"> |
||||||
|
<serverData> |
||||||
|
<paths name="master@10.67.1.224:22"> |
||||||
|
<serverdata> |
||||||
|
<mappings> |
||||||
|
<mapping local="$PROJECT_DIR$" web="/" /> |
||||||
|
</mappings> |
||||||
|
</serverdata> |
||||||
|
</paths> |
||||||
|
</serverData> |
||||||
|
</component> |
||||||
|
</project> |
@ -0,0 +1,6 @@ |
|||||||
|
<component name="InspectionProjectProfileManager"> |
||||||
|
<settings> |
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" /> |
||||||
|
<version value="1.0" /> |
||||||
|
</settings> |
||||||
|
</component> |
@ -0,0 +1,7 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="JavaScriptSettings"> |
||||||
|
<option name="languageLevel" value="ES6" /> |
||||||
|
</component> |
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7 (2)" project-jdk-type="Python SDK" /> |
||||||
|
</project> |
@ -0,0 +1,8 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="ProjectModuleManager"> |
||||||
|
<modules> |
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/demo.iml" filepath="$PROJECT_DIR$/.idea/demo.iml" /> |
||||||
|
</modules> |
||||||
|
</component> |
||||||
|
</project> |
@ -0,0 +1 @@ |
|||||||
|
# -*-coding:utf-8 -*- |
@ -0,0 +1,31 @@ |
|||||||
|
# -*-coding:utf-8 -*- |
||||||
|
# 组件启动脚本,调用组件管理提供的批量启用接口启用 jobs/jobmeta.json里描述的组件任务,以及组件自定义的动作 |
||||||
|
import json |
||||||
|
import os |
||||||
|
|
||||||
|
from appManager.module.global_api import ComponentHelper |
||||||
|
|
||||||
|
DIR_PATH = os.path.split(os.path.realpath(__file__))[0] |
||||||
|
BASE_PATH = os.path.split(DIR_PATH)[0] |
||||||
|
|
||||||
|
|
||||||
|
def start(): |
||||||
|
with open(os.path.join(BASE_PATH, "package.json"), "r+") as f: |
||||||
|
pkgConfig = json.load(f) |
||||||
|
app_name = pkgConfig["name"] |
||||||
|
componentHelper = ComponentHelper(app_name) |
||||||
|
# 调用组件管理接口启动任务 |
||||||
|
componentHelper.start_task() |
||||||
|
# 创建kafka topic |
||||||
|
# createTopic() |
||||||
|
# 创建数据源 |
||||||
|
# createDataSource() |
||||||
|
return True |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
# exit 为 0,组件启动成功,为1,组件启动失败 |
||||||
|
if start(): |
||||||
|
exit(0) |
||||||
|
else: |
||||||
|
exit(1) |
@ -0,0 +1,21 @@ |
|||||||
|
# -*-coding:utf-8 -*- |
||||||
|
import json |
||||||
|
import os |
||||||
|
from appManager.module.global_api import ComponentHelper |
||||||
|
|
||||||
|
DIR_PATH = os.path.split(os.path.realpath(__file__))[0] |
||||||
|
BASE_PATH = os.path.split(DIR_PATH)[0] |
||||||
|
|
||||||
|
|
||||||
|
# 组件停止脚本 |
||||||
|
def stop(): |
||||||
|
with open(os.path.join(BASE_PATH, "package.json"), "r+") as f: |
||||||
|
pkgConfig = json.load(f) |
||||||
|
app_name = pkgConfig["name"] |
||||||
|
componentHelper = ComponentHelper(app_name) |
||||||
|
# 调用组件管理接口停用任务 |
||||||
|
componentHelper.stop_task() |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
stop() |
@ -0,0 +1,40 @@ |
|||||||
|
# -*-coding:utf-8 -*- |
||||||
|
# 组件卸载时执行的脚本 |
||||||
|
from dataInterface.functions import CFunction |
||||||
|
from dataInterface.db.params import CPgSqlParam |
||||||
|
|
||||||
|
|
||||||
|
def uninstall(): |
||||||
|
# 组件卸载动作 |
||||||
|
# 1. 删除任务 |
||||||
|
remove_task() |
||||||
|
# 2.删除数据库schema |
||||||
|
uninstall_db_schema() |
||||||
|
# 3. 删除kafka topic |
||||||
|
delete_kafka_topic() |
||||||
|
# 4. 其他操作等 |
||||||
|
|
||||||
|
|
||||||
|
def remove_task(): |
||||||
|
""" |
||||||
|
组件批量注销任务 |
||||||
|
""" |
||||||
|
from appManager.module.global_api import ComponentHelper |
||||||
|
ch = ComponentHelper('demo') |
||||||
|
ch_ret = ch.remove_task() |
||||||
|
|
||||||
|
|
||||||
|
def uninstall_db_schema(): |
||||||
|
''' 删除数据库schema ''' |
||||||
|
try: |
||||||
|
sql = CPgSqlParam("drop schema if exists demo cascade") |
||||||
|
CFunction.execute(sql) |
||||||
|
except Exception as e: |
||||||
|
raise e |
||||||
|
# logger.error("delete data schema fail! reason: %s" % e) |
||||||
|
|
||||||
|
def delete_kafka_topic(): |
||||||
|
from appsUtils.kafkaUtil import KAFKA_API |
||||||
|
api = KAFKA_API() |
||||||
|
api. delete_topic('topic_name') |
||||||
|
|
@ -0,0 +1,65 @@ |
|||||||
|
#!/usr/bin/python |
||||||
|
#encoding=utf-8 |
||||||
|
# author: tangwy |
||||||
|
|
||||||
|
import json |
||||||
|
import os,re |
||||||
|
import codecs |
||||||
|
import csv |
||||||
|
import ConfigParser |
||||||
|
from ipaddr import IPRange |
||||||
|
from elasticsearch import Elasticsearch |
||||||
|
|
||||||
|
conf_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'conf') |
||||||
|
ini_path = os.path.join(conf_path, 'conf.ini') |
||||||
|
config = ConfigParser.ConfigParser() |
||||||
|
config.read(ini_path) |
||||||
|
|
||||||
|
ES_HOST = config.get('COMMON', 'es_host') |
||||||
|
ES_PER_COUNT = config.get('COMMON', 'es_per_count') |
||||||
|
ES_INDEX_NAME = config.get('COMMON', 'es_index_name') |
||||||
|
|
||||||
|
CSV_FILE_PATH = config.get('COMMON', 'csv_file_path') |
||||||
|
|
||||||
|
# scroll查询数据 |
||||||
|
def get_es_data(start_time,end_time): |
||||||
|
es = Elasticsearch(ES_HOST) |
||||||
|
msg = es.search(index=ES_INDEX_NAME,scroll="3m",size=ES_PER_COUNT,_source_includes= ["cookies","url","sip","dip"], query={ |
||||||
|
"bool": { |
||||||
|
"filter": { |
||||||
|
"range": { |
||||||
|
"timestamp": { |
||||||
|
"gte": start_time, |
||||||
|
"lte": end_time |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
result = msg['hits']['hits'] |
||||||
|
total = msg['hits']['total'] |
||||||
|
scroll_id = msg['_scroll_id'] |
||||||
|
|
||||||
|
for i in range(0,int(total["value"]/ES_PER_COUNT)+1): |
||||||
|
query_scroll = es.scroll(scroll_id=scroll_id, scroll='3m')["hits"]["hits"] |
||||||
|
result += query_scroll |
||||||
|
return result |
||||||
|
|
||||||
|
# 读取csv文件 获取ip归属地 |
||||||
|
def get_ip_area_relation(csv_file_path): |
||||||
|
iprange_map = {} |
||||||
|
with codecs.open(csv_file_path, mode='r',encoding='utf-8') as file: |
||||||
|
csv_reader = csv.reader(file) |
||||||
|
for row in csv_reader: |
||||||
|
headers = next(csv_reader) |
||||||
|
ip_start = headers[0] |
||||||
|
ip_end = headers[1] |
||||||
|
ip_range = IPRange(ip_start, ip_end) |
||||||
|
ip_area = headers[5] |
||||||
|
print (ip_area) |
||||||
|
for ip in ip_range: |
||||||
|
iprange_map[ip] = ip_area |
||||||
|
return iprange_map |
||||||
|
|
||||||
|
get_ip_area_relation("/tmp/data/ip_area_relation.csv") |
@ -0,0 +1 @@ |
|||||||
|
# -*-coding:utf-8 -*- |
@ -0,0 +1,5 @@ |
|||||||
|
[COMMON] |
||||||
|
es_index_name = 'bsa_traffic*' |
||||||
|
es_host = 'http://10.65.74.3:19399' |
||||||
|
es_pre_count = 100 |
||||||
|
csv_file_path = "/tmp/data/ip_area_relation.csv" |
@ -0,0 +1,145 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
# -*-coding:utf-8 -*- |
||||||
|
|
||||||
|
import sys |
||||||
|
import os |
||||||
|
import json |
||||||
|
import shutil |
||||||
|
import traceback |
||||||
|
import logging |
||||||
|
from appManager.module.global_api import ComponentHelper |
||||||
|
from appsUtils.confutil import ConfUtil |
||||||
|
|
||||||
|
|
||||||
|
BASE_PATH = os.path.split(os.path.realpath(__file__))[0] |
||||||
|
DSTPATH = sys.argv[1] |
||||||
|
ISUPDATE = sys.argv[2] |
||||||
|
CUR_PATH = os.path.normpath(os.path.dirname(os.path.abspath(__file__))) |
||||||
|
APP_NAME = 'UebaMetricsAnalysis' |
||||||
|
|
||||||
|
def get_logger(logger_name=APP_NAME, logger_level=logging.INFO): |
||||||
|
"""日志""" |
||||||
|
import logging.handlers |
||||||
|
logger = logging.getLogger(logger_name) |
||||||
|
formatter = logging.Formatter( |
||||||
|
'%(asctime)s %(levelname)s %(filename)s %(funcName)s:%(lineno)d %(message)s') |
||||||
|
logger.setLevel(logger_level) |
||||||
|
logger_file = os.path.normpath(os.path.join('/home/master', 'logs')) |
||||||
|
if not os.path.exists(logger_file): |
||||||
|
os.mkdir(logger_file) |
||||||
|
if not logger.handlers: |
||||||
|
file_handler = logging.handlers.TimedRotatingFileHandler( |
||||||
|
os.path.normpath(logger_file + os.sep + logger_name + '.log'), 'midnight') |
||||||
|
file_handler.suffix = "%Y-%m-%d" |
||||||
|
file_handler.setLevel(logger_level) |
||||||
|
file_handler.setFormatter(formatter) |
||||||
|
logger.addHandler(file_handler) |
||||||
|
return logger |
||||||
|
|
||||||
|
|
||||||
|
logger = get_logger("UebaMetricsAnalysis") |
||||||
|
|
||||||
|
|
||||||
|
def installDBSchema(exec_sql): |
||||||
|
try: |
||||||
|
confutil = ConfUtil() |
||||||
|
curPgConf = confutil.getPostgresqlConf() |
||||||
|
sqlPath = os.path.join(CUR_PATH, APP_NAME, 'sql') |
||||||
|
|
||||||
|
for sqlfile in exec_sql: |
||||||
|
if sqlfile == "pg_update.sql": |
||||||
|
continue |
||||||
|
sqlPath = os.path.join(CUR_PATH, APP_NAME, 'sql', sqlfile) |
||||||
|
cmd = 'psql -U %s %s<"%s"' % (curPgConf["username"], curPgConf["database"], sqlPath,) |
||||||
|
logger.info(cmd) |
||||||
|
r = os.popen(cmd) |
||||||
|
logger.info(sqlfile + ' ' + str(r.readlines())) |
||||||
|
logger.info('create schema successfully.') |
||||||
|
except Exception as e: |
||||||
|
logger.info(str(e)) |
||||||
|
|
||||||
|
|
||||||
|
def add_task(): |
||||||
|
# 组件批量注册任务 |
||||||
|
ch = ComponentHelper(APP_NAME) |
||||||
|
logger.info("开始注册定时任务") |
||||||
|
ch_ret = ch.add_task() |
||||||
|
if ch_ret['status'] != 200: |
||||||
|
logger.info('add task failed, reason is %s' % ch_ret['msg']) |
||||||
|
else: |
||||||
|
logger.info('add task successfully.') |
||||||
|
logger.info("定时任务注册成功") |
||||||
|
|
||||||
|
|
||||||
|
class Install(): |
||||||
|
def __init__(self): |
||||||
|
self.app_name = self.__get_app_name() |
||||||
|
|
||||||
|
def install(self): |
||||||
|
try: |
||||||
|
installDBSchema(["pg_struct.sql"]) |
||||||
|
add_task() |
||||||
|
logger.info('>>>安装结束!!!') |
||||||
|
except Exception as e: |
||||||
|
logger.error("install failure! reason: %s" % traceback.format_exc()) |
||||||
|
self.install_rollback() |
||||||
|
# 此处写自定义的状态码,如100 |
||||||
|
code = 100 |
||||||
|
sys.exit(code) |
||||||
|
|
||||||
|
def upgrade(self): |
||||||
|
try: |
||||||
|
# 第一步,拷贝目录 |
||||||
|
shutil.rmtree(DSTPATH) |
||||||
|
self.copy_files() |
||||||
|
# 第二步,写自己升级的逻辑 |
||||||
|
except Exception as e: |
||||||
|
logger.info(traceback.format_exc()) |
||||||
|
self.upgrade_rollback() |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
def copy_files(self): |
||||||
|
src_path = os.path.join(CUR_PATH, self.app_name) |
||||||
|
shutil.copytree(src_path, DSTPATH) |
||||||
|
|
||||||
|
def install_rollback(self): |
||||||
|
"""安装回滚操作""" |
||||||
|
try: |
||||||
|
logger.error("rollback app folder") |
||||||
|
except Exception as e: |
||||||
|
logger.error("roll back failed") |
||||||
|
logger.error(traceback.format_exc()) |
||||||
|
|
||||||
|
def upgrade_rollback(self): |
||||||
|
"""升级回滚操作""" |
||||||
|
try: |
||||||
|
logger.error("rollback app folder") |
||||||
|
except Exception as e: |
||||||
|
logger.error("roll back failed") |
||||||
|
logger.error(traceback.format_exc()) |
||||||
|
|
||||||
|
def __get_app_name(self): |
||||||
|
with open(os.path.join(CUR_PATH, list(os.walk(CUR_PATH))[0][1][0], "package.json"), "r+") as f: |
||||||
|
pkgConfig = json.load(f) |
||||||
|
return pkgConfig["name"] |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
try: |
||||||
|
flag = sys.argv[2] |
||||||
|
install_instance = Install() |
||||||
|
if flag == '0': |
||||||
|
logger.info("=" * 20 + "开始安装" + "=" * 20) |
||||||
|
install_instance.install() |
||||||
|
if flag == '1': |
||||||
|
logger.info("=" * 20 + "开始升级" + "=" * 20) |
||||||
|
install_instance.upgrade() |
||||||
|
logger.info("main 执行完成") |
||||||
|
sys.exit(0) |
||||||
|
except Exception as e: |
||||||
|
logger.info("install failure, reason: %s" % traceback.format_exc()) |
||||||
|
raise e |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
main() |
@ -0,0 +1,82 @@ |
|||||||
|
# coding=utf-8 |
||||||
|
|
||||||
|
""" |
||||||
|
根据nsfocus rest要求返回对应对象 |
||||||
|
""" |
||||||
|
from django.http import JsonResponse |
||||||
|
|
||||||
|
|
||||||
|
class Result(object): |
||||||
|
""" |
||||||
|
结果对象 用于返回给 JsonResponse |
||||||
|
""" |
||||||
|
SUCCESS_CODE = 0 # 成功的状态码 |
||||||
|
FAILED_CODE = 1 # 失败的状态码 |
||||||
|
SUCCESS_MESSAGE = 'success' # 返回单个数据的message |
||||||
|
SUCCESS_MESSAGE_LIST = '请求成功' # 返回list的message |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def ok(cls, data): |
||||||
|
""" |
||||||
|
返回单个对象 |
||||||
|
:param data: 对象 dict |
||||||
|
:return: |
||||||
|
""" |
||||||
|
return JsonResponse({ |
||||||
|
'code': cls.SUCCESS_CODE, |
||||||
|
'message': cls.SUCCESS_MESSAGE, |
||||||
|
'data': data |
||||||
|
}) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def list(cls, total, page, limit, data): |
||||||
|
""" |
||||||
|
返回list |
||||||
|
:param total: |
||||||
|
:param page: |
||||||
|
:param limit: |
||||||
|
:param data: |
||||||
|
:return: |
||||||
|
""" |
||||||
|
return JsonResponse({ |
||||||
|
'code': cls.SUCCESS_CODE, |
||||||
|
'message': cls.SUCCESS_MESSAGE_LIST, |
||||||
|
'data': { |
||||||
|
'total': total, |
||||||
|
'page': page, |
||||||
|
'limit': limit, |
||||||
|
'list': data |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def failed(cls, message, detail=''): |
||||||
|
""" |
||||||
|
请求失败 |
||||||
|
:param message: 错误信息 |
||||||
|
:param detail: 详细描述 |
||||||
|
:return: |
||||||
|
""" |
||||||
|
return JsonResponse({ |
||||||
|
'code': cls.FAILED_CODE, |
||||||
|
'message': message, |
||||||
|
'data': { |
||||||
|
'detail': detail |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def failed_list(cls, message, data): |
||||||
|
""" |
||||||
|
部分请求失败 |
||||||
|
:param message: 失败描述 |
||||||
|
:param data: 失败内容的list |
||||||
|
:return: |
||||||
|
""" |
||||||
|
return JsonResponse({ |
||||||
|
'code': cls.FAILED_CODE, |
||||||
|
'message': message, |
||||||
|
'data': { |
||||||
|
'list': data |
||||||
|
} |
||||||
|
}) |
@ -0,0 +1,194 @@ |
|||||||
|
{ |
||||||
|
"summary": { |
||||||
|
"ip": [ |
||||||
|
{ |
||||||
|
"company": "湖北公司", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"ip_count": 323, |
||||||
|
"ip_reat": 0.3, |
||||||
|
"ip_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"company": "宜昌公司", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"ip_count": 323, |
||||||
|
"ip_reat": 0.3, |
||||||
|
"ip_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
} |
||||||
|
], |
||||||
|
"account": [ |
||||||
|
{ |
||||||
|
"company": "湖北公司", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"account_count": 323, |
||||||
|
"account_reat": 0.3, |
||||||
|
"account_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"company": "宜昌公司", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"account_count": 323, |
||||||
|
"account_reat": 0.3, |
||||||
|
"account_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
} |
||||||
|
], |
||||||
|
"interface": [ |
||||||
|
{ |
||||||
|
"interface_addr": "/getuser", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"frequency_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"interface_addr": "/getcpminfo", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"frequency_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
} |
||||||
|
], |
||||||
|
"menu": [ |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"frequency_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"frequency_rate": 0.2, |
||||||
|
"frequency_avg": 0.43, |
||||||
|
"trend": 0.3 |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"detail": { |
||||||
|
"ip": { |
||||||
|
"湖北公司": [ |
||||||
|
{ |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_frequency": 22 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"req_ip": "xx1x.xx.xx.x", |
||||||
|
"req_frequency": 21 |
||||||
|
} |
||||||
|
], |
||||||
|
"宜昌公司": [ |
||||||
|
{ |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_frequency": 22 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"req_ip": "xx1x.xx.xx.x", |
||||||
|
"req_frequency": 21 |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"account": { |
||||||
|
"湖北公司": [ |
||||||
|
{ |
||||||
|
"req_account": "admin", |
||||||
|
"req_frequency": 22, |
||||||
|
"req_jobnum": 98799 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"req_account": "admin", |
||||||
|
"req_frequency": 22, |
||||||
|
"req_jobnum": 98799 |
||||||
|
} |
||||||
|
], |
||||||
|
"宜昌公司": [ |
||||||
|
{ |
||||||
|
"req_account": "admin", |
||||||
|
"req_frequency": 22, |
||||||
|
"req_jobnum": 98799 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"req_account": "admin", |
||||||
|
"req_frequency": 22, |
||||||
|
"req_jobnum": 98799 |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"interface": { |
||||||
|
"接口1": [ |
||||||
|
{ |
||||||
|
"interface_addr": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"interface_addr": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
} |
||||||
|
], |
||||||
|
"接口2": [ |
||||||
|
{ |
||||||
|
"interface_addr": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"interface_addr": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"menu": { |
||||||
|
"菜单1": [ |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
} |
||||||
|
], |
||||||
|
"菜单2": [ |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
"menu_name": "接口地址", |
||||||
|
"req_frequency": 122, |
||||||
|
"req_ip": "xxx.xx.xx.x", |
||||||
|
"req_account": 0.2, |
||||||
|
"req_jobnum": 0.2 |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
{ |
||||||
|
"name": "UebaMetricsAnalysis", |
||||||
|
"version": "V3.0R01F00", |
||||||
|
"menuurl": "/UebaMetricsAnalysis", |
||||||
|
"menuregx": "^/UebaMetricsAnalysis", |
||||||
|
"menuname": "指标晾晒统计", |
||||||
|
"summary": "指标晾晒统计", |
||||||
|
"platform_mode": "simple_mode", |
||||||
|
"base_platform_version": "V2.0R01F00", |
||||||
|
"component_type": "application-component", |
||||||
|
"module_dependencies":{}, |
||||||
|
"common_dependencies": { |
||||||
|
"component": {}, |
||||||
|
"storage_compute_denpencies": [] |
||||||
|
}, |
||||||
|
"is_licensed": 0 |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
{ |
||||||
|
"name": "指标晾晒统计", |
||||||
|
"key": "UebaMetricsAnalysis", |
||||||
|
"prefix": "UebaMetricsAnalysis", |
||||||
|
"allfix": [ |
||||||
|
"^/UebaMetricsAnalysis" |
||||||
|
], |
||||||
|
"fix": [ |
||||||
|
"^/UebaMetricsAnalysis" |
||||||
|
], |
||||||
|
"link": "/WebApi/UebaMetricsAnalysis/static/dist/#/", |
||||||
|
"pinyin": "zhibiaoliangshaitongji", |
||||||
|
"app_name": "UebaMetricsAnalysis", |
||||||
|
"children": [ |
||||||
|
|
||||||
|
], |
||||||
|
"role_code": [ |
||||||
|
1 |
||||||
|
], |
||||||
|
"role_menu_register":{ |
||||||
|
"指标晾晒统计": "UebaMetricsAnalysis" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,110 @@ |
|||||||
|
#coding:utf-8 |
||||||
|
import traceback |
||||||
|
import os |
||||||
|
import json |
||||||
|
from zipfile import ZipFile |
||||||
|
from xml.dom.minidom import parse |
||||||
|
import xml.dom.minidom |
||||||
|
import shutil |
||||||
|
'''用于比对出APP的依赖与平台的commmonlib的脚本''' |
||||||
|
|
||||||
|
class CompareDependency(object): |
||||||
|
#appname:app名称,如bsa_ata |
||||||
|
#apppath:打包平台上此时app的绝对路径 |
||||||
|
#jarpath:需比对的app jar文件的绝对路径 |
||||||
|
#depath:平台de文件所在的绝对路径 |
||||||
|
#name:文件名;启动job/进程时的依赖需要从中读取 |
||||||
|
def __init__(self, appname, apppath, jarpath, depath, name): |
||||||
|
self.bsaroot = "${BSA_HOME}" |
||||||
|
self.platform_libpath = self.bsaroot + "/libs/Java/commonLibs" |
||||||
|
self.jarpath = jarpath |
||||||
|
self.depath = depath |
||||||
|
self.name = name |
||||||
|
self.pom_path = os.path.dirname(os.path.dirname(self.jarpath)) + "/pom.xml" |
||||||
|
self.lib_path = os.path.dirname(self.jarpath) + "/lib" |
||||||
|
self.apppath = apppath |
||||||
|
self.appname = appname |
||||||
|
|
||||||
|
def parse_manifest(self, cpath): |
||||||
|
'''解析MANIFEST.MF文件''' |
||||||
|
ls = list() |
||||||
|
|
||||||
|
f = ZipFile(cpath) |
||||||
|
try: |
||||||
|
content = f.read("META-INF/MANIFEST.MF").split("\n") |
||||||
|
content_ls = list() |
||||||
|
start = False |
||||||
|
for line in content: |
||||||
|
if line.startswith("Class-Path:"): |
||||||
|
content_ls.append(line.replace("Class-Path:", "").replace("\r", "").replace("\n", "")) |
||||||
|
start = True |
||||||
|
else: |
||||||
|
if start: |
||||||
|
if line.find(':') != -1: |
||||||
|
break |
||||||
|
else: |
||||||
|
content_ls.append(line.replace("\r", "").replace("\n", "")[1:]) |
||||||
|
ls = ("".join(content_ls)).strip().split(" ") |
||||||
|
except Exception, e: |
||||||
|
traceback.print_exc() |
||||||
|
raise e |
||||||
|
finally: |
||||||
|
f.close() |
||||||
|
return ls |
||||||
|
|
||||||
|
def get_de_fullpath(self): |
||||||
|
'''根据依赖的dm版本得到de.jar的版本,从而得到绝对路径''' |
||||||
|
de_path = None |
||||||
|
try: |
||||||
|
if os.path.exists(self.pom_path): |
||||||
|
domtree = xml.dom.minidom.parse(self.pom_path) |
||||||
|
root = domtree.documentElement |
||||||
|
node1 = root.getElementsByTagName("dependencyManagement") |
||||||
|
node2 = node1[0].getElementsByTagName("dependencies") |
||||||
|
node3 = node2[0].getElementsByTagName("dependency") |
||||||
|
for item in node3: |
||||||
|
group = item.getElementsByTagName("groupId")[0].childNodes[0].nodeValue |
||||||
|
artifact = item.getElementsByTagName("artifactId")[0].childNodes[0].nodeValue |
||||||
|
if group == 'com.nsfocus.bsa' and artifact == 'dm': |
||||||
|
version = item.getElementsByTagName("version")[0].childNodes[0].nodeValue |
||||||
|
de_path = self.depath + "/de-%s.jar"%(version,) |
||||||
|
break |
||||||
|
except Exception, e: |
||||||
|
traceback.print_exc() |
||||||
|
raise e |
||||||
|
return de_path |
||||||
|
|
||||||
|
def compare(self): |
||||||
|
'''进行比对,并且输出结果;用于spark job和普通java进程''' |
||||||
|
app_de = self.parse_manifest(self.jarpath) |
||||||
|
platform_de_fullpath = self.get_de_fullpath() |
||||||
|
if platform_de_fullpath is not None: |
||||||
|
confdic = {"common":[], "privacy":[]} |
||||||
|
platform_de = self.parse_manifest(platform_de_fullpath) |
||||||
|
#可以使用平台的jar,取交集 |
||||||
|
common_jars = list(set(app_de) & set(platform_de)) |
||||||
|
#只能使用app自己的jar,取差集 |
||||||
|
diff_jars = list(set(app_de).difference(set(platform_de))) |
||||||
|
#app jar依赖的私有jar路径 |
||||||
|
privacy_jar_path = os.path.normpath(self.apppath + "/bin/lib/" + \ |
||||||
|
os.path.basename(self.jarpath).replace(".jar", "").replace("-","_").replace(".","")) |
||||||
|
if not os.path.exists(self.apppath + "/bin/lib"): |
||||||
|
os.mkdir(self.apppath + "/bin/lib") |
||||||
|
if not os.path.exists(privacy_jar_path): |
||||||
|
os.mkdir(privacy_jar_path) |
||||||
|
for item in diff_jars: |
||||||
|
items = item.split("@") |
||||||
|
srcpath = os.path.normpath(self.lib_path + "/" + items[0] + "." \ |
||||||
|
+ items[1] + "-" + items[2] + ".jar") |
||||||
|
dstpath = os.path.normpath(privacy_jar_path + "/" + items[0] + "." \ |
||||||
|
+ items[1] + "-" + items[2] + ".jar") |
||||||
|
shutil.copy(srcpath, dstpath) |
||||||
|
confdic["privacy"].append(os.path.normpath(dstpath.replace(os.path.normpath(self.apppath), \ |
||||||
|
self.bsaroot + "/apps/" + self.appname)).replace("\\", "/")) |
||||||
|
for item in common_jars: |
||||||
|
items = item.split("@") |
||||||
|
confdic["common"].append(self.platform_libpath + "/" + items[0] + "." \ |
||||||
|
+ items[1]) |
||||||
|
confpath = self.apppath + "/conf/" + self.name |
||||||
|
open(confpath, "w").write(json.dumps(confdic)) |
||||||
|
print "write conf file:", confpath |
@ -0,0 +1,5 @@ |
|||||||
|
[encrypt] |
||||||
|
is_dat = 1 |
||||||
|
is_pyc = 1 |
||||||
|
is_front_pac = 1 |
||||||
|
is_front_enc = 0 |
@ -0,0 +1,23 @@ |
|||||||
|
#- coding:utf-8 -*- |
||||||
|
import melon |
||||||
|
import sys |
||||||
|
import os |
||||||
|
import traceback |
||||||
|
|
||||||
|
class CryptApp(): |
||||||
|
|
||||||
|
def __init__(self,input_name,output_name): |
||||||
|
input_name = input_name.strip() |
||||||
|
self.input_name = input_name |
||||||
|
if output_name.endswith('.dat'): |
||||||
|
self.output_name = output_name |
||||||
|
else: |
||||||
|
print 'output_file type is error' |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
|
||||||
|
def encrypt_app(self): |
||||||
|
try: |
||||||
|
melon.encrypt(self.input_name,self.output_name) |
||||||
|
except Exception,e: |
||||||
|
traceback.print_exc() |
@ -0,0 +1 @@ |
|||||||
|
from .melon import encrypt, decrypt |
Binary file not shown.
@ -0,0 +1,245 @@ |
|||||||
|
# -*- coding:utf-8 -*- |
||||||
|
# encrypt/decrypt to dat |
||||||
|
# date:2013-4-10 by liuyongming |
||||||
|
|
||||||
|
from Crypto.Cipher import ARC4 |
||||||
|
from Crypto.PublicKey import RSA |
||||||
|
from Crypto.Cipher import PKCS1_v1_5 |
||||||
|
from Crypto.Cipher import PKCS1_OAEP |
||||||
|
from Crypto.Hash import SHA |
||||||
|
from Crypto import Random |
||||||
|
import os, sys |
||||||
|
import getopt |
||||||
|
import random |
||||||
|
import string |
||||||
|
|
||||||
|
key_seed = '0987654321abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=_+' |
||||||
|
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'), ord('A')+6)] |
||||||
|
|
||||||
|
base_dir = os.path.dirname(__file__) |
||||||
|
|
||||||
|
|
||||||
|
def pkcs1_v1_5(): |
||||||
|
f = open('rsa.pub', 'r') |
||||||
|
key1 = RSA.importKey(f.read()) |
||||||
|
message = 'To be encrypted' |
||||||
|
h = SHA.new(message) |
||||||
|
|
||||||
|
cipher = PKCS1_v1_5.new(key1) |
||||||
|
ciphertext = cipher.encrypt(message+h.digest()) |
||||||
|
|
||||||
|
key2=RSA.importKey(f.read()) |
||||||
|
|
||||||
|
dsize = SHA.digest_size |
||||||
|
sentinel = Random.new().read(15+dsize) |
||||||
|
|
||||||
|
cipher = PKCS1_v1_5.new(key2) |
||||||
|
message = cipher.decrypt(ciphertext, sentinel) |
||||||
|
digest = SHA.new(message[:-dsize]).digest() |
||||||
|
if digest == message[-dsize:]: |
||||||
|
print message |
||||||
|
print "OK" |
||||||
|
else: |
||||||
|
print "NO" |
||||||
|
|
||||||
|
|
||||||
|
class RSACipher(): |
||||||
|
# test for PKCS1_v1_5 签名 |
||||||
|
def get_rsakey(self, rsa_priv, rsa_pub): |
||||||
|
key = RSA.generate(4096) |
||||||
|
|
||||||
|
fpriv = open(rsa_priv, 'w') |
||||||
|
fpriv.write(key.exportKey('PEM')) |
||||||
|
fpriv.close() |
||||||
|
|
||||||
|
fpub = open(rsa_pub, 'w') |
||||||
|
fpub.write(key.exportKey('DER')) |
||||||
|
fpub.close() |
||||||
|
|
||||||
|
def get_key(self, key_path): |
||||||
|
try: |
||||||
|
key = RSA.importKey(open(key_path).read()) |
||||||
|
self.key = key |
||||||
|
except Exception, e: |
||||||
|
self.key = None |
||||||
|
|
||||||
|
|
||||||
|
# test for PKCS1_OAEP 加解密字符串 |
||||||
|
def pkcs1_oaep(self, rsa_priv, rsa_pub): |
||||||
|
key_priv = self.get_privkey(rsa_priv) |
||||||
|
key_pub = self.get_pubkey(rsa_pub) |
||||||
|
message = 'LDqW3+hw2SNzHba)7Gsi*-F6XnPT(&Zjc%r54#k0Y=UQ^BO1vJIgyxoMe8t$' |
||||||
|
print "plaintext: ", message |
||||||
|
|
||||||
|
cipher_priv = PKCS1_OAEP.new(key_priv) |
||||||
|
ciphertext = cipher_priv.encrypt(message) |
||||||
|
print 'encrypt text: ',ciphertext |
||||||
|
|
||||||
|
cipher_pub = PKCS1_OAEP.new(key_pub) |
||||||
|
messages = cipher_pub.decrypt(ciphertext) |
||||||
|
print "decrypt text: ", messages |
||||||
|
|
||||||
|
def get_keysize(self, key_path): |
||||||
|
try: |
||||||
|
self.get_key(key_path) |
||||||
|
return self.key.size() |
||||||
|
except Exception, e: |
||||||
|
return None |
||||||
|
|
||||||
|
def encrypt(self, plaintext): |
||||||
|
cipher = PKCS1_OAEP.new(self.key) |
||||||
|
try: |
||||||
|
ciphertext = cipher.encrypt(plaintext) |
||||||
|
return ciphertext |
||||||
|
except Exception, e: |
||||||
|
return None |
||||||
|
|
||||||
|
def decrypt(self, ciphertext): |
||||||
|
cipher = PKCS1_OAEP.new(self.key) |
||||||
|
try: |
||||||
|
plaintext = cipher.decrypt(ciphertext) |
||||||
|
return plaintext |
||||||
|
except Exception, e: |
||||||
|
return None |
||||||
|
|
||||||
|
|
||||||
|
# 十六进制转十进制 |
||||||
|
def hextodec(string_num): |
||||||
|
return str(int(string_num.upper(), 16)) |
||||||
|
|
||||||
|
# 十进制转十六进制 |
||||||
|
def dectohex(string_num): |
||||||
|
num = int(string_num) |
||||||
|
mid = [] |
||||||
|
while True: |
||||||
|
if num == 0: |
||||||
|
break |
||||||
|
num, rem = divmod(num, 16) |
||||||
|
mid.append(base[rem]) |
||||||
|
|
||||||
|
return ''.join([str(x) for x in mid[::-1]]) |
||||||
|
|
||||||
|
|
||||||
|
def encrypt(source_file, dest_file): |
||||||
|
fin = open(source_file, 'rb') |
||||||
|
fin.seek(0, 2) |
||||||
|
fin.seek(0, 0) |
||||||
|
num = 192 |
||||||
|
count = 64 |
||||||
|
i = 0 |
||||||
|
times = int(num/64) |
||||||
|
key = '' |
||||||
|
while i != times: |
||||||
|
key = string.join(random.sample(key_seed, count)).replace(' ', '') |
||||||
|
i += 1 |
||||||
|
|
||||||
|
cipher = ARC4.new(key) |
||||||
|
|
||||||
|
Cipher = RSACipher() |
||||||
|
key_path = os.path.join(base_dir, 'rsa.priv') |
||||||
|
if not os.path.exists(key_path): |
||||||
|
return 1 |
||||||
|
else: |
||||||
|
Cipher.get_key(key_path) |
||||||
|
|
||||||
|
fout = open(dest_file, 'wb') |
||||||
|
|
||||||
|
while True: |
||||||
|
data = fin.read(65520) |
||||||
|
length = len(data) |
||||||
|
if not data: |
||||||
|
break |
||||||
|
en_data = cipher.encrypt(data) |
||||||
|
fout.write(en_data) |
||||||
|
|
||||||
|
# 处理RC4的密钥 |
||||||
|
cipherText = Cipher.encrypt(key) |
||||||
|
|
||||||
|
fout.write(cipherText) |
||||||
|
|
||||||
|
# 随机填充若干字节数据 |
||||||
|
num = random.randint(100,255) |
||||||
|
count = 64 |
||||||
|
i = 0 |
||||||
|
times = int(num/64) |
||||||
|
rand_str = '' |
||||||
|
while i != times: |
||||||
|
rand_str += string.join(random.sample(key_seed, count)).replace(' ', '') |
||||||
|
i += 1 |
||||||
|
sum = count*times |
||||||
|
left = num - sum |
||||||
|
rand_str += string.join(random.sample(key_seed, left)).replace(' ', '') |
||||||
|
|
||||||
|
hex_num = dectohex(num) |
||||||
|
rand_cipher = cipher.encrypt(rand_str) |
||||||
|
|
||||||
|
# 将随机字符的密文写入文件结尾 |
||||||
|
fout.write(rand_cipher) |
||||||
|
|
||||||
|
# rsa加密随机字符的个数 |
||||||
|
hex_cipher = Cipher.encrypt(hex_num) |
||||||
|
|
||||||
|
fout.write(hex_cipher) |
||||||
|
|
||||||
|
fin.close() |
||||||
|
fout.close() |
||||||
|
return 0 |
||||||
|
|
||||||
|
|
||||||
|
def decrypt(source_file, dest_file): |
||||||
|
global pub |
||||||
|
fin = open(source_file, 'rb') |
||||||
|
fin.seek(0, 2) |
||||||
|
file_len = fin.tell() |
||||||
|
|
||||||
|
Cipher = RSACipher() |
||||||
|
|
||||||
|
fin.seek(file_len-512, 0) |
||||||
|
hex_cipher = fin.read(512) |
||||||
|
|
||||||
|
rsa_file = os.path.join(base_dir, 'rsa.pub') |
||||||
|
if not os.path.exists(rsa_file): |
||||||
|
return 1 |
||||||
|
else: |
||||||
|
Cipher.get_key(rsa_file) |
||||||
|
hex_num = Cipher.decrypt(hex_cipher) |
||||||
|
if hex_num == None: |
||||||
|
return 2 |
||||||
|
|
||||||
|
num = int(hextodec(hex_num)) |
||||||
|
|
||||||
|
count_rand = num + 512 + 512 |
||||||
|
fin.seek(file_len-count_rand, 0) |
||||||
|
cipherText = fin.read(512) |
||||||
|
|
||||||
|
key = Cipher.decrypt(cipherText) |
||||||
|
|
||||||
|
cipher = ARC4.new(key) |
||||||
|
|
||||||
|
fout = open(dest_file, 'wb') |
||||||
|
|
||||||
|
fin.seek(0, 0) |
||||||
|
while True: |
||||||
|
data = fin.read(65520) |
||||||
|
if not data: |
||||||
|
break |
||||||
|
de_data = cipher.decrypt(data) |
||||||
|
fout.write(de_data) |
||||||
|
# 裁剪部分 |
||||||
|
fout.truncate(file_len-count_rand) |
||||||
|
|
||||||
|
fin.close() |
||||||
|
fout.close() |
||||||
|
return 0 |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
mode = sys.argv[1] |
||||||
|
src_file = sys.argv[2] |
||||||
|
dst_file = sys.argv[3] |
||||||
|
if mode == 'encrypt': |
||||||
|
print encrypt(src_file, dst_file) |
||||||
|
elif mode == 'decrypt': |
||||||
|
print decrypt(src_file, dst_file) |
||||||
|
else: |
||||||
|
print '5' |
||||||
|
|
@ -0,0 +1,51 @@ |
|||||||
|
-----BEGIN RSA PRIVATE KEY----- |
||||||
|
MIIJKAIBAAKCAgEAyj6y06HTuYySSjM8LRFzjLsl6banN0DHnqXHtG/FvxqMWgaj |
||||||
|
berSz6eEQ4uoUvUpPUGUZG1jsDAMJ8vFhFs7kYYhSt5fcnD0g4E7JS65PsCyeF2D |
||||||
|
FdgdBDI+ROMtM7Rf6z+CKif0llhgriVwhYCfF1JmK1Nwlwf9GjaMgx+kaa5KMJli |
||||||
|
DSNngh92x+skP2aCYi5Q0QOOESoP0nz0BAe8U7enZQ7vKvvrzD8HkIBP0EExOBeB |
||||||
|
2X7N++/kCRIeqSGPZgdRaCbJRDmerOIlRo/k21Yg7bTvCr6/84Ljz5K7Hb3SYWKy |
||||||
|
RB3YYCBFoUPE9ca2h4h2uE5/m153B/I3ac7QGy50q6i40kmbYIGuhQ/Dpuso5jLx |
||||||
|
hYXSucvofuorjkJ+Cf8gCnaiaZ7M5sYDmfopMndqUsO7fkYPXiFxUP5NStdAloHe |
||||||
|
MmVVCaHXkFGwyS1Wd3op/1wT8Cg069O5UvUws0hYmKlJtpyBEfUVtm5DJOHB1fnc |
||||||
|
UVA9SVxQEBPJCIj/JIsf1BmuFIUyYA9mjdIA/MoSLAFfUE3fz/EMUtSkGn95vMlw |
||||||
|
0Il1Pd1tiLBm2ajUALi5Y49gzRHww77E9MwLdziuvRVZ7z63h9uqPktsTrpaCFjb |
||||||
|
eF9zmq4NSp0aK0ol97gQGddKkLdYM5mkaNBBybYgz2vIzcjRDW+kDHa1Nz0CAwEA |
||||||
|
AQKCAgBrJ2sSDASko6ECpUC11DA3mRSOTpMsCCt7l/RGWo4YIZXJQQkn/KmzEdtW |
||||||
|
+lC1m2U9KljYGMkfmWVnVGSTKs9V3A4Zn9ZMSSKT5k2S9r15TRmCAnGoijddeM1b |
||||||
|
LE5PvbqwZpathTvmyG549ic25J3l+mddfzkBHF9ymwI5mvM+dvSh6TJ1KZP28nq5 |
||||||
|
k5FB8isUn9t70nlcCMAXUtLqq7qRVJXhSldXm+Aj+CUm34TqHxBX2sSWmsPCPyi/ |
||||||
|
0ZTjIX/bm/b6ysoKVskGak87opOrzmdl6l5YgBYti+Ttnp17NY6YwHUY+AMjcxXR |
||||||
|
Spm5ao5dIuVb42Niy1sfn6rSaZwCSa2qNipd7RUN3I6F3UMBwAijbg+wD3AOx8CL |
||||||
|
IxFHcDowEvTZZer3TC7nDOQRd3pzKFp90cN/5x34caN3cFRT1NzW5Y5zL8DUvKI3 |
||||||
|
BKDb14rcYZiobB7OxVG+6ZoWDRLtVjGmj5Gpy/jL4UB/7WS8tHt6aNPbK/e9K9E/ |
||||||
|
ISE7KFGOFscFThOyahutX8lFnWmquUPSmez9IGTjo1nkpd5np+crs6Dq/OxqiwxG |
||||||
|
jzMWYG7HO1jP5wFZLcci9iNxkUysbpRRWVgQ7qzSZfWisFHb2jZR070TK9zb5Xg8 |
||||||
|
B2Ajy5n4RBQuzGD6IKtIvCC/xtKahvLe3RvkxU+T3ysSeAJzgQKCAQEA4q0mqPPl |
||||||
|
sLKko6JFgclMfOfScQlqQH7Ynv76G/P0xz7486NTJEOKbwUJsNq1VKx1J/D3By4o |
||||||
|
eOF2NqlVsVNs1xZ7mQC1SM6stbYK7y2iyVHK1w8RsrEpnnXqStYL0hogPmMABYdF |
||||||
|
mcQwGba+15oYGCn/f+3lbHR/ofM+k+YnqCPAcKm7ZGnSplrn021fxok/WcAlNWDP |
||||||
|
hLVleO5gBZRJX/N+jxTE8YZRug1DJ4DU/Fy8v/gRCGfiIwzCBuy3HtZSWuyKiqKz |
||||||
|
VCbi1Q1Y/tq+Kgyae0pwGsRGYhU4TciCEh7CVqedpZ1jhqlIxMjAbuKGxOaFLUGc |
||||||
|
6QBvZx5As2J1XQKCAQEA5GhzQSF440qxyNOZ6Gd9gmaX1UJLidzgVDh+yPM28UNL |
||||||
|
1y+vJ5O/LG6b1/7YKRjG0LJiaCmdiF00YbAMrBAJF6BqYjsfgcfOZgfLCQYwDaKi |
||||||
|
NXdpGnNsevt3nqE09lvLAtSCedZLEuTudrltlLlMa0fw/GzNm6TNF9oUbtSnjVPA |
||||||
|
7+fZKaEAXbWU29n/fw3HjBEl+kKtbJ3sN+tm1XBQPWZLAZfTT9zgzZMdv57tU/49 |
||||||
|
Iud5Usl3UIgQg1OQrfrdhPbj4r3w7HnxmYFHyHgVZz40Uleou/HEED/tza1lvxTx |
||||||
|
2MhUjfvHon3ZdWD8M/f34oJMx9SY2z3Gc7L0vU7LYQKCAQB/B5gNwLjswABB73NS |
||||||
|
W3Pw351wWV1hDXTqDWwudBWt/x1WtCWowez3cHRQ1xAdhpQVMRXOwVBPBdLQqS7r |
||||||
|
tBvfoarcQKhXR/ND1ePky8dZWOv6f2hkoqH3Oo91JuTy9k8xhxuA/aDEnkxybJYg |
||||||
|
jyuHhym3EKOsltDb+kwMaEO7F2YF/SiWCjPRpEock0PEKDAHZQW1Fy7UaS+XiMbo |
||||||
|
+YPxMKyxFGuWCrcMM9h5b9psHrBsSGGLO2RgTgsCBHBO6L64U60EKk+jDjO6P8Oq |
||||||
|
9vzw5aVBCKMwbOQgnVGzTXWPIAu6si5HnJ8k3QN5vCMTQQFToPfrN8TuUp8bw7lw |
||||||
|
jfHFAoIBAQDjoJikIxiX5BvT2dW7gE/bwiS02tHvPdmu9XKdD44E2R1fAd2cIqlW |
||||||
|
PZFArHB+XHvfBrf9uOOPP9vxMwMeAwkcq7j51pQqwZaXplKY1rrTC+5+PFfZjYhh |
||||||
|
8/SdeWkP0CE8286AX6kH1nE0js1/dz+KdvLajhBGefIPQD42yeWFeh+At118GEEG |
||||||
|
Iu2MQPBYjcH9fCWOCB9PbP86J3afZcQBvM0pdEaag7TiCyiNjHRWzbvd6jPF5pPr |
||||||
|
BP738jLwwF89oNMxaDwPX+QAKJACYHJsJtj76vJ1A5dy3lM/M/x/dv8jHVru+SpW |
||||||
|
bPdn/FS78fbvnQ2p5NzFOgZpzcIMW9dhAoIBACiugVAK0hr9q8k7wLKJDXqAwO4j |
||||||
|
+tNHHtM3CkkZSj0gqBZwNk2v6oR1s49mnwXTPl5fQW0pJI/l4uuR4takkFIEeeRc |
||||||
|
ii0CvttbOS87QKlSZMEGWs4osexp8gQP5jzSVesUF72u16E59ud91McALKvL1RDc |
||||||
|
yov4s/2tmb8GVpXYZUJC8BqQYF/VOEUZmoEkTeZQC3P6i6Q67zaos7nHByszjBO3 |
||||||
|
lrMBhJNnEKJQiBALwj9iLLxKA3PRx3pzIb7QHgxznhb0AqpyCf5vRNuOs6BJkjFz |
||||||
|
sWwp7HjW6fvowO88Pnit6MZDfXpccrjnLFFrYB5Xpk6uN7dHr8pbiOv+bdk= |
||||||
|
-----END RSA PRIVATE KEY----- |
@ -0,0 +1,51 @@ |
|||||||
|
-----BEGIN RSA PRIVATE KEY----- |
||||||
|
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 |
||||||
|
-----END RSA PRIVATE KEY----- |
@ -0,0 +1,149 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
# encoding: utf-8 |
||||||
|
|
||||||
|
""" Python Code Protector """ |
||||||
|
|
||||||
|
import os |
||||||
|
import sys |
||||||
|
import imp |
||||||
|
import marshal |
||||||
|
import traceback |
||||||
|
|
||||||
|
import _pyprotect |
||||||
|
|
||||||
|
MAGIC = imp.get_magic() |
||||||
|
|
||||||
|
# recurse dir |
||||||
|
m_recurse = True |
||||||
|
|
||||||
|
# delete after protect |
||||||
|
m_delete = False |
||||||
|
|
||||||
|
# follow symlink |
||||||
|
m_symlink = True |
||||||
|
|
||||||
|
|
||||||
|
def wr_long(f, x): |
||||||
|
"""Internal; write a 32-bit int to a file in little-endian order.""" |
||||||
|
f.write(chr(x & 0xff)) |
||||||
|
f.write(chr((x >> 8) & 0xff)) |
||||||
|
f.write(chr((x >> 16) & 0xff)) |
||||||
|
f.write(chr((x >> 24) & 0xff)) |
||||||
|
|
||||||
|
|
||||||
|
def protect_file(file, cfile=None): |
||||||
|
""" Protect a pyfile """ |
||||||
|
if os.path.islink(file) and not m_symlink: |
||||||
|
print 'Protect: ignore symlink file:', file |
||||||
|
return True |
||||||
|
|
||||||
|
if not os.path.isfile(file): |
||||||
|
return False |
||||||
|
|
||||||
|
if file.endswith(".pyc") or file.endswith(".pyo"): |
||||||
|
return False |
||||||
|
|
||||||
|
if not file.endswith(".py"): |
||||||
|
print 'Protect: ignore non-py file:', file |
||||||
|
return True |
||||||
|
|
||||||
|
f = open(file, 'U') |
||||||
|
try: |
||||||
|
timestamp = long(os.fstat(f.fileno()).st_mtime) |
||||||
|
except AttributeError: |
||||||
|
timestamp = long(os.stat(file).st_mtime) |
||||||
|
codestring = f.read() |
||||||
|
f.close() |
||||||
|
if codestring and codestring[-1] != '\n': |
||||||
|
codestring = codestring + '\n' |
||||||
|
|
||||||
|
try: |
||||||
|
os.putenv('PYTHONOPTIMIZE', '2') |
||||||
|
codeobject = compile(codestring, file, 'exec') |
||||||
|
except: |
||||||
|
traceback.print_exc() |
||||||
|
return False |
||||||
|
|
||||||
|
_pyprotect.protect(codeobject) |
||||||
|
|
||||||
|
if cfile is None: |
||||||
|
cfile = file + (__debug__ and 'c' or 'o') |
||||||
|
|
||||||
|
fc = open(cfile, 'wb') |
||||||
|
fc.write('\0\0\0\0') |
||||||
|
wr_long(fc, timestamp) |
||||||
|
marshal.dump(codeobject, fc) |
||||||
|
fc.flush() |
||||||
|
fc.seek(0, 0) |
||||||
|
fc.write(MAGIC) |
||||||
|
fc.close() |
||||||
|
|
||||||
|
if m_delete: |
||||||
|
try: |
||||||
|
os.unlink(file) |
||||||
|
except Exception, e: |
||||||
|
print 'Protect: failed to delete file: %s, reason: %s' % (file, |
||||||
|
str(e)) |
||||||
|
|
||||||
|
return True |
||||||
|
|
||||||
|
|
||||||
|
def protect_dir(dirname): |
||||||
|
""" Protect py files in a dir |
||||||
|
|
||||||
|
""" |
||||||
|
for dirname, dirnames, filenames in os.walk(dirname): |
||||||
|
for filename in filenames: |
||||||
|
fullname = os.path.join(dirname, filename) |
||||||
|
protect_file(fullname) |
||||||
|
|
||||||
|
if not m_recurse: |
||||||
|
break |
||||||
|
|
||||||
|
|
||||||
|
def protect(filenames): |
||||||
|
""" Protect file or dirs """ |
||||||
|
|
||||||
|
for filename in filenames: |
||||||
|
if os.path.isfile(filename): |
||||||
|
protect_file(filename) |
||||||
|
elif os.path.isdir(filename): |
||||||
|
protect_dir(filename) |
||||||
|
else: |
||||||
|
print 'Unknown file type:', filename |
||||||
|
|
||||||
|
|
||||||
|
def parse_cmdline(): |
||||||
|
""" Parse command line |
||||||
|
|
||||||
|
""" |
||||||
|
from optparse import OptionParser |
||||||
|
global m_recurse, m_delete, m_symlink |
||||||
|
|
||||||
|
parser = OptionParser(usage="usage: %prog [options]") |
||||||
|
|
||||||
|
parser.add_option('-R', dest='recurse', default=None, action='store_true', |
||||||
|
help='Protect all .py in the dir and subdirs') |
||||||
|
parser.add_option('--delete', default=None, action='store_true', |
||||||
|
help='Delete origin .py file after protect') |
||||||
|
parser.add_option('--symlink', default=None, action='store_true', |
||||||
|
help='Follow symlink file') |
||||||
|
|
||||||
|
opts, args = parser.parse_args() |
||||||
|
|
||||||
|
m_recurse = opts.recurse |
||||||
|
m_delete = opts.delete |
||||||
|
m_symlink = opts.symlink |
||||||
|
|
||||||
|
return args |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
filenames = parse_cmdline() |
||||||
|
|
||||||
|
if not filenames: |
||||||
|
print 'Usage: pyprotect [-R] [--delete] file|dir' |
||||||
|
sys.exit(0) |
||||||
|
|
||||||
|
protect(filenames) |
||||||
|
|
@ -0,0 +1,249 @@ |
|||||||
|
# -*- coding: UTF-8 -*- |
||||||
|
import ConfigParser |
||||||
|
import json |
||||||
|
import os |
||||||
|
import re |
||||||
|
import sys |
||||||
|
import time |
||||||
|
|
||||||
|
# from compare_dependency import CompareDependency |
||||||
|
from encrypt_tool.encrypt_app import CryptApp |
||||||
|
|
||||||
|
DIR_PATH = os.path.split(os.path.realpath(__file__))[0] |
||||||
|
BASE_PATH = os.path.split(DIR_PATH)[0] |
||||||
|
|
||||||
|
|
||||||
|
class Package(object): |
||||||
|
def __init__(self): |
||||||
|
# 第一步:初始化一些变量,获取app fold name 版本等等 |
||||||
|
self.__svn_up() |
||||||
|
self.app_name = self.__get_app_name() |
||||||
|
self.version = '1.0.0' |
||||||
|
self.work_path_base = '/tmp' |
||||||
|
# 输出的dat包放置的位置,默认与package.py 放在同级目录 |
||||||
|
self.package_out_path = DIR_PATH |
||||||
|
# 打包的临时目录 |
||||||
|
self.app_work_path = os.path.normpath(os.path.join(self.work_path_base, self.app_name)) |
||||||
|
print self.app_work_path |
||||||
|
# 清理tmp目录下面的已有的 |
||||||
|
os.system("rm -rf " + self.app_work_path) |
||||||
|
# 不加密的py目录 |
||||||
|
self.py_not_encnrypt_list = self.__get_py_not_encrypt() |
||||||
|
# 第二步:选择编译前端代码,npm run build |
||||||
|
self.packageFrontEnd() |
||||||
|
# 第三步:获取svn版本号 |
||||||
|
# self.build_version = self.__get_svn() |
||||||
|
self.build_version = 23000 |
||||||
|
self.package_name = "%s.%s.%s.tar.gz" % (self.app_name, self.version, self.build_version) |
||||||
|
# 第五步:拷贝需要打包进组件的目录和文件到临时目录 |
||||||
|
self.do_copy_work_dir() |
||||||
|
# 第六步:检查加密的包配置 |
||||||
|
self.__get_encrypt_conf() |
||||||
|
# 第七步:把build_version 写到文件里面 |
||||||
|
self.__set_build_version() |
||||||
|
# 第八步:检查加密py的配置 |
||||||
|
self.__do_encrypt_file() |
||||||
|
# 第九步:加密py |
||||||
|
self.run_encrypt() |
||||||
|
|
||||||
|
def __get_app_name(self): |
||||||
|
with open(os.path.join(BASE_PATH, "package.json"), "r+") as f: |
||||||
|
pkgConfig = json.load(f) |
||||||
|
return pkgConfig["name"] |
||||||
|
|
||||||
|
def __get_py_not_encrypt(self): |
||||||
|
return { |
||||||
|
'files': [ |
||||||
|
# os.path.normpath(APP_WORK_PATH + os.sep + 'install.py'), |
||||||
|
# os.path.normpath(APP_WORK_PATH + os.sep + "bin" + os.sep + "start.py"), |
||||||
|
# os.path.normpath(APP_WORK_PATH + os.sep + "bin" + os.sep + "check.py"), |
||||||
|
], |
||||||
|
'paths': [ |
||||||
|
os.path.normpath(self.app_work_path + os.sep + 'target'), |
||||||
|
os.path.normpath(self.app_work_path + os.sep + 'static'), |
||||||
|
], |
||||||
|
} |
||||||
|
|
||||||
|
def __svn_up(self): |
||||||
|
# 更新svn到最新 |
||||||
|
# cmd = "cd %s && git pull " % BASE_PATH |
||||||
|
# os.system(cmd) |
||||||
|
pass |
||||||
|
|
||||||
|
def __get_svn(self): |
||||||
|
return 10000 |
||||||
|
# svnPath = BASE_PATH |
||||||
|
# try: |
||||||
|
# cmd = 'cd %s && svn info' % svnPath |
||||||
|
# svnContent = os.popen(cmd).read() |
||||||
|
# lang = os.popen('echo $LANG').read() |
||||||
|
# if 'en_US' in lang: |
||||||
|
# revision = 'Rev' |
||||||
|
# elif 'zh_CN' in lang: |
||||||
|
# revision = '最后修改的版本' |
||||||
|
# else: |
||||||
|
# print 'system language is not found' |
||||||
|
# sys.exit(1) |
||||||
|
# svnRe = re.compile('%s: (\d*?)\n' % revision) |
||||||
|
# svn_revision = svnRe.findall(svnContent)[0] |
||||||
|
# print 'svn_revision : %s cmd : %s' % (svn_revision, cmd) |
||||||
|
# except Exception, e: |
||||||
|
# print 'get SVN revision Failed. %s' % (str(e)) |
||||||
|
# sys.exit(1) |
||||||
|
# return svn_revision |
||||||
|
|
||||||
|
def do_copy_work_dir(self): |
||||||
|
print '拷贝数据到临时目录' |
||||||
|
os.chdir(BASE_PATH) |
||||||
|
cmd = 'rsync -az * --include="static/dist" --include="static/icon" --exclude="static/*" %s' % ( |
||||||
|
self.app_work_path) |
||||||
|
print cmd |
||||||
|
os.system(cmd) |
||||||
|
print '拷贝完成' |
||||||
|
|
||||||
|
def __get_encrypt_conf(self): |
||||||
|
sections_dict = dict() |
||||||
|
conf_path = os.path.normpath(os.path.join(self.app_work_path, 'target', 'encrypt_conf')) |
||||||
|
if not os.path.exists(conf_path): |
||||||
|
print 'conf file is not exists...' |
||||||
|
return |
||||||
|
try: |
||||||
|
cf = ConfigParser.ConfigParser() |
||||||
|
cf.read(conf_path) |
||||||
|
sections = cf.sections() |
||||||
|
for section in sections: |
||||||
|
options = cf.options(section) |
||||||
|
options_dic = dict() |
||||||
|
for option in options: |
||||||
|
try: |
||||||
|
value = cf.get(section, option).decode('utf-8', 'ignore') |
||||||
|
except Exception, e: |
||||||
|
value = cf.get(section, option) |
||||||
|
options_dic[option] = value |
||||||
|
sections_dict[section] = options_dic |
||||||
|
except Exception, e: |
||||||
|
print 'error', str(e) |
||||||
|
try: |
||||||
|
self.is_dat = int(sections_dict['encrypt'].get('is_dat', 0)) |
||||||
|
except: |
||||||
|
pass |
||||||
|
try: |
||||||
|
self.is_pyc = int(sections_dict['encrypt'].get('is_pyc', 0)) |
||||||
|
except: |
||||||
|
pass |
||||||
|
try: |
||||||
|
self.is_front_pac = int(sections_dict['encrypt'].get('is_front_pac', 0)) |
||||||
|
except: |
||||||
|
pass |
||||||
|
try: |
||||||
|
self.is_front_enc = int(sections_dict['encrypt'].get('is_front_enc', 0)) |
||||||
|
except: |
||||||
|
pass |
||||||
|
|
||||||
|
def __set_build_version(self): |
||||||
|
print "set package name ..." |
||||||
|
try: |
||||||
|
app_version_file = os.path.normpath(os.path.join(self.app_work_path, 'conf', 'buildversion')) |
||||||
|
with open(app_version_file, 'w') as fw: |
||||||
|
fw.write(self.build_version) |
||||||
|
except Exception, e: |
||||||
|
print e |
||||||
|
print "set package name done" |
||||||
|
|
||||||
|
def __do_encrypt_file(self): |
||||||
|
encrypt_pt_path = os.path.normpath(os.path.join(DIR_PATH, 'encrypt_tool', 'pyprotect.py')) |
||||||
|
print "start encrypt python file ..." |
||||||
|
for root, dirs, files in os.walk(self.app_work_path): |
||||||
|
if root in self.py_not_encnrypt_list['paths']: |
||||||
|
continue |
||||||
|
for fname in files: |
||||||
|
pyPath = os.path.normpath(os.path.join(root, fname)) |
||||||
|
if not fname.endswith('.py'): |
||||||
|
continue |
||||||
|
if pyPath in self.py_not_encnrypt_list['files']: |
||||||
|
continue |
||||||
|
cmd = "python '%s' '%s'" % (encrypt_pt_path, pyPath) |
||||||
|
os.system(cmd) |
||||||
|
# print cmd |
||||||
|
os.remove(pyPath) |
||||||
|
print "encrypt python file done" |
||||||
|
|
||||||
|
def packageFrontEnd(self): |
||||||
|
st = time.time() |
||||||
|
print "package static folder start ..." |
||||||
|
os.system('cd %s/static && npm install && npm run build' % BASE_PATH) |
||||||
|
et = time.time() |
||||||
|
print "package static folder done" |
||||||
|
print 'take time for %sS' % (et - st) |
||||||
|
|
||||||
|
def run_encrypt(self): |
||||||
|
print "package ..." |
||||||
|
install_py = "" |
||||||
|
os.chdir(self.work_path_base) |
||||||
|
# 把install 挪到和app 目录同级 |
||||||
|
# 判断install.py 存不存在,如果不存在,不必拷贝 |
||||||
|
if os.path.exists(os.path.join(self.app_work_path, "install.py")) or os.path.exists( |
||||||
|
os.path.join(self.app_work_path, "install.pyc")): |
||||||
|
install_py = "install.pyc" |
||||||
|
os.system("mv %s/%s ." % (self.app_name, install_py)) |
||||||
|
os.system("tar -zcf %s %s/ %s --exclude=.svn --exclude=%s/target --exclude=%s/java " |
||||||
|
"> /dev/null " % (self.package_name, self.app_name, install_py, self.app_name, self.app_name)) |
||||||
|
else: |
||||||
|
print "tar -zcf %s %s/ --exclude=.svn --exclude=%s/target --exclude=%s/java > /dev/null " % ( |
||||||
|
self.package_name, self.app_name, self.app_name, self.app_name) |
||||||
|
os.system("tar -zcf %s %s/ --exclude=.svn --exclude=%s/target --exclude=%s/java > /dev/null " % ( |
||||||
|
self.package_name, self.app_name, self.app_name, self.app_name)) |
||||||
|
print '执行成功' |
||||||
|
replace_reg = re.compile(r'tar.gz$') |
||||||
|
output_name = replace_reg.sub('dat', self.package_name) |
||||||
|
do_encrypt = CryptApp(self.package_name, output_name) |
||||||
|
do_encrypt.encrypt_app() |
||||||
|
# 删除 tar包 保留加密包 |
||||||
|
os.system("rm -rf %s " % self.package_name) |
||||||
|
if install_py: |
||||||
|
os.system("mv %s %s" % (install_py, self.app_name)) |
||||||
|
os.system("mv %s %s -f" % (output_name, DIR_PATH)) |
||||||
|
self.package_name = output_name |
||||||
|
print "package done" |
||||||
|
self.__info() |
||||||
|
|
||||||
|
def __info(self): |
||||||
|
print '\033[0;33m' |
||||||
|
print "*********************************" |
||||||
|
print "package ok. " |
||||||
|
print "package name:", self.package_name |
||||||
|
outputfile = os.path.join(self.package_out_path, self.package_name) |
||||||
|
md5 = os.popen("md5sum %s" % outputfile).readlines()[0].strip() |
||||||
|
print "package path:", md5.split(' ')[-1] |
||||||
|
print "package md5:", md5.split(' ')[0] |
||||||
|
print '>>>>>>', 'is_dat:', 'yes' if self.is_dat else 'no' |
||||||
|
print '>>>>>>', 'is_pyc:', 'yes' if self.is_pyc else 'no' |
||||||
|
print '>>>>>>', 'is_front_enc:', 'yes' if self.is_front_enc else 'no' |
||||||
|
print '>>>>>>', 'is_front_pac:', 'yes' if self.is_front_pac else 'no' |
||||||
|
print "*********************************" |
||||||
|
print '\033[0m' |
||||||
|
|
||||||
|
def do_remove_work_dir(self): |
||||||
|
cmd = 'rm %s -rf' % self.app_work_path |
||||||
|
os.system(cmd) |
||||||
|
# print 'remove %s successfully...' % (APP_WORK_PATH) |
||||||
|
|
||||||
|
|
||||||
|
def usage(): |
||||||
|
print "usage:" |
||||||
|
print "python package.py ---- run script without a parameter, make a encrypted package" |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
''' |
||||||
|
"python package.py ---- run script without a parameter, make a encrypted package" |
||||||
|
''' |
||||||
|
main_param = sys.argv |
||||||
|
# 清除已经安装的包 |
||||||
|
for fileitem in os.listdir(BASE_PATH + "/target"): |
||||||
|
if fileitem.endswith(".dat"): |
||||||
|
os.remove(BASE_PATH + "/target/" + fileitem) |
||||||
|
if len(main_param) == 1: |
||||||
|
Package() |
||||||
|
else: |
||||||
|
usage() |
@ -0,0 +1,14 @@ |
|||||||
|
# coding:utf-8 |
||||||
|
|
||||||
|
from django.conf.urls import url |
||||||
|
from UebaMetricsAnalysis.views import dashboard_views |
||||||
|
from rest_framework import routers |
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = [ |
||||||
|
] |
||||||
|
|
||||||
|
router = routers.DefaultRouter() |
||||||
|
router.register(r'/rule_info', dashboard_views.DashboardViewSets,base_name="dashboard-view") |
||||||
|
|
||||||
|
urlpatterns += router.urls |
@ -0,0 +1,38 @@ |
|||||||
|
# coding=utf-8 |
||||||
|
""" |
||||||
|
@Author: fu-zhe |
||||||
|
@FileName: ext_logging.py |
||||||
|
@DateTime: 2024/5/16 14:27 |
||||||
|
@Description: |
||||||
|
""" |
||||||
|
import logging |
||||||
|
import os |
||||||
|
from mlogging import TimedRotatingFileHandler_MP |
||||||
|
from appsUtils import env |
||||||
|
|
||||||
|
APPFOLDERNAME = 'UebaMetricsAnalysis' |
||||||
|
|
||||||
|
|
||||||
|
def get_logger(logfile): |
||||||
|
""" |
||||||
|
获取日志句柄 |
||||||
|
""" |
||||||
|
logger = logging.getLogger(logfile) |
||||||
|
logger.setLevel(logging.DEBUG) |
||||||
|
logroot = env.get_isop_root() + "/apps/" + APPFOLDERNAME + "/logs" |
||||||
|
if not os.path.exists(logroot): |
||||||
|
os.mkdir(logroot) |
||||||
|
filehandle = TimedRotatingFileHandler_MP(os.path.normpath(logroot + "/" + \ |
||||||
|
logfile + ".log"), 'midnight') |
||||||
|
filehandle.suffix = "%Y-%m-%d" |
||||||
|
filehandle.setLevel(logging.DEBUG) |
||||||
|
consolehandle = logging.StreamHandler() |
||||||
|
consolehandle.setLevel(logging.DEBUG) |
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
||||||
|
filehandle.setFormatter(formatter) |
||||||
|
consolehandle.setFormatter(formatter) |
||||||
|
logger.addHandler(filehandle) |
||||||
|
return logger |
||||||
|
|
||||||
|
|
||||||
|
logger = get_logger(APPFOLDERNAME) |
@ -0,0 +1,7 @@ |
|||||||
|
# coding=utf-8 |
||||||
|
""" |
||||||
|
@Author: tangwy |
||||||
|
@FileName: __init__.py.py |
||||||
|
@DateTime: 2024/6/6 10:06 |
||||||
|
@Description: |
||||||
|
""" |
@ -0,0 +1,53 @@ |
|||||||
|
# coding=utf-8 |
||||||
|
""" |
||||||
|
@Author: fu-zhe |
||||||
|
@FileName: dashboard_views.py |
||||||
|
@DateTime: 2024/5/20 17:34 |
||||||
|
@Description: |
||||||
|
""" |
||||||
|
|
||||||
|
import json |
||||||
|
import traceback |
||||||
|
|
||||||
|
from rest_framework import viewsets |
||||||
|
from rest_framework.decorators import list_route, detail_route |
||||||
|
from UebaMetricsAnalysis.utils.ext_logging import logger |
||||||
|
from UebaMetricsAnalysis.lib.result import Result |
||||||
|
|
||||||
|
class DashboardViewSets(viewsets.GenericViewSet): |
||||||
|
@list_route(methods=['GET']) |
||||||
|
def training_cyber_range(self, request): |
||||||
|
type = request.GET.get('type') |
||||||
|
try: |
||||||
|
return self.get_summary_data(self,type) |
||||||
|
except Exception, e: |
||||||
|
logger.error("实训大屏数据获取失败, err: {}, traceback: {}".format(str(e), traceback.format_exc())) |
||||||
|
return Result.failed("查询失败", str(e)) |
||||||
|
|
||||||
|
@list_route(methods=['GET']) |
||||||
|
def get_summary_data_list(self,request): |
||||||
|
data_type = request.GET.get('type') |
||||||
|
try: |
||||||
|
if data_type == "ip": |
||||||
|
return self.get_ip_summary_data() |
||||||
|
if data_type == "account": |
||||||
|
return self.get_account_summary_data() |
||||||
|
if data_type == "interface": |
||||||
|
return self.get_interface_summary_data() |
||||||
|
if data_type == "menu": |
||||||
|
return self.get_menu_summary_data() |
||||||
|
return Result.ok({"status":200}) |
||||||
|
except Exception, e: |
||||||
|
logger.error("实训大屏数据获取失败, err: {}, traceback: {}".format(str(e), traceback.format_exc())) |
||||||
|
return Result.failed("查询失败", str(e)) |
||||||
|
def get_ip_summary_data(self): |
||||||
|
return Result.ok({"status":200}) |
||||||
|
|
||||||
|
def get_account_summary_data(self): |
||||||
|
return Result.ok({"status":200}) |
||||||
|
|
||||||
|
def get_interface_summary_data(self): |
||||||
|
return Result.ok({"status":200}) |
||||||
|
|
||||||
|
def get_menu_summary_data(self): |
||||||
|
return Result.ok({"status":200}) |
Loading…
Reference in new issue