You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.6 KiB

2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
3 months ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
2 days ago
2 years ago
  1. #coding: utf-8
  2. import os,sys,json
  3. #执行模块方法(模块名,方法名,参数)
  4. def module_run(module_name, def_name, def_args):
  5. if not module_name or not def_name: return returnMsg(False,'模块名称和模块方法名称不能为空!')
  6. if not path_check(module_name) or not path_check(def_name): return returnMsg(False,'模块名或方法名不能包含特殊符号!')
  7. panel_path = get_panel_path()
  8. filename = "{}/modules/{}Module/{}Module.py".format(panel_path,module_name,module_name)
  9. if not os.path.exists(filename):
  10. filename = "{}/modules/{}Module/main.py".format(panel_path,module_name)
  11. if not os.path.exists(filename):
  12. filename = "{}/plugin/{}/main.py".format(panel_path,module_name)
  13. if not os.path.exists(filename):
  14. filename = "{}/plugin/{}/{}Plugin.py".format(panel_path,module_name,module_name)
  15. if not os.path.exists(filename):
  16. return returnMsg(False,'指定模块或插件不存在')
  17. _obj = get_script_object(filename)
  18. if not _obj: return returnMsg(False,'模块加载失败: %s' % module_name)
  19. if hasattr(_obj, "items") and hasattr(_obj, "setdefault"):
  20. return _obj
  21. class_name = "main"
  22. if not hasattr(_obj, class_name):
  23. return returnMsg(False,'找不到入口类: %s' % class_name)
  24. class_obj = getattr(_obj,class_name, None)
  25. if not class_obj:
  26. return returnMsg(False,'获取入口类失败' % module_name)
  27. try:
  28. class_func = class_obj()
  29. except:
  30. return returnMsg(False,'模块入口实例化失败' % module_name)
  31. if not hasattr(class_func, def_name):
  32. return returnMsg(False,'在[%s]模块中找不到[%s]方法' % (class_name,def_name))
  33. def_func = getattr(class_func, def_name, None)
  34. if not def_func:
  35. return returnMsg(False,'获取方法失败')
  36. if 'module_get_object' in def_args:
  37. return def_func
  38. result = def_func(def_args)
  39. return result
  40. #获取指定模块对象(文件全路径)
  41. def get_module(filename):
  42. if not filename: return returnMsg(False,'模块路径不能为空!')
  43. if "./" in filename: return returnMsg(False,'模块路径不能为相对路径')
  44. return get_script_object(filename)
  45. def get_panel_path():
  46. return '/www/server/bt-monitor'
  47. def returnMsg(status,msg,args = ()):
  48. return {'status':status,'msg':msg}
  49. def get_script_object(filename):
  50. _obj = sys.modules.get(filename,None)
  51. if _obj: return _obj
  52. from types import ModuleType
  53. _obj = sys.modules.setdefault(filename, ModuleType(filename))
  54. _code = readFile(filename)
  55. _code_object = compile(_code,filename, 'exec')
  56. _obj.__file__ = filename
  57. _obj.__package__ = ''
  58. exec(_code_object, _obj.__dict__)
  59. return _obj
  60. def readFile(filename,mode = 'r'):
  61. import os
  62. if not os.path.exists(filename): return False
  63. fp = None
  64. try:
  65. fp = open(filename, mode)
  66. f_body = fp.read()
  67. except Exception as ex:
  68. if sys.version_info[0] != 2:
  69. try:
  70. fp = open(filename, mode,encoding="utf-8")
  71. f_body = fp.read()
  72. except:
  73. fp = open(filename, mode,encoding="GBK")
  74. f_body = fp.read()
  75. else:
  76. return False
  77. finally:
  78. if fp and not fp.closed:
  79. fp.close()
  80. return f_body
  81. #检查路径是否合法
  82. def path_check(path):
  83. list = ["./","..",",",";",":","?","'","\"","<",">","|","\\","\n","\r","\t","\b","\a","\f","\v","*","%","&","$","#","@","!","~","`","^","(",")","+","=","{","}","[","]"]
  84. for i in path:
  85. if i in list:
  86. return False
  87. return True