遗漏的部分
This commit is contained in:
1 parent
84fb370da8
commit
0493383ee8
63 files changed
+28237
-4
No files matched your search
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
'''
|
||||
|
||||
这个代码是与PMC服务通信的工具
|
||||
|
||||
即PMC子系统调用
|
||||
|
||||
通过PMC服务,你可以创建和管理进程
|
||||
|
||||
===============================
|
||||
|
||||
20250701: 版本:0.0.4
|
||||
使得这个模块可以访问任何地址的pmc服务
|
||||
|
||||
20250702:版本 0.0.5
|
||||
使得这个模块在创建之初就保存一个url
|
||||
|
||||
20250709: 版本 0.1.0
|
||||
使得模块在通信过程中应用RSA和AES加密手段
|
||||
|
||||
'''
|
||||
from .rsa import Rsa_Pri_Key
|
||||
from .aes import MyAES
|
||||
import requests
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
|
||||
|
||||
class PmcComm:
|
||||
'''并发机器通信'''
|
||||
|
||||
def __init__(self, url: str):
|
||||
self.url: str = url
|
||||
|
||||
# 新库
|
||||
############################
|
||||
@staticmethod
|
||||
def post_to(url, payload="", retry=10):
|
||||
count = 0
|
||||
while count < retry:
|
||||
count += 1
|
||||
try:
|
||||
response = requests.post(url, data=payload)
|
||||
response.raise_for_status()
|
||||
return response.text
|
||||
except requests.exceptions.HTTPError:
|
||||
...
|
||||
raise Exception("连接失败")
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_from(url, retry=10):
|
||||
count = 0
|
||||
while count < retry:
|
||||
count += 1
|
||||
try:
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
return response.text
|
||||
except requests.exceptions.HTTPError:
|
||||
...
|
||||
raise Exception("连接失败")
|
||||
|
||||
def get_key(self) -> str:
|
||||
return PmcComm.get_from(f"{self.url}/api/v1/get_key")
|
||||
|
||||
def get_iv(self) -> str:
|
||||
return PmcComm.get_from(f"{self.url}/api/v1/get_iv")
|
||||
|
||||
def get_list(self,) -> str:
|
||||
ls = PmcComm.get_from(f"{self.url}/api/v1/get_list")
|
||||
return self.aes.decrypt(ls).strip() # 第二天早上就出现了空格
|
||||
|
||||
def start(self, module: str) -> str:
|
||||
msg = json.dumps({'module': module})
|
||||
msg = self.aes.encrypt(msg)
|
||||
return PmcComm.post_to(
|
||||
f'{self.url}/api/v1/start',
|
||||
payload=msg
|
||||
)
|
||||
|
||||
def try_start(self, module: str) -> str:
|
||||
try:
|
||||
self.start(module)
|
||||
except Exception as e:
|
||||
print(f'{module}: {e}', file=sys.stderr)
|
||||
|
||||
def kill(self, pid: int) -> str:
|
||||
msg = json.dumps({'pid': pid})
|
||||
msg = self.aes.encrypt(msg)
|
||||
return PmcComm.post_to(
|
||||
f'{self.url}/api/v1/kill',
|
||||
payload=msg
|
||||
)
|
||||
|
||||
def clear(self, ) -> str:
|
||||
return PmcComm.post_to(f'{self.url}/api/v1/clear')
|
||||
|
||||
def list_mods(self,) -> str:
|
||||
ls = PmcComm.get_from(f"{self.url}/api/v1/list_mods")
|
||||
return self.aes.decrypt(ls)
|
||||
|
||||
|
||||
def Set_RSA_Pri_Key(self, fullpath: str) -> None:
|
||||
self.rsa_pri: Rsa_Pro_Key = Rsa_Pri_Key(fullpath)
|
||||
|
||||
def Set_AES_Key(self, key: str, iv: str) -> None:
|
||||
self.aes = MyAES(key.decode(), iv.decode())
|
||||
|
||||
|
||||
def Try_Get_AES_Key(self, retry: int=10) -> None:
|
||||
'''试图获取AES密钥,测试中失败率比较高'''
|
||||
key_data = self.get_key()
|
||||
key = self.rsa_pri.decrypt(key_data)
|
||||
iv_data = self.get_iv()
|
||||
iv = self.rsa_pri.decrypt(iv_data)
|
||||
self.Set_AES_Key(key, iv)
|
||||
|
||||
def Test():
|
||||
# 测试对象
|
||||
#url = "http://101.245.108.250:8012"
|
||||
url = "http://localhost:8012"
|
||||
|
||||
# 创建交流对象
|
||||
comm = PmcComm(url)
|
||||
comm.Set_RSA_Pri_Key("private_key.pem")
|
||||
comm.Try_Get_AES_Key()
|
||||
#msg = comm.start("mgmt")
|
||||
#msg = comm.kill(6488)
|
||||
#msg =comm.clear()
|
||||
msg = comm.get_list()
|
||||
print(msg)
|
||||
|
||||
Reference in new issue
Block a user