Files
blackbird/lci/extra/_pmc/src/pmc/to_pmc.py
T
2026-08-02 21:21:03 +08:00

136 lines
3.6 KiB
Python

#!/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)