def openbrowser(self, browser='Chrome', dr=None): if browser == 'Chrome' or browser == '': if dr == None or dr == '': dr = "./lib/chromedriver.exe" # 创建一个用来配置Chrome属性的变量 Options = ChromeOptions() # 去掉"Chrome正受到自动测试软件的控制"字样 Options.add_experimental_option("excludeSwitches", ['enable-automation']) # 加载缓存 user_profile = os.environ['USERPROFILE'] Options.add_argument( '--user-data-dir=' + user_profile + '\\AppData\\Local\\Google\\Chrome\\User Data\\') # 打开谷歌浏览器 self.driver = Chrome(executable_path=dr, options=Options) self.writer.write(self.writer.row, 7, 'PASS') self.writer.write(self.writer.row, 8, 'Chrome浏览器打开成功') elif browser == 'Firefox': if dr == None or dr == '': dr = '../lib/geckodriver.exe' # 打开火狐浏览器 self.driver = Firefox(executable_path=dr) self.writer.write(self.writer.row, 7, 'PASS') self.writer.write(self.writer.row, 8, 'Firefox浏览器打开成功') elif browser == 'ie': if dr == None or dr == '': dr = '../lib/IEDriverServer.exe' # 打开ie浏览器 self.driver = Ie(executable_path=dr) self.writer.write(self.writer.row, 7, 'PASS') self.writer.write(self.writer.row, 8, 'IE浏览器打开成功') else: logger.warn("该浏览器暂未实现自动化功能!") self.writer.write(self.writer.row, 7, 'FAIL') self.writer.write(self.writer.row, 8, '该浏览器暂未实现自动化功能') return
def __get_data1(self, s): """ 默认标准参数s是以key=value&key1=value2的格式,如果不是,就原样返回 :param s: :return: """ flg = False param = {} p = s.split('&') try: for pp in p: ppp = pp.split("=") # if ppp[1].isdigit(): # param[ppp[0]] = int(ppp[1]) # else: ppp_value = '' ppp_value = '='.join(ppp[1:]) param[ppp[0]] = ppp_value except Exception as e: flg = True logger.warn("url参数格式不标准!") print("url参数格式不标准!") logger.exception(e) print(e) # print(param) # 如果符合标准格式返回处理后的param,否则,返回原样s if flg: s = s.encode('utf-8') return s else: return param
def on_message(msg): message = msg.text logger.debug("接收到微信消息:type=%s,message=%s", msg.type, msg.text) if msg.type == "TEXT": logger.debug("从微信端接收的raw消息:%s", message) # 把聊天内容保存到文章中 logger.history(self.type, msg.chat.name, msg.member.name, message) #如果不是群聊,不理他 if not isinstance(msg.chat, Group): logger.warn("目前,只支持群聊天") return "目前只支持群聊天" # 如果是群聊,但没有被 @,则不回复 # msg.chat: # 消息所在的聊天会话,即: # 对于自己发送的消息,为消息的接收者 # 对于别人发送的消息,为消息的发送者 str_msg = "" if msg.type.upper() == "TEXT" and msg.is_at: pass else: logger.debug("不是@给自己的消息,忽略:%s", message) return #如果录音的话,就不管@没@了,直接接受语音转成文字,作为消息 if msg.type == "Recording": logger.debug("消息格式为声音,使用科大讯飞或百度转化") str_msg = "FAILED" #voice2txt.v2t(msg.get_file()) logger.debug("科大讯飞转化结果为:%s", str_msg) if str_msg is None: logger.error("语音转化失败") return else: msg.reply("您说:[" + str_msg + "]") elif msg.type.upper() == "TEXT": str_msg = self.remove_at(message) logger.debug("接收到发给我(bot)的消息:%s", str_msg) user = msg.member.name group = msg.chat.name # 得到我们的业务处理组件 | route(self, client, user, group, msg): biz_comp, context = self.bizManager.route(self.type, user, group, str_msg) # 调用业务组件的接口方法来处理消息 logger.debug("调用业务组件bot2system:type=%s,user=%s,group=%s,msg=%s", self.type, user, group, str_msg) returnMsg = biz_comp.bot2system(self, self.type, context, user, group, str_msg) self.random_wait() # 间隔一下,防止被封 return returnMsg
def runcase(obj, line): """ 用例执行 :param obj: 对象 :param line: 包含所有行的列表 :return: """ if len(line[0]) > 0 or len((line[1])) > 0: # 分组信息不执行,第一列或第二列有文字的说明是分组信息 return func = getfunc(obj, line[3]) if func is None: logger.warn(f'关键字{line[3]}不存在') return if func[1] == 0: func[0]() elif func[1] == 1: func[0](line[4]) elif func[1] == 2: func[0](line[4], line[5]) elif func[1] == 3: func[0](line[4], line[5], line[6]) else: logger.warn("关键字暂不支持超过3个参数")
def post(self, path, data=None): ''' :param path: url路径 :param data: 键值对传参 :return: 无返回值 ''' if not path.startswith('http'): path = self.url + '/' + path try: # 判断data是否需要传参数 result = None if data is None or data == '': result = self.session.post(path) else: # 替换参数 data = self.__getparms(data) logger.info(data) # 转为字典 data = self.__todict(data) logger.info(data) # 发送请求 result = self.session.post(path, data) self.jsonres = json.loads(result.text) self.writer.write(self.writer.row, self.writer.clo, 'PASS') self.writer.write(self.writer.row, self.writer.clo + 1, str(self.jsonres)) except Exception as e: self.writer.write(self.writer.row, self.writer.clo, 'FAIL') self.writer.write(self.writer.row, self.writer.clo + 1, str(self.jsonres)) logger.warn(e)
def send_image(self, group_id, user, img_path): logger.debug("发送图片到QQ服务器,群[%s],图片[%s]", group_id, img_path) if group_id is None: logger.error("错误发送图片到QQ服务器,群名字为空") return False #./coolq/data/image/CJKunlGo.jpg ==> CJKunlGo.jpg #只需要文件名,因为文件已经放到酷Q约定的目录里了,是在bot.conf coolq[cache_path]定义的 img_name = img_path[img_path.rfind("/") + 1:] src = img_path dst = self.conf.coolq_cache_path + "/" + img_name if src != dst: logger.debug("复制QQ图片到酷Q目录,src:%s => det:%s", src, dst) copyfile(src, dst) else: logger.debug("QQ图片源目标相同,忽略:%s", src) try: self.random_wait() #[CQ:image,file=file:///C:\Users\richard\Pictures\1.png] if user: msg = "[CQ:image,file={}] \n@{}".format(img_name, user) else: msg = "[CQ:image,file={}]".format(img_name) logger.debug(u"发送图片[%s]给QQ群[%s]", msg, group_id) return self.send_group_msg(group_id, msg) except Exception as e: logger.warn(u"发送图片到QQ失败,原因:%s", str(e)) return False
def main_loop(self): rlist = [] rlist.append(self.__pipe.inform) timeout = 10 try: while self.__running: readable, _, _ = select.select(rlist, [], [], timeout) if not readable: continue if self.__pipe.inform in readable: try: message = self.__pipe.read(256) except OSError, exc: logger.warn("[Error %d] appeared at reading pipe" % exc.errno) continue if len(message) == 0: continue self.handle_message(message) except KeyboardInterrupt: logger.error("Break by user.") except Exception, ex: logger.error("{0}: {1}".format(sys._getframe().f_code.co_name, ex))
def proto_inst(self): protocol_inst = self.protocol_ref() if protocol_inst is None: msg = '[%d] 连接REF为空, 已断开' % self.chip_id logger.warn(msg) raise DeviceDisconnected(msg) return protocol_inst
def send(self, group_name, user_name, message, html=None): #html type is "Content" groups = self.bot.search(group_name) if groups is None or len(groups) == 0: logger.warn("无法找到微信群[%s]", group_name) logger.warn("因此, 发送消息到微信群失败:%s", message) return for group in groups: self.__send_html(group, html) # http://wxpy.readthedocs.io/zh/latest/faq.html, # 此api项目不支持@,这里@,只是一个字符串消息而已 try: self.random_wait() if user_name: group.send(message + "\n\n@" + user_name) else: group.send(message) except ResponseError as e: logger.exception(e, "发送消息给微信服务失败,原因:%s", str(e)) return logger.debug("成功发给[%s]消息:%s", group_name, message)
def send_image(self, groups, user, img_path): if not isinstance(groups, dict): logger.warn("send_image参数groups不合法,需要字典类型:%r", groups) return logger.debug("发送图片send_image,groups=%r", groups) qq_group = groups.get('qq_group', None) wechat_group = groups.get('wechat_group', None) email = groups.get('email', None) #这个设计有些诡异,为了统一,暂时先这样吧 params = {} params["user"] = user params["msg_type"] = "image" params["img_path"] = img_path if qq_group: params["group"] = qq_group self.send_qq_queue(params) if wechat_group: params["group"] = wechat_group self.send_wechat_queue(params) for bot in self.bots: # bots是qqbot和wxbot的实例 # if bot.type == "qq" and qq_group: # bot.send_image(qq_group,user,img_path) # if bot.type == "wechat" and wechat_group: # bot.send_image(wechat_group,user,img_path) if bot.type == "email" and email: bot.send_image(email, user, img_path)
def get_config(path): """ powered by Mr Will at 2018-12-22 用来格式化打印日志到文件和控制台 :param path:配置文件路径 :return:返回配置文件dict """ global config # 重新获取时,先清空配置 config.clear() txt = Txt(path) data = txt.read() for s in data: # 跳过注释 if s.startswith('#'): continue if not s.find('=') > 0: logger.warn('配置文件格式错误,请检查:' + str(s)) continue try: key = s[0:s.find('=')] value = s[s.find('=') + 1:s.__len__()] config[key] = value except Exception as e: logger.warn('配置文件格式错误,请检查:' + str(s)) logger.exception(e) return config
def update_queues_info_with_nodes_change(queues_info): # get addition, deletion node_id, then update queues_info # remove deleted node_id from queues_info # add new node_id to default queues_info last_cmpnode_list = get_last_cmpnode_list() current_sid = get_current_cmpnode_list() for node in last_cmpnode_list: if node not in list(current_sid): node_in_queue = False for _, queue in queues_info.iteritems(): if node in list(queue[NODEID_LIST]): # remove node from queue nodeid_list logger.warn("remove [%s%s] from queue [%s]", COMPUTE_HOSTNAME_PREFIX, node, queue[PARTITION_NAME]) queues_info[NODEID_LIST].remove(node) node_in_queue = True if not node_in_queue: logger.warn("%s%s doesn't belong to any queue", COMPUTE_HOSTNAME_PREFIX, node) else: current_sid.remove(node) # add new node to default queue for node in current_sid: for _, queue in queues_info.iteritems(): if queue[DEFAULT]: queue[NODEID_LIST].append(node) # update queue Nodes for each Partition in queues_info update_queues_node_from_nodeid(queues_info)
def get_config(path): """ powered by Jhx at 2020/1/27 用来将配置文件转换为字典,方便后续使用 :param path:配置文件路径 :return:返回配置文件dict """ global config config.clear() # 重新获取时,先清空配置 txt = Txt(path) data = txt.read() for s in data: if s.startswith('#'): # 跳过注释 continue if not s.find('='): logger.warn('配置文件格式错误,请检查:' + str(s)) continue try: key = s[0:s.find('=')] value = s[s.find('=') + 1:s.__len__()] config[key] = value except Exception as e: logger.warn('配置文件格式错误,请检查:' + str(s)) logger.exception(e) return config
def runapp(self, c, t): conf = { 'platformName': 'Android', 'platformVersion': '6.0.1', 'deviceName': '127.0.0.1:7555', 'appPackage': 'com.Glaciwaker.SmithStory', 'appActivity': 'com.unity3d.player.UnityPlayerActivity', 'noReset': 'true', } try: c = eval(c) for key in c: conf[key] = c[key] except Exception as e: logger.warn('app配置错误,请检查') logger.exception(e) #多个设备需要指定连接设备 conf['udid'] = conf['deviceName'] #确保设备是连上的 try: os.system('adb connect ' + conf['deviceName']) os.system('adb devices') except: pass #连接appium并且启动app self.driver = webdriver.Remote( 'http://localhost:' + self.port + '/wd/hub', conf) # self.driver = webdriver.Remote('http://127.0.0.1:4777/wd/hub', conf) #隐式等待 self.wait(t) return self.driver
def __send_msg(self, action, target_type, target_id, msg): super(QQBot, self).random_wait() #随机等待3秒 url = self.conf.coolq_url + action qq = self.conf.coolq_qq data = {target_type: target_id, "message": msg, "auto_escape": False} logger.debug("消息发往酷Q:url=%s,user_id=%s,message=%r", url, qq, data) result = http_helper.do_request_json(url, data) logger.debug("HTTP返回结果:%r", result) if result is None: return False ''' { "status": "ok", "retcode": 0, "data": { "id": 123456, "nickname": "滑稽" } } ''' status = result['status'] retcode = result['retcode'] error_msg = ERROR_CODE.get(str(retcode), "未知错误码") if retcode != 0: logger.warn("调用酷Q HTTP接口失败:status=[%s],retcode=[%d],error=[%s]", status, retcode, error_msg) return False return True
def render_GET(self, request): apps = request.args.get('app') if not apps: logger.warn('通过接口查询在线设备,未指定appid') request.setResponseCode(400) return request.write(json.dumps({"msg": "args error."})) dev_objs = [] for _appid in apps: appid = to_int(_appid) if not appid: logger.warn('接口参数错误,app需为整形') request.setResponseCode(400) return request.write(json.dumps({"msg": "args type error."})) app_devs = gl_routetable.find_devs_appid(appid) dev_objs.extend([{ 'appid': dev.appid, 'devid': dev.chipid, 'chipid': dev.chipid, 'latest': dev.regtime.strftime('%Y-%m-%d %H:%M:%S'), 'vertype': (0 if 'vertype' not in dev.kwargs else dev.kwargs['vertype']), 'devkey': ('' if 'devkey' not in dev.kwargs else dev.kwargs['devkey']), } for dev in app_devs]) return json.dumps(dev_objs)
def runCases(http, line): """ 执行每一行用例的方法 :param line: 参数列表 :return: 无 """ if len(line[0]) > 0 or len(line[1]) > 0: # 分组信息不用执行 pass else: func = getattr(http, line[3]) p = inspect.getfullargspec(func).__str__() p = p[p.find('args=') + 5:p.find(', varargs')] p = eval(p) p.remove('self') if len(p) == 0: func() elif len(p) == 1: func(line[4]) elif len(p) == 2: func(line[4], line[5]) elif len(p) == 3: func(line[4], line[5], line[6]) else: logger.warn("框架暂时只支持3个参数!")
def main_loop(self): rlist = [] rlist.append(self.__pipe.inform) timeout = 10 print "Total threads: {0}".format(threading.activeCount()) try: while self.__running: readable, _, _ = select.select(rlist, [], [], timeout) if not readable: continue if self.__pipe.inform in readable: try: message = self.__pipe.read(256) except OSError, exc: logger.warn("[Error %d] appeared at reading pipe" % exc.errno) continue if len(message) == 0: continue pdu_id = message.split()[0].split('.')[-2] pdu_index = self.to_index(int(pdu_id)) logger.info("Assign message to pdu {0}".format(pdu_id)) self.__pdus[pdu_index].handle_message(message) except KeyboardInterrupt: logger.error("Break by user.") except Exception, ex: logger.error("{0}: {1}".format(sys._getframe().f_code.co_name, ex))
def _request(self, target, shell, isPost, headers, payload, rsa=0): logger.debug("[#] Request _request...") if not shell.startswith("/"): shell = "/" + shell url = "http://" + target + shell logger.debug("[#] Request [%s] ..." % url) try: if isPost: resp = requests.post(url, headers=headers, data=payload, timeout=3) else: resp = requests.get(url, headers=headers, params=payload, timeout=3) if resp.status_code == 200: obj = resp.text if not rsa else rsa_decrypt(resp.text) obj = obj.strip() logger.debug("[#] Is RSA : %d" % rsa) logger.debug("[#] Resp : %s" % obj) if obj and self.callback and isinstance(self.callback, list): for cb in self.callback: if callable(cb): cb(target, obj) elif obj and callable(self.callback): self.callback(target, obj) return True except Exception as e: logger.warn("[!] %s" % e) return False
def merge(runnames, outname): dup_count = 0 missing_count = 0 recount = 0 iterum = 0 logger = common.logger.getLogger('merger',output='merge.log',level='info') dstdir = outname+'-profiles' if not os.path.exists(dstdir): os.mkdir(dstdir) dstps = common.profilestore.ProfileStore(outname+'-db.csv', logger) for name in runnames: ps = common.profilestore.ProfileStore(name+'-db.csv') srcdir = name+'-profiles' iterum = dstps.curuid for record in ps.records: uid = int(record['uid']) fname = str(uid)+'.pickle' if not os.path.exists(srcdir+os.sep+fname): logger.warn("Record {} in '{}' does not have a file.".format(uid, name)) missing_count += 1 else: tmp = int(dstps.add_record(record)) if tmp <= recount: logger.warn("Record {} in '{}' is not new.".format(uid, name)) dup_count += 1 recount = tmp shutil.copyfile(srcdir+os.sep+fname, dstdir+os.sep+fname) for fromuid in ps.matches: for touid in ps.matches[fromuid]: dstps.add_match((iterum+int(fromuid)), (iterum+int(touid))) print('Total of {} records copied. {} duplicates were discarded. {} records had no corresponding file.'.format(dstps.curuid, dup_count, missing_count))
def render_POST(self, request): msgtypes = request.args.get('msgtype') if not msgtypes: logger.info('数据直接推送接口,缺少msgtype') request.setResponseCode(400) return json.dumps({'msg': 'msgtype empty, ignored.'}) msgtype = to_int(msgtypes[0]) content = request.content.read() apps = request.args.get('app') if not apps: logger.info('通用数据推送接口 未获得app编号') request.setResponseCode(400) return json.dumps({'msg': 'devs empty'}) if len(apps) > 1: logger.info('不可以推送到多个APP') request.setResponseCode(400) return json.dumps({'msg': 'devs largger than one.'}) appid = to_int(apps[0]) chipids = gl_routetable.online_dev_appid(appid) if not chipids: logger.warn('app 无在线设备') request.setResponseCode(400) return json.dumps({'msg': 'apps has not online dev.'}) logger.info('找到在线设备 %s', pprint.pformat(chipids)) for chipid in chipids: logger.info('数据推送至 %d', chipid) gl_routetable.msg_dispatch(msgtype, content, chipid, None) return json.dumps({'msg': 'OK'})
def send(self, data): res, resa = self.compacting(data) now = int(time.time() * 1000) # logger.info('Monitor results: %s', str(res)) addResults = self.__api.addMonitorResults(self.__monitorId, now, res) if isinstance(addResults, dict): logger.info('Result.Response: %s', str(addResults)) if 'error' in addResults: if addResults.get('errorCode', 0) == 4: #Invalid or expired auth token logger.warn( 'Result.Response: %s; refresh token and try again..', str(addResults)) self.__api.updateAuthToken() addResults = self.__api.addMonitorResults( self.__monitorId, now, res) else: logger.error('Undefined error: %s', str(addResults)) logger.info('Result.Response: %s', json.dumps(addResults)) if isinstance(resa, basestring) and len( resa ) > 2 and 'status' in addResults and addResults['status'] == 'ok': # logger.info('addAdditionalResults: %s', json.dumps(resa)) addResults = self.__api.addMonitorAdditionalResults( self.__monitorId, now, resa) logger.info('AdResult.Response: %s', json.dumps(addResults))
def add_dev(self, app_id, app_key, chip_id, **kwargs): '''新增设备时在工厂里注册信息 :type app_id: int :type chip_id: int :type proto_ref: _weakref.ref ''' assert ('protocol_ref' in kwargs) assert ('devkey' in kwargs) assert ('vertype' in kwargs) assert ('conn_hash' in kwargs) dev = EspushDevice(appid=app_id, appkey=app_key, chipid=chip_id, devkey=kwargs['devkey'], vertype=kwargs['vertype'], protocol_ref=kwargs['protocol_ref'], conn_hash=kwargs['conn_hash']) # 如果此devices.chipid在本进程内有重复,则检查前者 for devobj in self._devices: if devobj.chipid == chip_id: logger.warn('重复设备编号,手动刷新前者。') self.check_online_manual(devobj) self._devices.append(dev) router_facotry.new_dev_online(app_id, app_key, chip_id, devkey=kwargs['devkey'], vertype=kwargs['vertype'], conn_hash=kwargs['conn_hash'])
def __send_html(self, group_id, user, html): #还要把大的html消息转成图片发送过去 if html is None: return #这里传入coolq的图片路径,是为了直接生成,不用再拷贝了 content = html.get_content("qq") img_path = '' if content: img_path = super(QQBot, self).html2img(content, self.conf.coolq_cache_path) super(QQBot, self).random_wait() if img_path is None: logger.debug("图片生成失败,发送纯文本给QQ用户:%s", html) if content: r = self.send_group_msg(group_id, html.get_plain_content()) logger.debug("CoolQ API调用结果:%r", r) return False try: logger.debug("发送本地HTML生成图片[%s]给QQ用户", img_path) r = self.send_image(group_id, user, img_path) logger.debug("CoolQ API调用:%r", r) except Exception as e: logger.warn("发送图片到QQ服务器失败,改为发送文本消息,图片发送失败原因:%s", str(e)) logger.debug("发送HTML文本给QQ用户:%s", html) r = self.send_group_msg(group_id, html.get_plain_content()) logger.debug("CoolQ API调用结果:%r", r) return r
def preprocessing(self, path, event): if not (os.path.exists(path) and os.path.isfile(path)): logger.warn('path is not exist '+str(path)) return logger.info("file: %s, %s" % (path, event)) if event != 'removed' : time.sleep(15) #sleeping for sure new_path = path+"_" logger.info('Move to '+new_path) os.rename(path, new_path) #new_path = path # # processing param = '' # details = '' lines = tuple(open(new_path, 'r')) result = {} ad_result = [] for line in lines : worker = 'w?' if 'worker' in line : pos = line.find('worker:')+len('worker:') endpos = line.find(';', pos) worker = line[pos:endpos] # logger.info('processing worker '+str(worker)+ '\n' +line) wpos = -1 if result.has_key('worker') and worker in result['worker'] : wpos = result['worker'].index(worker) # logger.info('wpos = '+str(wpos)) l = line.split('|', 2) if len(l) > 0 : #result for item in l[0].split(';') : i = item.split(':') if not i[0] in result : result[i[0]] = [] t = self.getCorrectValue(i[1]) if wpos >= 0 : result[i[0]][wpos] = t else : result[i[0]].append(t) resa = [] if len(l) > 1 : #additional result # ad_result[worker] = str(l[1]) # ll = l[1].split("+"); # if len(ll) > 0 : for k,v in simplejson.loads(l[1]).iteritems(): val = str(k)+":"+str(v) self.addAdditionalData(val.strip(), resa) ad_result.append(resa) # for worker in ad_result : # if len(details) > 0 : # details += ' + ' # details += "worker: "+worker+" + "+str(ad_result[worker]).strip('{').rstrip('}').replace(' ','').replace('},', '} + ').replace("'",'').replace('"','') param = str(result).strip('{').rstrip('}').replace(' ','').replace("'",'').replace('"','').replace('],', '];') return_value=param +';additionalResults:'+str(ad_result).replace("'","").replace("\"","") # logger.info('Returns: '+str(return_value)) return return_value
def reset(self): if self.waiting_step: logger.warn( 'Called reset() while waiting for the step to complete') self.step_wait() for pipe in self.parent_pipes: pipe.send(('reset', None)) return self._decode_obses([pipe.recv() for pipe in self.parent_pipes])
def handle_outlet(self, args): ''' 1. Get current outlet state 2. Get the current outlet action ''' # self.logger.info("handle outlet {0}/{1}".format(outlet, self.pdu)) outlet = args[0] action = args[1] logger.info("handle outlet {0}/{1}, action: {2}" .format(outlet, self.pdu, self.actions[int(action)])) vmname = self.__node_control_handler.get_node_name(1, int(outlet)) if vmname is None: self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0) logger.error("No virtual node found for outlet {0}".format(outlet)) return datastore = self.__node_control_handler.get_node_datastore(vmname) if datastore is None: self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0) logger.error("No datastore found for virtual node {0}" .format(vmname)) return # action = self.get_outlet_field(self.outlet_action_oid_offset, outlet) state = self.get_outlet_field(self.outlet_state_oid_offset, outlet) if self.actions[int(action)] == 'none' or \ self.actions[int(action)] == self.states[int(state)]: logger.warn("No need to execute the action: {}" .format(self.actions[int(action)])) return # restore the action default to "none" if self.actions[int(action)] == 'on': # 'on' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 5) status = self.__node_control_handler.power_on_node(datastore, vmname) elif self.actions[int(action)] == 'off': # 'off' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 4) status = self.__node_control_handler.power_off_node(datastore, vmname) elif self.actions[int(action)] == 'reboot': # 'off' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 8) status = self.__node_control_handler.reboot_node(datastore, vmname) # 'on' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 5) else: logger.error("Unknown action: {0}".format(action)) return if status != 0: logger.error("Failed to {0} virtual node." .format(self.actions[int(action)])) return self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0)
def find_devs(self, chipid): devs = [dev for dev in self._devices if dev.chipid == chipid] if not devs: logger.warn('未找到设备 [%d]', chipid) raise DeviceNotFound('Device [%d] not found.' % chipid) if len(devs) > 2: logger.warn('发现 [%d] 个设备连接 [%d]', len(devs), chipid) raise MultiDeviceFound('MultiDevice found.') return devs[0]
def msgfromid(self, msgid): msgs = [msg for msg in self.__msgs if msg.msgid == msgid] if not msgs: logger.info('收到来自服务进程 的数据但未找到源请求') raise Exception("data from svc, but msgid not found") if len(msgs) > 1: logger.warn('收到来自服务进程的数据,找到超过一个来源请求,异常') raise Exception('data from svc, but multi msgid') return msgs[0]
def handle_outlet(self, args): ''' 1. Get current outlet state 2. Get the current outlet action ''' # self.logger.info("handle outlet {0}/{1}".format(outlet, self.pdu)) outlet = args[0] action = args[1] logger.info("handle outlet {0}/{1}, action: {2}".format( outlet, self.pdu, self.actions[int(action)])) vmname = self.__node_control_handler.get_node_name(1, int(outlet)) if vmname is None: self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0) logger.error("No virtual node found for outlet {0}".format(outlet)) return datastore = self.__node_control_handler.get_node_datastore(vmname) if datastore is None: self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0) logger.error( "No datastore found for virtual node {0}".format(vmname)) return # action = self.get_outlet_field(self.outlet_action_oid_offset, outlet) state = self.get_outlet_field(self.outlet_state_oid_offset, outlet) if self.actions[int(action)] == 'none' or \ self.actions[int(action)] == self.states[int(state)]: logger.warn("No need to execute the action: {}".format( self.actions[int(action)])) return # restore the action default to "none" if self.actions[int(action)] == 'on': # 'on' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 5) status = self.__node_control_handler.power_on_node( datastore, vmname) elif self.actions[int(action)] == 'off': # 'off' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 4) status = self.__node_control_handler.power_off_node( datastore, vmname) elif self.actions[int(action)] == 'reboot': # 'off' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 8) status = self.__node_control_handler.reboot_node(datastore, vmname) # 'on' state self.set_outlet_field(self.outlet_state_oid_offset, outlet, 5) else: logger.error("Unknown action: {0}".format(action)) return if status != 0: logger.error("Failed to {0} virtual node.".format( self.actions[int(action)])) return self.set_outlet_field(self.outlet_action_oid_offset, outlet, 0)
def handle_message(self, message): logger.info("Got new message {0}".format(message)) oid = message.split()[0] outlet = oid.split('.')[-1] value = message.split()[1] if oid.startswith(self.outlet_action_oid_offset): self.add_task("handle outlet {0}".format(outlet), self.handle_outlet, int(outlet), value) else: logger.warn("{0} is not handled now.".format(message))
def send(self, group_id, user, message, html=None): msg = message if user: msg = message + "\n@" + user r = self.send_group_msg(group_id, msg) if not r: logger.warn("CoolQ调用API失败") self.__send_html(group_id, user, html)
def removeheader(self,key): try: self.session.headers.pop(key) # logger.debug(self.session.headers) self.write.write(self.write.row, self.write.clo, 'PASS') self.write.write(self.write.row, self.write.clo + 1, self.session.headers) except Exception as e: logger.warn("warn:没有可删除的头") self.write.write(self.write.row, self.write.clo, 'PASS') self.write.write(self.write.row, self.write.clo + 1, 'warn:没有可删除的头')
def handle_outlet(self, args): outlet = args[0] action = args[1] logger.info("handle outlet {0}/{1}, action: {2}". format(outlet, self.pdu, self.actions[int(action)])) on_offset = self.pduouton_oid_offset + "." + str(self.to_oid_pdu(self.pdu)) action_in_oid = self.extract(self.get_outlet_field(on_offset, outlet)) logger.warn("action: {0}, action_in_oid: {1}". format(self.actions[int(action)], self.actions[int(action_in_oid)])) vmname = self.__node_control_handler.get_node_name(int(self.pdu), int(outlet)) if vmname is None: logger.error("No virtual node found for outlet {0}".format(outlet)) return datastore = self.__node_control_handler.get_node_datastore(vmname) if datastore is None: logger.error("No datastore found for virtual node {0}". format(vmname)) return # Make sure the action as the last one logger.info("last action: {0}, current action: {1}". format(self.action_list[int(outlet) - 1], self.actions[int(action)])) if self.action_list[int(outlet) - 1] == self.actions[int(action)]: logger.warn("No need to execute action for {0}/{1}". format(outlet, self.pdu)) return if self.actions[int(action)] == 'on': status = self.__node_control_handler.power_on_node(datastore, vmname) elif self.actions[int(action)] == 'off': status = self.__node_control_handler.power_off_node(datastore, vmname) elif self.actions[int(action)] == 'reboot': status = self.__node_control_handler.reboot(datastore, vmname) else: logger.error("Unknown action: {0}".format(action)) if status != 0: logger.error("Failed to {0} virtual node.". format(self.actions[int(action)])) return self.action_list[int(outlet) - 1] = self.actions[int(action)]
def send(self, res): # res, resa = self.compacting(data) now = int(time.time()*1000) logger.info('Monitor results: %s', str(res)) addResults = self.__api.addMonitorResults(self.__monitorId, now, res ) if isinstance(addResults, dict): logger.info('Result.Response: %s', str(addResults)) if 'error' in addResults : if addResults.get('errorCode', 0) == 4 : #Invalid or expired auth token logger.warn('Result.Response: %s; refresh token and try again..', str(addResults)) self.__api.updateAuthToken() addResults = self.__api.addMonitorResults(self.__monitorId, now, res ) else : logger.error('Undefined error: %s', str(addResults))
def handle_message(self, message): oid = message.split()[0] outlet = oid.split('.')[-1] value = message.split()[1] logger.info("Handle message {0}".format(message)) if message.startswith(self.pduouton_oid_offset): self.add_task("handle_outlet-{0}". format(outlet), self.handle_outlet, int(outlet), value) elif message.startswith(self.pduoutpwd_oid_offset): self.add_task("handle_password-{0}". format(outlet), self.handle_password, int(outlet), value) else: logger.warn("{0} is not handled now.".format(message))
def prune_cache (*links): """ Prunes 404ed entries from the internal WebEntity.webcache. This function accepts only links to boards and pages. If no links are given every board on 4chan is checked. """ pool = Pool(num_threads=parameters.num_threads) def work (unit): if isinstance(unit, Thread): return unit logger.info('working %r', unit) for e in unit.process(): pool.push(work, e) return unit if not links: links = all_boards for link in map(classify, links): if isinstance(link, Thread): logger.warn('ignoring %s', link) pool.push(work, link) pool.join() logger.info('Join complete, pruning cache.') live = pool.get_results() pool.close() live = map(lambda alive : alive.apiurl , live) live = map(WebEntity.webcache.url_to_key, live) live = set(live) keys = WebEntity.webcache.keys() keys = filter ( lambda key : key not in live, keys ) for key in keys: logger.info('pruning %s', key) WebEntity.webcache.remove_key(key)
if not filename : logger.critical('Cannot find monitoring file') sys.exit logger.info('monitoring file: '+filename) tm = -1 while True : # watching for changes in monitoring file try : ntm = path.getmtime(filename) except os.error : ntm = -1 if ntm != tm : if tm >= 0 and ntm < 0 : action = 'removed' # elif tm < 0 and ntm >= 0 : # logger.info('new tm = '+str(ntm)) # action = 'created' else : action = 'updated' #or created data = custom.preprocessing(filename, action) if data and len(data) > 0 : custom.send(data) else : logger.warn('No data to send.') tm = ntm time.sleep(1) # watching every second logger.info('FINISHED')
def __call__(self): info("this is info slf4j") error("error=%s" % (grinder.processNumber)) warn("warn=%s" % (grinder.processNumber)) debug("debug=%s" % (grinder.processNumber))