toolkits 0.2.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- toolkits/3des/3des.py +93 -0
- toolkits/3des/__init__.py +0 -0
- toolkits/__init__.py +2 -0
- toolkits/basic/__init__.py +0 -0
- toolkits/basic/list_helper.py +26 -0
- toolkits/config/__init__.py +0 -0
- toolkits/config/config_demo.py +43 -0
- toolkits/databases/__init__.py +0 -0
- toolkits/databases/database_client_util.py +143 -0
- toolkits/databases/es_client.py +88 -0
- toolkits/databases/hive_client.py +72 -0
- toolkits/databases/hive_cmd.py +113 -0
- toolkits/databases/hive_helper.py +220 -0
- toolkits/databases/redis_mgmt.py +95 -0
- toolkits/databases/sql_helper.py +291 -0
- toolkits/databases/sqlalchemy_helper.py +71 -0
- toolkits/databases/status_check.py +162 -0
- toolkits/db_query_demo.py +72 -0
- toolkits/libs_core/__init__.py +0 -0
- toolkits/libs_core/config_groups_helper.py +60 -0
- toolkits/libs_core/config_helper.py +22 -0
- toolkits/libs_core/env_prepare.py +145 -0
- toolkits/libs_core/load_module.py +46 -0
- toolkits/libs_core/mysql_helper.py +151 -0
- toolkits/network/__init__.py +0 -0
- toolkits/network/ip_helper.py +32 -0
- toolkits/network/pdi_helper.py +206 -0
- toolkits/network/send_mail.py +105 -0
- toolkits/system/__init__.py +0 -0
- toolkits/system/aes_cipher.py +44 -0
- toolkits/system/basic_utils.py +20 -0
- toolkits/system/collections_helper.py +72 -0
- toolkits/system/crpyt_helper.py +39 -0
- toolkits/system/dict2xml.py +416 -0
- toolkits/system/dict_helper.py +29 -0
- toolkits/system/excel_helper.py +101 -0
- toolkits/system/file_helper.py +52 -0
- toolkits/system/load_module.py +47 -0
- toolkits/system/priority_tasks.py +199 -0
- toolkits/system/process_monitor/__init__.py +0 -0
- toolkits/system/process_monitor/process_monitor.py +349 -0
- toolkits/system/shell_helper.py +263 -0
- toolkits/system/str_helper.py +187 -0
- toolkits/system/tasks_deamon/__init__.py +0 -0
- toolkits/system/tasks_deamon/tasks_controller.py +70 -0
- toolkits/system/tasks_deamon/tasks_multiprocessing.py +134 -0
- toolkits/system/tasks_deamon/tasks_process.py +137 -0
- toolkits/system/test_shell_helper.py +2 -0
- toolkits/system/time_helper.py +175 -0
- toolkits/system/win32_env.py +49 -0
- toolkits/tookits_app.py +17 -0
- toolkits/tookits_cli.py +126 -0
- toolkits-0.2.7.dist-info/METADATA +35 -0
- toolkits-0.2.7.dist-info/RECORD +56 -0
- toolkits-0.2.7.dist-info/WHEEL +4 -0
- toolkits-0.2.7.dist-info/entry_points.txt +5 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
import argparse
|
3
|
+
import pprint
|
4
|
+
import sys
|
5
|
+
import time
|
6
|
+
from copy import deepcopy
|
7
|
+
|
8
|
+
import arrow
|
9
|
+
import redis
|
10
|
+
import json
|
11
|
+
|
12
|
+
from arrow import Arrow
|
13
|
+
from log4python.Log4python import log
|
14
|
+
import traceback
|
15
|
+
import importlib
|
16
|
+
|
17
|
+
importlib.reload(sys)
|
18
|
+
logger = log("PriorityTasks")
|
19
|
+
|
20
|
+
|
21
|
+
class PriorityTasks:
|
22
|
+
'''
|
23
|
+
ServerDemo:
|
24
|
+
def init_worker(task):
|
25
|
+
pass # process task
|
26
|
+
if __name__ == '__main__':
|
27
|
+
task = PriorityTasks("Test")
|
28
|
+
task.worker(init_worker)
|
29
|
+
ClientDemo:
|
30
|
+
# priority in ["high", "mid", "low"]
|
31
|
+
PriorityTasks("Test").send_task(priority, task_params_json)
|
32
|
+
'''
|
33
|
+
def __init__(self, redis_conn_info, queue_key=None, work_status_queue_name="txt_redis_working_flag"):
|
34
|
+
self.redis_conn_info = redis_conn_info
|
35
|
+
self.queue_key = queue_key
|
36
|
+
self.work_status_queue_name = work_status_queue_name
|
37
|
+
self.key_file_tasks = self.queue_key+"_%s"
|
38
|
+
logger.info("PriorityTasksKey:[%s]" % self.queue_key)
|
39
|
+
self.keys_file_tasks = [self.queue_key+"_high", self.queue_key+"_mid", self.queue_key+"_low"]
|
40
|
+
self.redisCli = redis.StrictRedis(host=redis_conn_info['host'],
|
41
|
+
port=redis_conn_info['port'], password=redis_conn_info['password'],
|
42
|
+
db=redis_conn_info['db'], decode_responses=True)
|
43
|
+
|
44
|
+
def get_tasks_by_priority(self):
|
45
|
+
task = None
|
46
|
+
for key_task in self.keys_file_tasks:
|
47
|
+
# logger.debug("FetchKey:[%s]" % key_task)
|
48
|
+
line = self.redisCli.lpop(key_task)
|
49
|
+
if line:
|
50
|
+
logger.debug("Key:[%s]; line:[%s]" % (key_task, line))
|
51
|
+
task = line
|
52
|
+
break
|
53
|
+
return task
|
54
|
+
|
55
|
+
def get_tasks_stat(self):
|
56
|
+
for priority in ["high", "mid", "low"]:
|
57
|
+
key_process_priority = self.key_file_tasks % priority
|
58
|
+
print(("TaskQueue-%s-Number: [%s]" % (priority.capitalize(), str(self.redisCli.llen(key_process_priority)))))
|
59
|
+
|
60
|
+
@staticmethod
|
61
|
+
def get_worker_process():
|
62
|
+
print("No implement, Wait ...")
|
63
|
+
|
64
|
+
def stop_tasks(self):
|
65
|
+
self.redisCli.set(self.work_status_queue_name, "off")
|
66
|
+
|
67
|
+
def start_tasks(self):
|
68
|
+
self.redisCli.set(self.work_status_queue_name, "on")
|
69
|
+
|
70
|
+
def __send_task(self, priority, task_params):
|
71
|
+
if not self.queue_key:
|
72
|
+
tip = "The QueueKey is None, Nothing to Do."
|
73
|
+
logger.error(tip)
|
74
|
+
print(tip)
|
75
|
+
return None
|
76
|
+
|
77
|
+
queue_key = self.get_priority_queue(priority)
|
78
|
+
conn_info = deepcopy(self.redis_conn_info)
|
79
|
+
conn_info['password'] = "******"
|
80
|
+
logger.info("RedisInfo:[%s]; QueueKey:[%s]" % (json.dumps(conn_info, ensure_ascii=False), queue_key))
|
81
|
+
self.redisCli.rpush(queue_key, task_params)
|
82
|
+
|
83
|
+
def send_high_task(self, task_params):
|
84
|
+
self.__send_task("high", task_params)
|
85
|
+
|
86
|
+
def send_mid_task(self, task_params):
|
87
|
+
self.__send_task("mid", task_params)
|
88
|
+
|
89
|
+
def send_low_task(self, task_params):
|
90
|
+
self.__send_task("low", task_params)
|
91
|
+
|
92
|
+
def get_priority_queue(self, priority):
|
93
|
+
key_process_priority = self.key_file_tasks % "high"
|
94
|
+
if priority in ["high", "mid", "low"]:
|
95
|
+
key_process_priority = self.key_file_tasks % priority
|
96
|
+
else:
|
97
|
+
logger.error("Log priority Level Not Found [%s]" % priority)
|
98
|
+
return key_process_priority
|
99
|
+
|
100
|
+
def worker(self, task_func, func_records_check=None, records_count=1, time_out=30):
|
101
|
+
if not self.queue_key:
|
102
|
+
tip = "The QueueKey is None, Nothing to Do."
|
103
|
+
logger.error(tip)
|
104
|
+
print(tip)
|
105
|
+
return None
|
106
|
+
|
107
|
+
work_status = False
|
108
|
+
work_flag = self.redisCli.get(self.work_status_queue_name)
|
109
|
+
conn_info = deepcopy(self.redis_conn_info)
|
110
|
+
conn_info['password'] = "******"
|
111
|
+
logger.info("TasksRedisInfo:[%s]" % json.dumps(conn_info, ensure_ascii=False))
|
112
|
+
if str(work_flag).lower() == "on":
|
113
|
+
work_status = True
|
114
|
+
logger.info("CurrentTaskSwitchKey:[%s]; InitWork: Status is ON!!! " % self.work_status_queue_name)
|
115
|
+
else:
|
116
|
+
work_status = False
|
117
|
+
logger.info("CurrentTaskSwitchKey:[%s]; InitWork: Status is OFF!!! Nothing to do...." %
|
118
|
+
self.work_status_queue_name)
|
119
|
+
|
120
|
+
record_list = []
|
121
|
+
flag_fetch_data = False
|
122
|
+
time_idle_begin = 0
|
123
|
+
flag_start_to_wait_restart = "%s_pid_%s_status" % (self.work_status_queue_name, str(1))
|
124
|
+
while True:
|
125
|
+
work_flag = self.redisCli.get(self.work_status_queue_name)
|
126
|
+
if str(work_flag).lower() != "on":
|
127
|
+
if work_status:
|
128
|
+
logger.info("Work Status Change to OFF!!! ")
|
129
|
+
time_stop = arrow.now().format('YYYY-MM-DD HH:mm:ss')
|
130
|
+
self.redisCli.set(flag_start_to_wait_restart, "wait_to_restart:[%s]" % time_stop)
|
131
|
+
work_status = False
|
132
|
+
time.sleep(1)
|
133
|
+
continue
|
134
|
+
else:
|
135
|
+
if work_status is False:
|
136
|
+
logger.info("Work Status Change to ON!!! ")
|
137
|
+
self.redisCli.set(flag_start_to_wait_restart, "ok_now_to_start_process_task", 0.5)
|
138
|
+
work_status = True
|
139
|
+
|
140
|
+
task = self.get_tasks_by_priority()
|
141
|
+
if task is None:
|
142
|
+
if flag_fetch_data is True:
|
143
|
+
flag_fetch_data = False
|
144
|
+
time_idle_begin = Arrow.now().timestamp
|
145
|
+
else:
|
146
|
+
if len(record_list) > 0:
|
147
|
+
time_cur = Arrow.now().timestamp
|
148
|
+
time_used = time_cur - time_idle_begin
|
149
|
+
if time_used >= time_out:
|
150
|
+
task_func(record_list)
|
151
|
+
record_list = []
|
152
|
+
time.sleep(1)
|
153
|
+
continue
|
154
|
+
else:
|
155
|
+
flag_fetch_data = True
|
156
|
+
|
157
|
+
if records_count == 1:
|
158
|
+
task_func(task)
|
159
|
+
else:
|
160
|
+
if func_records_check is not None:
|
161
|
+
ret_data = func_records_check(task)
|
162
|
+
if isinstance(ret_data, list):
|
163
|
+
record_list.extend(ret_data)
|
164
|
+
else:
|
165
|
+
record_list.append(ret_data)
|
166
|
+
else:
|
167
|
+
record_list.append(task)
|
168
|
+
|
169
|
+
if len(record_list) >= records_count:
|
170
|
+
record_list = self.process_data(task_func, record_list, records_count)
|
171
|
+
|
172
|
+
@staticmethod
|
173
|
+
def process_data(func_process, arr, count):
|
174
|
+
unprocess_list = []
|
175
|
+
len_arr = len(arr)
|
176
|
+
len_range = len_arr / count
|
177
|
+
|
178
|
+
for item in range(len_range + 1):
|
179
|
+
index_begin = item * count
|
180
|
+
index_end = index_begin + count
|
181
|
+
if index_end > len_arr:
|
182
|
+
index_end = len_arr
|
183
|
+
unprocess_list = arr[index_begin: index_end]
|
184
|
+
break
|
185
|
+
else:
|
186
|
+
func_process(arr[index_begin: index_end])
|
187
|
+
|
188
|
+
return unprocess_list
|
189
|
+
|
190
|
+
|
191
|
+
if __name__ == '__main__':
|
192
|
+
try:
|
193
|
+
parser = argparse.ArgumentParser()
|
194
|
+
parser.add_argument("logFile", type=str, help="specify the log file's path")
|
195
|
+
args = parser.parse_args()
|
196
|
+
print((args.logFile))
|
197
|
+
except Exception as ex:
|
198
|
+
logger.error("Error: %s" % ex)
|
199
|
+
logger.error(traceback.format_exc())
|
File without changes
|
@@ -0,0 +1,349 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
import importlib
|
3
|
+
import json
|
4
|
+
import os
|
5
|
+
import sys
|
6
|
+
|
7
|
+
import fire
|
8
|
+
from log4python.Log4python import log
|
9
|
+
from unipath import Path
|
10
|
+
|
11
|
+
from toolkits.databases.database_client_util import DatabaseClientUtil
|
12
|
+
from toolkits.system.priority_tasks import PriorityTasks
|
13
|
+
from toolkits.system.shell_helper import exec_shell
|
14
|
+
|
15
|
+
importlib.reload(sys)
|
16
|
+
logger = log("ProcessMonitor")
|
17
|
+
|
18
|
+
|
19
|
+
class ProcessMonitor:
|
20
|
+
"""
|
21
|
+
config_monitor = {
|
22
|
+
"circus_config_path": "/circus/circus.conf",
|
23
|
+
"monitor_queue_name": "process_monitor",
|
24
|
+
"monitor_queue_switch": "process_monitor_switch",
|
25
|
+
"redis_info": {
|
26
|
+
"password": "just_your_redis_password",
|
27
|
+
"host": "your_redis_ip",
|
28
|
+
"port": 8081,
|
29
|
+
"db": 6
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
task_monitor_config =
|
34
|
+
{
|
35
|
+
"name": "TmpMonitor",
|
36
|
+
"cmd": "python",
|
37
|
+
"args": "tmp_monitor.py",
|
38
|
+
"working_dir": ".",
|
39
|
+
"copy_env": "true",
|
40
|
+
"numprocesses": "1",
|
41
|
+
"stdout_stream.class": "FileStream",
|
42
|
+
"stdout_stream.filename": "tmp_monitor.log",
|
43
|
+
"stdout_stream.max_bytes": "1073741824",
|
44
|
+
"stdout_stream.backup_count": "5"
|
45
|
+
}
|
46
|
+
|
47
|
+
:param config_file_path:
|
48
|
+
:param monitor_config_filename:
|
49
|
+
"""
|
50
|
+
|
51
|
+
def __init__(self, config_file_path, monitor_config_filename="monitor.json"):
|
52
|
+
self.__base_path = self.__get_script_dir()
|
53
|
+
self.__work_path = self.__get_run_dir()
|
54
|
+
self.__monitor_config_filename = monitor_config_filename
|
55
|
+
self.__config_file_path = config_file_path
|
56
|
+
self.__config_path = None
|
57
|
+
self.__redis_info = None
|
58
|
+
self.__monitor_queue_switch = None
|
59
|
+
self.__monitor_queue_name = None
|
60
|
+
self.__task_name = ""
|
61
|
+
self.__task_config = ""
|
62
|
+
self.__task_queue_client = None
|
63
|
+
self.__init_global_config()
|
64
|
+
|
65
|
+
def __init_global_config(self):
|
66
|
+
if Path(self.__config_file_path).exists():
|
67
|
+
file_path_final = self.__config_file_path
|
68
|
+
else:
|
69
|
+
relative_path = "%s/%s" % (self.__work_path, self.__config_file_path)
|
70
|
+
|
71
|
+
if Path(relative_path).exists():
|
72
|
+
file_path_final = relative_path
|
73
|
+
else:
|
74
|
+
msg = "global config file was not Found!!!"
|
75
|
+
print(msg)
|
76
|
+
raise Exception(msg)
|
77
|
+
|
78
|
+
logger.debug("GlobalConfigPath:[%s]" % file_path_final)
|
79
|
+
fp = open(file_path_final)
|
80
|
+
lines = fp.readlines()
|
81
|
+
fp.close()
|
82
|
+
|
83
|
+
config_monitor = json.loads("".join(lines))
|
84
|
+
self.__config_path = config_monitor['circus_config_path']
|
85
|
+
self.__redis_info = config_monitor['redis_info']
|
86
|
+
self.__monitor_queue_switch = config_monitor['monitor_queue_switch']
|
87
|
+
self.__monitor_queue_name = config_monitor['monitor_queue_name']
|
88
|
+
|
89
|
+
@staticmethod
|
90
|
+
def __get_run_dir():
|
91
|
+
script_path = sys.argv[0]
|
92
|
+
process_id = os.getpid()
|
93
|
+
link_path = "/proc/%s/cwd" % process_id
|
94
|
+
read_link_path = "ls -la %s|awk -F'->' '{print $2}'" % link_path
|
95
|
+
ret = exec_shell(read_link_path)
|
96
|
+
if str(ret['exit_code']) == "0":
|
97
|
+
full_path = str(ret['stdout'][0]).strip()
|
98
|
+
else:
|
99
|
+
if script_path[0] != "/":
|
100
|
+
path_tmp = "%s/%s" % (os.getcwd(), script_path)
|
101
|
+
else:
|
102
|
+
path_tmp = script_path
|
103
|
+
full_path = os.path.dirname(path_tmp)
|
104
|
+
return full_path
|
105
|
+
|
106
|
+
@staticmethod
|
107
|
+
def __get_script_dir():
|
108
|
+
return os.path.dirname(os.path.realpath(__file__))
|
109
|
+
|
110
|
+
def __get_monitor_config(self):
|
111
|
+
file_path = "%s/%s" % (self.__work_path, self.__monitor_config_filename)
|
112
|
+
config_info = None
|
113
|
+
if Path(file_path).exists():
|
114
|
+
fp = open(file_path)
|
115
|
+
lines = fp.readlines()
|
116
|
+
config_info = "".join(lines)
|
117
|
+
return config_info
|
118
|
+
|
119
|
+
def __prepare_config(self):
|
120
|
+
name_tasks = None
|
121
|
+
config_task = []
|
122
|
+
config_info = self.__get_monitor_config()
|
123
|
+
log_info = ['cmd', 'args', 'working_dir', 'copy_env',
|
124
|
+
'numprocesses', 'stdout_stream.class',
|
125
|
+
'stdout_stream.filename',
|
126
|
+
'stdout_stream.max_bytes',
|
127
|
+
'stdout_stream.backup_count']
|
128
|
+
|
129
|
+
if config_info:
|
130
|
+
config_obj = json.loads(config_info)
|
131
|
+
name_tasks = config_obj['name']
|
132
|
+
config_task = ["[watcher:%s]" % name_tasks]
|
133
|
+
|
134
|
+
work_path = self.__get_run_dir()
|
135
|
+
logs_path = "%s/logs/" % work_path
|
136
|
+
if not Path(logs_path).exists():
|
137
|
+
Path(logs_path).mkdir(parents=True)
|
138
|
+
|
139
|
+
for item in log_info:
|
140
|
+
if item in config_obj:
|
141
|
+
if ("working_dir" == item and item in config_obj) \
|
142
|
+
and (config_obj['working_dir'] == "." or config_obj['working_dir'] == ""):
|
143
|
+
config_task.append("%s = %s" % (item, work_path))
|
144
|
+
continue
|
145
|
+
|
146
|
+
if "stdout_stream.filename" == item and item in config_obj:
|
147
|
+
file_name = config_obj['stdout_stream.filename']
|
148
|
+
if file_name != "":
|
149
|
+
logs_file_path = file_name
|
150
|
+
if file_name.find("\\") < 0 and file_name.find("/") < 0:
|
151
|
+
logs_file_path = "%s/%s" % (logs_path, file_name)
|
152
|
+
config_task.append("%s = %s" % (item, logs_file_path))
|
153
|
+
else:
|
154
|
+
logs_file_path = "%s/%s" % (logs_path, "%s.log" % name_tasks)
|
155
|
+
config_task.append("%s = %s" % (item, logs_file_path))
|
156
|
+
continue
|
157
|
+
|
158
|
+
config_task.append("%s = %s" % (item, config_obj[item]))
|
159
|
+
|
160
|
+
for item in config_obj:
|
161
|
+
if item not in log_info:
|
162
|
+
if item == "name":
|
163
|
+
continue
|
164
|
+
dict_val = config_obj[item]
|
165
|
+
if config_obj[item] is None:
|
166
|
+
dict_val = ""
|
167
|
+
config_task.append("%s = %s" % (item, dict_val))
|
168
|
+
else:
|
169
|
+
msg_err = "No config be found!!!!"
|
170
|
+
print(msg_err)
|
171
|
+
logger.debug(msg_err)
|
172
|
+
raise Exception(msg_err)
|
173
|
+
|
174
|
+
return name_tasks, config_task
|
175
|
+
|
176
|
+
def __init_env(self):
|
177
|
+
self.__task_name, self.__task_config = self.__prepare_config()
|
178
|
+
self.__task_queue_client = self.__init_tasks_queue_client(self.__redis_info, self.__monitor_queue_name)
|
179
|
+
cmd = {
|
180
|
+
'type': 'start', # install, start, restart, stop, remove
|
181
|
+
'name': self.__task_name,
|
182
|
+
'config': "\n".join(self.__task_config),
|
183
|
+
}
|
184
|
+
return cmd
|
185
|
+
|
186
|
+
def __switch_process(self, status):
|
187
|
+
database_init = DatabaseClientUtil(None)
|
188
|
+
redis_client = database_init.get_redis_client(self.__redis_info['db'], self.__redis_info)
|
189
|
+
redis_client.set(self.__monitor_queue_switch, status)
|
190
|
+
|
191
|
+
def switch_tasks_queue_on(self):
|
192
|
+
self.__switch_process("on")
|
193
|
+
|
194
|
+
def switch_tasks_queue_off(self):
|
195
|
+
self.__switch_process("off")
|
196
|
+
|
197
|
+
def get_switch_tasks_status(self):
|
198
|
+
database_init = DatabaseClientUtil(None)
|
199
|
+
redis_client = database_init.get_redis_client(self.__redis_info['db'], self.__redis_info)
|
200
|
+
return redis_client.get(self.__monitor_queue_switch)
|
201
|
+
|
202
|
+
def start_daemon_server(self):
|
203
|
+
"""
|
204
|
+
CMD:
|
205
|
+
circusd --daemon --pidfile /home/vagrant/dev/circus/circus.pid --log-level debug --log-output /home/vagrant/dev/circus/circus.log /home/vagrant/dev/circus/circus.conf
|
206
|
+
:return:
|
207
|
+
"""
|
208
|
+
self.switch_tasks_queue_on()
|
209
|
+
self.__init_tasks_queue_server(self.__redis_info, self.__exec_cmd_list,
|
210
|
+
self.__monitor_queue_switch,
|
211
|
+
self.__monitor_queue_name)
|
212
|
+
|
213
|
+
def get_task_status(self, task_name):
|
214
|
+
"""
|
215
|
+
error| stopped| active
|
216
|
+
:param task_name:
|
217
|
+
:return:
|
218
|
+
"""
|
219
|
+
cmd_exec = "circusctl status %s" % task_name
|
220
|
+
ret = exec_shell(cmd_exec)
|
221
|
+
status = "error"
|
222
|
+
if str(ret['exit_code']) == "0":
|
223
|
+
status = str(ret['stdout'][0]).strip()
|
224
|
+
return status
|
225
|
+
|
226
|
+
def __write_monitor_config(self, task_config):
|
227
|
+
fp = open(self.__config_path, "a+")
|
228
|
+
fp.write("\n")
|
229
|
+
fp.write(task_config)
|
230
|
+
fp.close()
|
231
|
+
|
232
|
+
def __process_install(self, task_name, task_config):
|
233
|
+
status = self.get_task_status(task_name)
|
234
|
+
if status in ["active", "stopped"]:
|
235
|
+
msg = "Task[%s] was exists!! please check the configure info" % task_name
|
236
|
+
logger.error(msg)
|
237
|
+
print(msg)
|
238
|
+
elif status == "error":
|
239
|
+
self.__write_monitor_config(task_config)
|
240
|
+
cmd_exec = "circusctl reloadconfig | circusctl start %s" % task_name
|
241
|
+
ret = exec_shell(cmd_exec)
|
242
|
+
if ret['exit_code'] == 0:
|
243
|
+
logger.debug("Task[%s] was ready!!" % task_name)
|
244
|
+
else:
|
245
|
+
logger.error("Task[%s] was execute wrong!!" % task_name)
|
246
|
+
else:
|
247
|
+
msg = "Task[%s] status was wrong!!!! please check the configure info" % task_name
|
248
|
+
logger.error(msg)
|
249
|
+
|
250
|
+
def __process_uninstall(self, task_name):
|
251
|
+
self.__process_cmd(task_name, "stop")
|
252
|
+
|
253
|
+
@staticmethod
|
254
|
+
def __process_cmd(task_name, cmd_type):
|
255
|
+
cmd_exec = "circusctl %s %s" % (cmd_type, task_name)
|
256
|
+
logger.debug("CMD:[%s]" % cmd_exec)
|
257
|
+
ret = exec_shell(cmd_exec)
|
258
|
+
if str(ret['exit_code']) != "0":
|
259
|
+
logger.error("Error:[%s]" % "\n".join(ret['stderr']))
|
260
|
+
|
261
|
+
def __exec_cmd(self, cmd_obj):
|
262
|
+
logger.debug("CMD_INFO:[%s]" % json.dumps(cmd_obj, ensure_ascii=False))
|
263
|
+
status = self.get_task_status(cmd_obj['name'])
|
264
|
+
logger.debug("Task[%s] current status:[%s]" % (cmd_obj['name'], status))
|
265
|
+
|
266
|
+
if cmd_obj['type'] == "install":
|
267
|
+
self.__process_install(cmd_obj['name'], cmd_obj['config'])
|
268
|
+
elif cmd_obj['type'] == "uninstall":
|
269
|
+
self.__process_uninstall(cmd_obj['name'])
|
270
|
+
else:
|
271
|
+
if status != "error":
|
272
|
+
self.__process_cmd(cmd_obj['name'], cmd_obj['type'])
|
273
|
+
else:
|
274
|
+
msg = "Task[%s] status is unknown!!!" % cmd_obj['name']
|
275
|
+
logger.error(msg)
|
276
|
+
print(msg)
|
277
|
+
|
278
|
+
def __exec_cmd_list(self, cmd_info):
|
279
|
+
"""
|
280
|
+
redis_info['db'] = 8
|
281
|
+
cmd_info = {
|
282
|
+
'type': 'start', # install, start, restart, stop, remove
|
283
|
+
'name': 'task_name',
|
284
|
+
'config': 'task_config',
|
285
|
+
}
|
286
|
+
:return:
|
287
|
+
"""
|
288
|
+
entity_list = []
|
289
|
+
if isinstance(cmd_info, str):
|
290
|
+
entity_list.append(json.loads(cmd_info))
|
291
|
+
elif isinstance(cmd_info, list):
|
292
|
+
for item in cmd_info:
|
293
|
+
entity_list.append(json.loads(item))
|
294
|
+
else:
|
295
|
+
logger.debug("Error:[%s]" % json.dumps(cmd_info, ensure_ascii=False))
|
296
|
+
|
297
|
+
for item_cmd in entity_list:
|
298
|
+
self.__exec_cmd(item_cmd)
|
299
|
+
|
300
|
+
@staticmethod
|
301
|
+
def __send_tasks(task_client, cmd_data, level="high"):
|
302
|
+
if level == "high":
|
303
|
+
task_client.send_high_task(cmd_data)
|
304
|
+
|
305
|
+
@staticmethod
|
306
|
+
def __init_tasks_queue_server(redis_conn_info, task_process_worker,
|
307
|
+
task_switch_name, tasks_queue_name="process_monitor"):
|
308
|
+
task = PriorityTasks(redis_conn_info, tasks_queue_name, work_status_queue_name=task_switch_name)
|
309
|
+
task.worker(task_process_worker, records_count=100, time_out=10)
|
310
|
+
|
311
|
+
@staticmethod
|
312
|
+
def __init_tasks_queue_client(redis_conn_info, tasks_queue_name="process_monitor"):
|
313
|
+
task_client = PriorityTasks(redis_conn_info, tasks_queue_name)
|
314
|
+
return task_client
|
315
|
+
|
316
|
+
def __process_cmd_info(self, cmd_type):
|
317
|
+
cmd = self.__init_env()
|
318
|
+
cmd['type'] = cmd_type
|
319
|
+
self.__send_tasks(self.__task_queue_client, json.dumps(cmd, ensure_ascii=False))
|
320
|
+
|
321
|
+
def get_task_name(self):
|
322
|
+
self.__init_env()
|
323
|
+
return self.__task_name
|
324
|
+
|
325
|
+
def get_task_config(self):
|
326
|
+
self.__init_env()
|
327
|
+
return self.__task_config
|
328
|
+
|
329
|
+
def monitor_start(self):
|
330
|
+
self.__process_cmd_info("start")
|
331
|
+
|
332
|
+
def monitor_restart(self):
|
333
|
+
self.__process_cmd_info("restart")
|
334
|
+
|
335
|
+
def monitor_stop(self):
|
336
|
+
self.__process_cmd_info("stop")
|
337
|
+
|
338
|
+
def monitor_install(self):
|
339
|
+
self.__process_cmd_info("install")
|
340
|
+
|
341
|
+
def monitor_uninstall(self):
|
342
|
+
self.__process_cmd_info("uninstall")
|
343
|
+
|
344
|
+
def __worker(self):
|
345
|
+
pass
|
346
|
+
|
347
|
+
|
348
|
+
if __name__ == '__main__':
|
349
|
+
fire.Fire(ProcessMonitor)
|