# -*- coding: utf-8 -*-
from .logger import logger
from . import utils
from . import template_file
import datetime
import subprocess
import os
import json
import tempfile
import ssl
import multiprocessing
import re
import sys
try:
from urllib.request import Request, urlopen
except ImportError:
from urllib2 import Request, urlopen
lock = multiprocessing.Lock()
class Loader(object):
conf_file_path = conf_dir = os.path.join(
os.path.expanduser("~"),
".local",
"shterm_client.conf"
)
def __init__(self, shterm_data, resources_dir):
self.shterm_data = shterm_data
self.resources_dir = resources_dir
self.init_conf_file()
def get_sessiontitle(self):
device_name = self.shterm_data.get("SessionName")
device_address = self.shterm_data.get("SessionHost")
session_account = self.shterm_data.get("SessionAccount")
session_title = self.shterm_data.get("SessionTitle")
if not session_title:
session_title = session_account
if device_name:
session_title += "@" + device_name
else:
session_title = device_name
if device_address > 0:
session_title += "({0})".format(device_address)
elif device_address:
if session_account:
session_title += "@" + device_address
else:
session_title = device_address
return session_title
def get_choose_app(self):
return self.shterm_data["app"]
def find_application(self):
file_path = self.find_application_normal()
if file_path and utils.exist_and_executable(file_path):
return file_path
logger.warning("not exists or executable: {0}".format(file_path))
file_path = self.find_application_conf()
if file_path and utils.exist_and_executable(file_path):
return file_path
logger.warning("invalid filepath in shterm_client.conf: ({app}: {filepath})"
.format(app=self.shterm_data["app"], filepath=file_path))
self.app_not_found()
logger.warning("filepath not exist")
sys.exit(1)
def app_not_found(self):
utils.showinfo("错误", "未检测到应用,请安装应用到默认位置")
def find_application_conf(self):
with open(Loader.conf_file_path, "r") as f:
try:
conf = json.load(f)
except ValueError as e:
logger.warning(e)
return None
return conf["app"].get(self.shterm_data["app"])
def find_application_normal(self):
pass
def find_application_locate(self, choose_app):
file_path = self.open_filedialog(title="please choose file: " + choose_app)
return file_path
def open_filedialog(self, title=""):
return utils.askopenfilename(title)
def init_conf_file(self):
conf_dir, conf_file = os.path.split(Loader.conf_file_path)
if not os.path.exists(conf_dir):
os.makedirs(conf_dir)
if not os.path.exists(Loader.conf_file_path):
with lock:
with open(Loader.conf_file_path, "w") as f:
json.dump({"app": {}}, f, indent=4)
def save_application(self, file_path):
with lock:
with open(Loader.conf_file_path, "r+") as f:
try:
conf = json.load(f)
except ValueError as e:
logger.warning(e)
conf = {"app": {}}
with open(Loader.conf_file_path, "w") as f:
conf["app"][self.shterm_data["app"]] = file_path
json.dump(conf, f, indent=4)
def get_cmdline(self):
file_path = self.find_application()
self.save_application(file_path)
cmdline = [file_path]
cmdline.extend(self.get_cmdline_args() or [])
return cmdline
def get_cmdline_args(self):
pass
def load_post_process(self):
pass
def load(self):
cmdline = self.get_cmdline()
try:
cmdline = [unicode(x).encode(sys.getfilesystemencoding())
for x in cmdline]
except NameError:
cmdline = [str(x) for x in cmdline]
logger.info(" ".join(cmdline))
subprocess.Popen(cmdline)
self.load_post_process()
class MstscLoader(Loader):
def get_cmdline_args(self):
cmdline_args = []
self.cfg_file = self.generate_mstsc_cfg()
cmdline_args.append(self.cfg_file)
return cmdline_args
def generate_mstsc_cfg(self):
screen_mode_id = self.shterm_data.get("screen mode id")[2:] # 1: window mode 2: fullscreen
bpp = self.shterm_data.get("session bpp", "i:16")[2:]
enable_cred_ssp_support = self.shterm_data.get("enablecredsspsupport", "i:0")[2:]
maximize = self.shterm_data.get("maximize")
width = self.shterm_data.get("desktopwidth", "i:800")[2:]
height = self.shterm_data.get("desktopheight", "i:600")[2:]
drive_redirection_mode = self.shterm_data.get("drive_redirection_mode", 0)
redirect_folder = self.shterm_data.get("redirect_folder", "/Users")
context = {
"DesktopSize": None,
"DriveRedirectionMode": drive_redirection_mode,
"RedirectFolder": redirect_folder
}
if screen_mode_id == "2" or maximize == 1:
context["DesktopSize"] = template_file.fullscreen_desktopsize
else:
context["DesktopSize"] = template_file.dict_desktopsize.format(width=width, height=height)
keys = {
"alternate shell": "ApplicationPath",
"full address": "ConnectionString",
"audiomode": "AudioRedirectionMode",
}
for k, v in keys.items():
context[v] = self.shterm_data.get(k)[2:]
template_str = template_file.rdc_cfg_tmpl.format(**context)
suffix = ".rdp"
handle, cfg_file = tempfile.mkstemp(suffix=suffix)
with os.fdopen(handle, "w") as f:
f.write(template_str)
return cfg_file
def get_choose_app(self):
return "Remote Desktop Connection"
def find_application_normal(self):
return "/Applications/Remote Desktop Connection.app/Contents/MacOS/Remote Desktop Connection"
def load_post_process(self):
utils.run_files_cleaner([self.cfg_file], 10)
class MrdLoader(Loader):
def get_cmdline_args(self):
cmdline_args = []
self.cfg_file = self.generate_mstsc_cfg()
cmdline_args.append(self.cfg_file)
return cmdline_args
def generate_mstsc_cfg(self):
context = {}
keys = {
"audiocapturemode": ("audiocapturemode", "i:0"),
"screen mode id": "screen_mode_id",
"authentication level": ("authentication_level", "i:2"),
"desktopwidth":"desktopwidth",
"desktopheight":"desktopheight",
"enablecredsspsupport": ("enablecredsspsupport", "i:0"),
"promptcredentialonce": ("promptcredentialonce", "i:0"),
"session bpp": "session_bpp",
"alternate shell": "alternate_shell",
"audiomode": "audiomode",
"remoteapplicationmode": ("remoteapplicationmode", "i:0"),
"full address": "full_address",
}
for k, v in keys.items():
if isinstance(v, tuple):
val = context[v[0]] = self.shterm_data.get(k, v[1])
else:
val = context[v] = self.shterm_data.get(k)
if not val:
logger.warn("field not found: {}".format(k))
ShtermClient-0.0.2.1.app_APP开发_ShtermClient_
5星 · 超过95%的资源 191 浏览量
2021-10-02
04:56:00
上传
评论
收藏 775KB ZIP 举报
余淏
- 粉丝: 51
- 资源: 3975
最新资源
- JSP-JTBC-CMS(SQLITE).rar
- MC3362和MC145151调频无线接收器的设计.pdf
- MiniRenamer-v100.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- 小狐狸Ai系统 小狐狸ai付费创作系统V2.8.0 ChatGPT智能机器人
- 公孙离-内衣-肚兜.zipgsl
- 快慢指针判断链表是否有环-go 语言实现
- 学生成绩管理系统的设计与实现-收藏备用.pdf
- JSP+SQL网站流量统计管理系统(源代码+论文).rar
- IBM-PC-XT微机过程...道中模拟量数据的采集和处理.pdf
- JSP+SQL网上选课系统(源代码+论文+答辩PPT).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论6