def start_exploit(self, task): """Start exploit network""" try: task_id = self.client.msfpro.start_exploit(task=task) except Exception, ex: Logger.error("Metasploiapi >> start_exploit >> error: " + str(ex)) return None
def __init__(self): """ Manager server connection object """ self.server = settings.config["tool"]["address"].encode("utf8") self.port = settings.config["tool"]["port"] self.token = settings.config["tool"]["token"].encode("utf8") self.uri_base = "/rest_api/v2" # Manager server connection object if settings.config["tool"]["proxy_connect"] == "1": self.manager_server = NetworkConnection( settings.config["tool"]["address"], settings.config["tool"]["port"], is_https=settings.config["tool"]["using_https"], proxies=settings.config["tool"]["http_proxy"]) else: self.manager_server = NetworkConnection( settings.config["tool"]["address"], settings.config["tool"]["port"], is_https=settings.config["tool"]["using_https"]) self.headers = { "token": self.token, "Content-Type": "application/json" } if self.check_service() is True: self.client = MsfRpcClient(self, server=self.server, port=self.port, token=self.token) Logger.info("Metasploit service ready!") else: Logger.error( ">> MetasploitAPI >> CAN NOT LOGIN TO METASPLOIT SERVICE") sys.exit()
def stop(self, task_id): """Stop task with task_id""" try: response = self.client.msfpro.task_stop(task_id=task_id) except Exception, ex: Logger.error("MetasploiApi >> stop >> error: " + str(ex)) return None
def sjoin_noise_values(gdf, noise_layers: dict, log: Logger = None) -> gpd.GeoDataFrame: sample_gdf = gdf.copy() sample_gdf['sample_idx'] = sample_gdf.index for name, noise_gdf in noise_layers.items(): log.debug(f'joining noise layer [{name}] to sampling points') sample_gdf = gpd.sjoin(sample_gdf, noise_gdf, how='left', op='within').drop(['index_right'], axis=1) if (len(sample_gdf.index) > len(gdf.index)): log.warning( f'joined multiple noise values for one or more sampling points ({len(sample_gdf.index)} != {len(gdf.index)})' ) distinct_samples = remove_duplicate_samples(sample_gdf, 'sample_idx', noise_layers) if (len(distinct_samples.index) == len(gdf.index)): log.info('successfully removed duplicate samples') else: log.error('error in removing duplicate samples') if (list(sample_gdf.columns).sort() != list( distinct_samples.columns).sort()): log.error( 'schema of the dataframe was altered during removing duplicate samples' ) return distinct_samples.drop(columns=['sample_idx'])
class Context: """ 上下文关联参数读写 """ def __init__(self): self._cg = configparser.ConfigParser() self._cg.read(constant.context_data_path.encode('utf-8')) self._log = Logger('关联参数').get_logger() def get(self, option): """ 获取参数值 :param option: key :return: value """ if option in self._cg.options(section='DATA'): value = self._cg.get('DATA', option=option) self._log.info('成功获取关联参数:{} = {}'.format(option, value)) return value else: self._log.error('不存在关联参数:{}'.format(option)) def write(self, option, value): """ 把传入的数据写入到文件 :param option: key :param value: value :return: None """ self._cg.set('DATA', option, value) with open(constant.context_data_path, 'w') as fp: self._cg.write(fp) self._log.info('成功写回关联参数:{} = {}'.format(option, value))
def start_export_process(args): args.body = read_request_body() export_filename = get_filename(args.index) line_number = 0 csv_writer = None first_line = True with open(export_filename, 'wb') as json_file: if args.out == 'csv': csv_writer = csv.writer(json_file) for source_data in export_data_from_elasticsearch( args.http, args.index, args.body, args.size, args.skip, args.limit): if source_data: line_number += 1 if args.out == 'json': json_file.write(json.dumps(source_data) + '\n') elif args.out == 'csv': if first_line: first_line = False csv_writer.writerow(tuple(source_data.keys())) try: csv_writer.writerow(tuple(source_data.values())) except Exception as error: Logger.error(u"CSV文件写入出错%s" % error) print u"当前导出数据量%s\r" % line_number, Logger.info(u"导出数据量%d" % (line_number)) out_filename = 'data_list' if args.out == 'csv': out_filename = "%s.csv" % export_filename elif args.out == 'json': out_filename = "%s.json" % export_filename if rename_to_outfile(export_filename, out_filename): os.rename(export_filename, out_filename) Logger.info(u"文件生成成功 %s" % out_filename)
class DataQueue: def __init__(self): self.dataQueue = queue.Queue() self.dv = datavalidator.DataValidator() self.log = Logger().get('database.dataqueue.DataQueue') """we want to check the data here and fail early if the data is good then we want to put it in the data queue we will want another python script for the validations (datavalidator.py) we need to enforce type constraints because the database will not see datavalidator.py""" def insert_into_data_queue(self, value): if not self.dv.run_all_checks(value): self.log.error('--> Validation failed! Unable to add data ' 'into data queue: ' + str(value)) return False try: self.dataQueue.put(value) except queue.Full as e: self.log.critical('Data queue is full!') finally: return True def get_next_item(self): item = self.dataQueue.get() self.dataQueue.task_done() return item def check_empty(self): result = self.dataQueue.empty() return result
def workspace_add(self, worksapce): """Add new workspace""" try: self.client.msfpro.workspace_add(workspace=worksapce) except Exception, ex: Logger.error("Metasploiapi >> workspace_add >> error: " + str(ex)) return False
def test_HuanKuan1(self,exist = False): u"""还款--默认首期""" print("*************执行 还款-默认首期 用例**************") params = Params() try: self.driver.find_element_by_id("rl_repayment").click() #点击首页中的去还款 time.sleep(2) self.driver.find_element_by_id("tv_state").click() #选择第一条数据 time.sleep(2) self.driver.find_element_by_id("tv_repayment").click() #默认首期,直接点击还款 time.sleep(2) self.driver.find_element_by_id("rl_top").click() #跳转到银行卡管理页,选择第一个 time.sleep(8) inputText(self,params['applyPWD']) #输入支付密码 time.sleep(8) exist=is_resultActivity(self) #判断是否成功跳转到了还款成功页 except: exist = False #获取当前方法名作为截图名 pic_name = get_current_function_name() #调用截图方法 getScreen(self,pic_name) #写入日志 logger=Logger(logname='log.txt',loglevel="INFO",logger=pic_name).getlog() logger.error(traceback.format_exc()) self.assertEqual(exist, True)
def _set_data_info(self): if self.get_project_name() == 'coco2014': return coco14_data_info elif self.get_project_name() == 'education': return edu_data_info else: log.error("Project name is not found") sys.exit()
def json2xml(json_file, xml_file): if not os.path.exists(json_file): Log.error('Json file: {} not exists.'.format(json_file)) exit(1) xml_dir_name = os.path.dirname(xml_file) if not os.path.exists(xml_dir_name): Log.info('Xml Dir: {} not exists.'.format(xml_dir_name)) os.makedirs(xml_dir_name)
def load_file(json_file): if not os.path.exists(json_file): Log.error('Json file: {} not exists.'.format(json_file)) exit(1) with open(json_file, 'r') as read_stream: json_dict = json.load(read_stream) return json_dict
def __init__(self): if settings.check_config() is False: Logger.error("Metasploit_observer >> observe >> error config ") sys.exit() self.web_api = WebServiceAPI() self.thread = MyThreadPool( settings.config["application"]["num_thread"]) self.notify = {} self.time_wait = settings.config["application"]["time_wait"]
def xml2json(xml_file, json_file): if not os.path.exists(xml_file): Log.error('Xml file: {} not exists.'.format(xml_file)) exit(1) json_dir_name = os.path.dirname(json_file) if not os.path.exists(json_dir_name): Log.info('Json Dir: {} not exists.'.format(json_dir_name)) os.makedirs(json_dir_name)
class Assertions: def __init__(self): self.logger = Logger(logger="Assertions").getlog() def assert_code(self, code, expected_code): try: assert code == expected_code return True except: self.logger.error( "statusCode error, expected_code is %s,statusCode %s" % (expected_code, cade)) raise def assert_body(self, body, body_msg, expected_msg): try: msg = body[body_msg] assert msg == expected_msg return True except: self.logger.error( "Response body msg != expected_msg, expected_msg is %s, body_msg is %s" % (expected_msg, body_msg)) raise def assert_in_text(self, body, expected_msg): try: text = json.dumps( body, ensure_ascii=False) #转换为json格式,ensure_ascii=False:中文可读 assert expected_msg in text return True except: self.logger.error( "Response body Dose not contain expected_msg,expected_msg is %s" % expected_msg) raise def assert_text(self, body, expected_msg): try: assert body == expected_msg return True except: self.logger.error( "Response body != expected_msg,expected_msg is %s, body is %s" % (expected_msg, body)) raise def assert_time(self, time, expected_time): try: assert time == expected_time return True except: self.logger.error( "Response time > expected_time, expected_time is %s, time is %s" % (expected_time, time)) raise
def validate_port_number(givenStr): log = Logger().get('reportserver.manager.utilities') log.debug("given str is: " + givenStr) try: return int(givenStr) except Exception as e: log.error("Error: Received invalid string to convert to int: " + givenStr) log.error (str(e)) return None
def rename_to_outfile(source_filename, target_filename): random_string = ''.join( random.sample(string.ascii_letters + string.digits, 8)) try: if os.path.exists(target_filename): os.rename(target_filename, "%s.%s.bak" % (random_string, target_filename)) except Exception as error: Logger.error(u"文件名修改错误 %s" % error) return False return True
def get_date_delta(iso_date_from, iso_date_to): try: date_from = dateutil.parser.parse(iso_date_from) date_to = dateutil.parser.parse(iso_date_to) delta = date_to - date_from except Exception as e: log = Logger().get('reportserver.manager.utilities') log.error("Error: " + str(e)) delta = 0 return str(delta)
def test_reset_pwd(self): u'''忘记密码''' print("*************执行忘记密码用例**************") params = Params() try: self.driver.find_element_by_id("iv_head").click() #点击头像到个人中心页 time.sleep(2) self.driver.find_element_by_id("rl_top").click() #点击个人中心页中的登录,跳转到登录页 time.sleep(2) self.driver.find_element_by_id('tv_forgetpwd').click() #跳转到登录页,点击忘记密码 time.sleep(2) #异常情况 self.driver.find_element_by_id('et_phonenum').send_keys(params['phone']) #输入手机号,其他不输入 self.driver.find_element_by_id('tv_queren_reset').click() #点击确认重置 time.sleep(2) self.driver.find_element_by_id('et_phonenum').send_keys(params['phone']) #输入手机号 self.driver.find_element_by_id('tv_getAuthCode').click() #获取短信验证码 sms_yanzhengma = input("请输入短信验证码:") #手动输入 time.sleep(8) self.driver.find_element_by_id('et_authcode').send_keys(sms_yanzhengma) #脚本自动输入短信验证码 time.sleep(2) self.driver.find_element_by_id('et_pwd').send_keys(params['loginPWD']) #输入密码 time.sleep(2) self.driver.find_element_by_id('et_queren_pwd').send_keys("111111") #再次输入密码不一致 self.driver.find_element_by_id('tv_queren_reset').click() #点击确认重置 #正确情况 self.driver.find_element_by_id('et_phonenum').send_keys(params['phone']) #输入手机号 self.driver.find_element_by_id('tv_getAuthCode').click() #获取短信验证码 sms_yanzhengma = input("请输入短信验证码:") #手动输入 time.sleep(8) self.driver.find_element_by_id('et_authcode').send_keys(sms_yanzhengma) #脚本自动输入短信验证码 time.sleep(2) self.driver.find_element_by_id('et_pwd').send_keys(params['loginPWD']) #输入密码 time.sleep(2) self.driver.find_element_by_id('et_queren_pwd').send_keys(params['loginPWD']) #再次输入密码 self.driver.find_element_by_id('tv_queren_reset').click() #点击确认重置 exist = False try: self.driver.find_element_by_id('tv_queren_reset').click() #判断是否还存在确认按钮,确认是否成功修改 print("输入密码有误") exist = True except Exception as e: pass except: exist = True pic_name = get_current_function_name() #获取当前用例名 getScreen(self,pic_name) #调用截图方法 logger=Logger(logname='log.txt',loglevel="INFO",logger=pic_name).getlog() logger.error(traceback.format_exc()) self.assertEqual(exist, False) #修改失败,确认按钮存在
def get_new_scan(self, tool_name): if tool_name is not None: uri = "/scans/new/?tool=" + str(tool_name) response = self.manager_server.connect("GET", uri, headers=self.headers) if response.status_code == 200: return response.json() else: Logger.error( "web_service_api >> get_newscan >> error: cannot found tool_name" )
def get_ckpt(self): ckpt_dir = glob.glob( os.path.join(self.get_backup_path(), self.net_info['ckpt'] + '.*')) if not len(ckpt_dir): log.error("{} is not found".format(ckpt_dir)) sys.exit() if len(ckpt_dir) != 1: log.error("File {} conflict!".format(self.net_info['ckpt'])) sys.exit() ckpt_dir = ckpt_dir[0] log.info(">>> loading ckpt from '{}'".format(ckpt_dir)) return ckpt_dir
def test_credit_addCard(self): u'''授信''' print("*****************执行授信用例****************") params = Params() self.driver.find_element_by_id("tv_apply").click() #点击马上申请 try: self.driver.find_element_by_id("tv_id_verify").click() #点击实名认证 time.sleep(2) self.driver.find_element_by_id("et_cardusername").send_keys( params['username']) #输入持卡人姓名 self.driver.find_element_by_id("et_idnum").send_keys( params['ID']) #输入身份证号 time.sleep(2) exist = False while exist == False: self.driver.find_element_by_id( "et_bankcardnum").click() #输入银行卡号,4位一个空格 input_text.inputText(self, params['cardNumber']) #调用了延时方法输入 self.driver.find_element_by_id("et_phone").send_keys( params['phone']) #输入手机号 self.driver.find_element_by_id("tv_next").click() #点击下一步 time.sleep(2) try: self.driver.find_element_by_id( "et_idnum").click() #输入银行卡信息有误 print("输入银行卡信息有误") self.driver.find_element_by_id("iv_delete_idcard").click() time.sleep(2) except: exist = True sms_yanzhengma = input("请输入短信验证码:") #输入手机验证码 time.sleep(8) self.driver.find_element_by_id("et_authcode").send_keys( sms_yanzhengma) self.driver.find_element_by_id('tv_next').click() #点击下一步 time.sleep(15) try: self.driver.find_element_by_id("tv_complete").click() #点击跳过按钮 exist = False except: print("短信验证码有误") except: print("授信失败") pic_name = get_current_function_name() #获取当前方法名作为截图名 get_screen.getScreen(self, pic_name) #调用截图方法 logger = Logger(logname='log.txt', loglevel="INFO", logger=pic_name).getlog() logger.error(traceback.format_exc()) #写入日志 self.assertEqual(exist, False)
class DatabaseHandler: def __init__(self): self.global_config = GlobalConfig() self.db_path = self.global_config['Database']['path'] self.log = Logger().get('reportserver.dao.DatabaseHandler.DatabaseHandler') # Connect to given database. # Defaults to the honeypot db, but another path can be passed in (mainly for testing). # Database needs to exist first. def connect(self, database_name): if (database_name == None): database_name = self.db_path if not os.path.exists(database_name): self.log.error("Database does not exist in path: " + database_name) return None try: conn = sqlite3.connect(database_name) except sqlite3.OperationalError: self.log.error("Problem connecting to database at: " + database_name) else: return conn # Query DB and return JSON def query_db(self, query, args=(), one=False, db=None): #print ("#debug args are: " +str(args)) cur = self.connect(db).cursor() cur.execute(query, args) r = [dict((cur.description[i][0], value) \ for i, value in enumerate(row)) for row in cur.fetchall()] cur.connection.close() return (r[0] if r else None) if one else r # Unit of Measure could be "weeks", "days", "hours", "minutes". # Return all data from the DB within that measure of time as JSON. def get_json_by_time(self, portnumber, uom, units): begin_date_iso = dateTimeUtility.get_begin_date_iso(uom, units) tableName = self.global_config.get_plugin_config(portnumber)['table'] date_time_field = self.global_config.get_db_datetime_name() # query = query_db("SELECT * FROM %s where (datetime > '%s')" % (tableName, query_date_iso)) queryString = "SELECT * FROM %s where %s >= '%s' order by id, %s" % (tableName, date_time_field, begin_date_iso, date_time_field) #args = (tableName, date_time_field, begin_date_iso) self.log.info("queryString is: " + str(queryString)) #print ("args to use: " + str(args)) results = self.query_db(queryString) self.log.debug("results: " + str(results)) return results
class DataCompare: """ 预期结果和实际结果比对,返回比对结果 """ def __init__(self): self._log = Logger('测试结果比对').get_logger() # 存放比对结果 self._compare_result = [] def compare(self, excepted, response): """ 递归比对,注:第一个参数是预期结果 :param excepted: 预期结果dict :param response: 实际结果dict :return: 若存在结果不一致的,返回每一个键对应的比对结果元组列表;否则返回空列表 """ if excepted == {}: return self._compare_result if type(excepted) != type(response) and (excepted and response is not None): self._log.error('预期结果格式错误,无法比对:{}'.format(excepted)) return None if isinstance(excepted, dict): if isinstance(response, dict): for key in excepted: self.compare(excepted[key], response[key]) else: self.compare(str(excepted), str(response)) elif isinstance(excepted, list) and isinstance(response, list): if excepted and response: if isinstance(excepted[0], dict): self.compare(excepted[0], response[0]) else: for e, r in zip(excepted, response): self.compare(e, r) else: self.compare(str(excepted), str(response)) else: try: assert excepted == response, \ '比对结果不一致:excepted "{}" != "{}" actual'.format(excepted, response) except AssertionError as e: self._compare_result.append((excepted, response)) self._log.error(e) return self._compare_result
def export_data_from_elasticsearch(http, index='*', json_body='', size_data=100, from_data=0, limit=10000000): elastic_search_connect = Elasticsearch(http, retry_on_timeout=True, max_retries=3, timeout=3600000) try: body = json.loads(json_body) except Exception as error: Logger.error(u"查询请求body出错%s" % error) body = {} if limit < size_data: size_data = limit Logger.info(u'查询body为 %s' % json.dumps(body)) total_number = elastic_search_connect.count(index=index, body=body) Logger.info(u"数据总量为 %d" % int(total_number['count'])) if not body.has_key('size'): body['size'] = size_data if not body.has_key('from'): body['from'] = from_data else: body['from'] = 0 data_number = 0 while True: response = elastic_search_connect.search(index=index, body=body) if len(response['hits']['hits']) > 0: data = response['hits']['hits'] for _source in data: yield _source['_source'] data_number += 1 if data_number == limit: break else: body['from'] += size_data continue break else: break yield None
def test_JieKuan12(self): u"""借款-12期""" params = Params() #点击马上申请 self.driver.find_element_by_id('tv_apply').click() time.sleep(3) try: slideApplyBar(self) #滑动借款条到500 self.driver.find_element_by_id( 'rl_borrow_sence').click() #选择借款场景:家用电器 self.driver.find_element_by_id('tv_sence').click() self.driver.find_element_by_id('rl_num_periods').click() #借款周期 self.driver.find_element_by_xpath( '//android.widget.ListView/android.widget.LinearLayout[3]/android.widget.TextView' ).click() #选了分12期的 time.sleep(8) edu = self.driver.find_element_by_id( 'com.ibeesaas.tianbaodai:id/tv_borrow_num').text #获取额度 num_edu = int(edu) if num_edu >= 500: self.driver.find_element_by_id( 'tv_borrow_immedia').click() #点击马上借 time.sleep(3) inputText(self, params['applyPwd']) #加了延时输入 time.sleep(8) exist = is_resultActivity(self) #判断是否成功跳转到借款成功页 else: exist = False self.driver.find_element_by_id( 'tv_borrow_immedia').click() #点击马上借 print(u"额度小于500,无法借款") except: exist = False #获取方法名作为截图名 pic_name = get_current_function_name() #调用截图方法 getScreen(self, pic_name) #写入日志 logger = Logger(logname='log.txt', loglevel="INFO", logger=pic_name).getlog() logger.error(traceback.format_exc()) self.assertEqual(exist, True)
def test_UpdateLogin(self): u"""修改登录密码""" print("*************执行修改登录密码用例**************") params = Params() self.driver.find_element_by_id("iv_head").click() #点击进入个人中心页 self.driver.find_element_by_id("rl_pwd_manage").click() #点击密码管理 try: self.driver.find_element_by_id("rl_reset_loginpwd").click() #点击修改登录密码 #异常情况 self.driver.find_element_by_id("tv_confimchange").click() #不输入,点击确认修改 time.sleep(2) self.driver.find_element_by_id("et_originpwd").send_keys(params['loginPWD']) # #输入原密码 self.driver.find_element_by_id("et_pwd").send_keys(params['loginPWD']) #输入新密码 self.driver.find_element_by_id("et_queren_pwd").send_keys("111111") #再次输入 不一致新密码 self.driver.find_element_by_id("tv_confimchange").click() #点击确认修改 time.sleep(2) #正常情况 self.driver.find_element_by_id("et_originpwd").send_keys(params['loginPWD']) # #输入原密码 time.sleep(2) self.driver.find_element_by_id("et_pwd").send_keys(params['loginPWD']) #输入新密码 time.sleep(2) self.driver.find_element_by_id("et_queren_pwd").send_keys(params['loginPWD']) #再次输入新密码 self.driver.find_element_by_id("tv_confimchange").click() #点击确认修改 time.sleep(2) exist = False try: self.driver.find_element_by_id("tv_confimchange").click() #点击确认修改 exist = True except: pass except: exist = True pic_name = get_current_function_name() #调用截图方法 getScreen(self,pic_name) #写入日志 logger=Logger(logname='log.txt',loglevel="INFO",logger=pic_name).getlog() logger.info("*************执行修改登录密码用例**************") logger.error(traceback.format_exc()) self.assertEqual(exist,False) #已跳转,不在修改页
def __list_dirs(self, root_dir): img_list = list() json_list = list() image_dir = os.path.join(root_dir, 'image') json_dir = os.path.join(root_dir, 'json') img_extension = os.listdir(image_dir)[0].split('.')[-1] for file_name in os.listdir(json_dir): image_name = '.'.join(file_name.split('.')[:-1]) img_list.append( os.path.join(image_dir, '{}.{}'.format(image_name, img_extension))) json_path = os.path.join(json_dir, file_name) json_list.append(json_path) if not os.path.exists(json_path): Log.error('Json Path: {} not exists.'.format(json_path)) exit(1) return img_list, json_list
def observe(self): while True: new_task = self.web_api.get_new_scan(self.web_api.tool_name) if type(new_task) is not type([]): time.sleep(self.time_wait) Logger.error( "Metasploit_observer >> observe >> response not type demand" ) continue try: for task in new_task: if "id" in task: # update status self.thread.add_task(self.create_scan(task)) except Exception, ex: message = u" Error appear when scanning " Logger.error("Metasploit_observer >> observe >> error : " + str(ex)) self.web_api.post_notify(message, 1) time.sleep(self.time_wait)
def test_JieKuan3(self): u"""借款-3期""" params = Params() print("*************执行借款用例**************") self.driver.find_element_by_id('tv_apply').click() #点击马上申请 time.sleep(3) try: slideApplyBar(self) #滑动借款条到500 self.driver.find_element_by_id('rl_borrow_sence').click() #选择借款场景 self.driver.find_element_by_id('tv_sence').click() #家用电器 self.driver.find_element_by_id('rl_num_periods').click() #借款周期 self.driver.find_element_by_id('tv_sence').click() #选了分3期的 time.sleep(8) edu = self.driver.find_element_by_id('tv_borrow_num').text #获取借款额度 num_edu = int(edu) if num_edu >= 500: self.driver.find_element_by_id( 'tv_borrow_immedia').click() #点击马上借 time.sleep(3) inputText(self, params['applyPwd']) #输入支付密码,加了延时输入 time.sleep(8) exist = is_resultActivity(self) #判断是否成功跳转到借款成功页 else: exist = False self.driver.find_element_by_id( 'tv_borrow_immedia').click() #点击马上借 print(u"额度小于500,无法借款") except: exist = False #获取当前方法名作为截图名 pic_name = get_current_function_name() #调用截图方法 getScreen(self, pic_name) #写入日志 logger = Logger(logname='log.txt', loglevel="INFO", logger=pic_name).getlog() logger.error(traceback.format_exc()) self.assertEqual(exist, True)
def test_HuanKuan2(self,exist = False): u"""还款--多期(全部还款)""" params = Params() print("*************执行 还款-多期全部还款 用例**************") try: self.driver.find_element_by_id("rl_repayment").click() #点击首页中的去还款 time.sleep(2) self.driver.find_element_by_id("tv_state").click() #选择第一条数据 self.driver.find_element_by_id('ll_zoom').click() #选择多期 swipeUp(self,1200) #往上拉页面 eles = self.driver.find_elements_by_xpath('//android.widget.ListView/android.widget.LinearLayout') #获取所有期数 if len(eles) == 12: #12期 print("12期") self.driver.find_element_by_xpath('//android.widget.ListView/android.widget.LinearLayout[12]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView').click() elif len(eles) ==6: #6期 print("6期") ele = self.driver.find_element_by_xpath('//android.widget.ListView/android.widget.LinearLayout[6]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView').click() else: #3期 print("3期") ele = self.driver.find_element_by_xpath('//android.widget.ListView/android.widget.LinearLayout[3]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView').click() swipeUp(self,1000) #往上滑动页面,定位还款按钮 self.driver.find_element_by_id("tv_repayment").click() # 点击还款 time.sleep(2) self.driver.find_element_by_id("rl_top").click() #跳转到银行卡管理页,选择第一个 time.sleep(8) inputText(self,params['applyPWD']) #输入支付密码 time.sleep(8) exist = is_resultActivity(self) #判断是否成功 except: exist = False #获取当前方法名作为截图名 pic_name = get_current_function_name() #调用截图方法 getScreen(self,pic_name) #写入日志 logger=Logger(logname='log.txt',loglevel="INFO",logger=pic_name).getlog() logger.error(traceback.format_exc()) self.assertEqual(exist, True)
def test_UpdatePay(self): u"""修改支付密码""" print("*************执行修改支付密码用例**************") params = Params() self.driver.find_element_by_id("iv_head").click() self.driver.find_element_by_id("rl_pwd_manage").click() #点击密码管理 try: self.driver.find_element_by_id('tv_changeTranPwd').click() #点击修改支付密码 self.driver.find_element_by_id('tv_getAuthCode').click() #点击获取支付密码 zf_pwd = input("请输入短信验证码:") #需要手动输入 time.sleep(8) self.driver.find_element_by_id('et_authcode').send_keys(zf_pwd) self.driver.find_element_by_id('tv_next').click() #点击下一步 time.sleep(2) try: #输入支付密码 inputText(self,params['applyPWD']) #延时输入 time.sleep(2) inputText(self,params['applyPWD']) #再次确认输入 time.sleep(2) except: pass exist = False try: self.driver.find_element_by_id("inputView").click() #输入框是否隐藏 exist = True except: print("两次输入不一致") pass except: exist = True pic_name = get_current_function_name() #获取方法名 getScreen(self,pic_name) #调用截图方法 #写入日志 logger=Logger(logname='log.txt',loglevel="INFO",logger=pic_name).getlog() logger.info("*************执行修改支付密码用例**************") logger.error(traceback.format_exc()) self.assertEqual(exist,False) #已跳转,不在修改页
def login(self): data = { "email": settings.config["user"]["email"], "password": settings.config["user"]["password"] } try: r = self.manager_server.connect("POST", "/auth/login/", data=json.dumps(data)) Logger.info("Before login") if r.status_code == 200: user_info = r.json() if "one-token" in user_info: self.token = user_info["one-token"] self.headers = { "one-token": self.token, "Content-Type": "application/json" } Logger.info("Login Successful!") return r except Exception, ex: Logger.error(" web_service_api >> login >> error " + str(ex))
class ReadLocator: """ 所有定位器写在yaml文件中,实例化此类调用read()方法读取 :param filename: yaml文件名 :param page_number: 页数,yaml文件使用‘---’分割页数 """ def __init__(self, filename: str, page_number: int): self._filename = filename if not self._filename.endswith('.yaml'): self._filename = filename + '.yaml' self._page_number = page_number self._all_result = self._read_all_page() self._log = Logger('读取定位器').get_logger() def _read_all_page(self): """ 读取指定页全部数据 :return: 指定页全部数据 """ path = os.path.join(constant.yaml_path, self._filename) with open(path, encoding='utf-8') as fp: reader = fp.read() all_result = yaml.load_all(reader, Loader=yaml.FullLoader) return list(all_result)[self._page_number - 1] def read(self, locator_name: str): """ 根据给定名称获取定位器 :param locator_name: 定位器名称 :return: 定位器值 """ locator = self._all_result.get(locator_name) if locator: self._log.debug(f'获取到定位器({locator_name}):{locator}') return locator else: self._log.error('定位器不存在({})!!'.format(locator_name))
class NetworkListener(Thread): def __init__(self, listening_address, config, framework): super().__init__() self._config = config self._listening_address = listening_address self._port = config['port'] self._framework = framework self._session_socket = None self._lock = Lock() self._running = False self.__connection_count = 0 self._logger = Logger().get('framework.networklistener.NetworkListener') @property def connection_count(self): with self._lock: return self.__connection_count @connection_count.setter def connection_count(self, val): with self._lock: self.__connection_count = val # Override def run(self): self._running = True self._logger.info('%s plugin listener started on port %d' % (self._config['moduleClass'], self._port)) while self._running: self._session_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM) self._session_socket.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._session_socket.bind((self._listening_address, self._port)) self._session_socket.listen(1) self.start_listening(self._session_socket) self._session_socket.close() self.connection_count += 1 self._logger.info('%s plugin listener on port %d shutting down' % (self._config['moduleClass'], self._port)) self._session_socket = None def start_listening(self, local_socket): try: (new_socket, addr) = local_socket.accept() if self._running: self._logger.info('New connection from %s on port %d' % (addr, self._port)) self._framework.spawn(new_socket, self._config) except ConnectionAbortedError as e: if not self._running: return raise e except OSError as e: if e.errno == 22 and not self._running: return raise e except Exception as e: self._logger.error('Error on connection: %s' % e) raise e def shutdown(self): self._running = False if self._session_socket: if platform.system() == 'Linux': self._session_socket.shutdown(socket.SHUT_RDWR) else: self._session_socket.close() self.join()
class DataValidator: def __init__(self): self.config = GlobalConfig() self.table_schema = {} self.tables = [] self.log = Logger().get('database.datavalidator.DataValidator') self.get_schema_from_database() # for updating tables and table schema class variables def update_tables_and_schema(self): self.table_schema.clear() self.tables.clear() self.get_schema_from_database() def get_schema_from_database(self): connection = sqlite3.connect(self.config['Database']['path']) cursor = connection.cursor() #will want to loop here through all tables found and store each schema #as an element in a list, this will require code changes throughout this file db_rows = cursor.execute( "SELECT name " "FROM sqlite_master " "WHERE type = 'table';").fetchall() #transform list of tuples to a list of strings for row in db_rows: self.tables.append(row[0]) for table in self.tables: table_def = cursor.execute('PRAGMA table_info(' + table + ');').fetchall() self.table_schema[table] = table_def cursor.close() # return the class level variable tables def get_tables(self): return self.tables # return the class level variable table_schema def get_schema(self): return self.table_schema # Ensure exactly one table is written to at a time def check_value_len(self, value): if len(value) != 1: self.log.error('Plugin tried to save ' + str(len(value)) + 'table(s) in one save') return False return True # Checks that the value is actually a dictionary def check_value_is_dict(self, value): if not isinstance(value, dict): self.log.error('Plugin attempted to save non-dictionary type: ' + str(type(value))) return False return True # Checks that the key in the dictionary is a string def check_key_in_dict_string(self, value): key = get_first_key_value_of_dictionary(value) if not isinstance(key, str): self.log.error('Table name must be a string: got ' + str(type(key)) + ' instead') return False return True # Checks that the key in the dictionary is # a real table name in the database def check_key_is_valid_table_name(self,value): table_name = get_first_key_value_of_dictionary(value) if table_name not in self.tables: self.log.error('No such table: ' + table_name) return False return True # Checks that the row data is actually a dictionary def check_row_value_is_dict(self,value): key = get_first_key_value_of_dictionary(value) if not isinstance(value.get(key), dict): self.log.error('Row data must be a dictionary: got ' + str(type(value.get(key))) + ' instead') return False return True #checks that all of the keys in the row data are strings def check_all_col_names_strings(self,value): key = get_first_key_value_of_dictionary(value) dict = value.get(key) count = len(dict.keys()) compare = 0 for key in dict.keys(): if isinstance(key,str): compare += 1 return count == compare # Verifies that no additional columns were provided by a # plugin that aren't referred to in the database schema. def check_all_col_exist(self, value): key = get_first_key_value_of_dictionary(value) schema = self.table_schema[key] # remove default columns because we do not require the plugin author # to provide these schema_col_list = remove_default_columns_from_list([row[1] for row in schema]) # get a list of column names from the table referenced in value prep_list = remove_default_columns_from_list(value[key]) col_list = list(prep_list.keys()) extra_cols = set(col_list) - set(schema_col_list) if len(extra_cols) > 0: self.log.error('Unknown column(s) in table \'' + key + '\': ' + str(extra_cols)) return False return True # TODO determine how to do this with regex def check_data_types(self, value): return True def run_all_checks(self, value): return (self.check_value_len(value) and self.check_value_is_dict(value) and self.check_key_in_dict_string(value) and self.check_key_is_valid_table_name(value) and self.check_row_value_is_dict(value) and self.check_all_col_names_strings(value) and self.check_all_col_exist(value) and self.check_data_types(value))
class P0fAgent(Thread): def __init__(self, peer_address, framework, session): super().__init__() self.config = GlobalConfig() self.framework = framework self.fs_sock = self.config['Framework']['p0f.fs_sock'] self.log = Logger().get('recon.p0fagent.P0fAgent') self.peer_address = peer_address self.session = session def run(self): p0f = P0f(self.fs_sock) peer_info = None try: peer_info = p0f.get_info(self.peer_address) except P0fException as e: self.log.warn('p0f request failed for ' + self.peer_address + ': ' + str(e)) return except KeyError as e: self.log.warn('p0f couldn\'t find any info for ' + self.peer_address) return except ValueError as e: self.log.warn('p0f returned bad data for ' + self.peer_address) return except FileNotFoundError as e: self.log.error('p0f filesystem socket not found') return except Exception as e: self.log.error('unknown p0f error occurred on address ' + self.peer_address + ': ' + str(e)) return # prettify C/null-terminated byte arrays in p0f info dict for key in peer_info.keys(): if type(peer_info[key]) == bytes: decoded = peer_info[key].decode('utf-8') peer_info[key] = decoded.partition('\x00')[0] elif type(peer_info[key]) == datetime: peer_info[key] = peer_info[key].isoformat() elif type(peer_info[key]) == timedelta: peer_info[key] = str(int(peer_info[key].total_seconds())) elif type(peer_info[key]) == int: peer_info[key] = str(peer_info[key]) data = { 'p0f': { 'session': self.session, 'first_seen': peer_info['first_seen'], 'last_seen': peer_info['last_seen'], 'uptime': peer_info['uptime'], 'last_nat': peer_info['last_nat'], 'last_chg': peer_info['last_chg'], 'distance': peer_info['distance'], 'bad_sw': peer_info['bad_sw'], 'os_name': peer_info['os_name'], 'os_flavor': peer_info['os_flavor'], 'os_match_q': peer_info['os_match_q'], 'http_name': peer_info['http_name'], 'http_flavor': peer_info['http_flavor'], 'total_conn': peer_info['total_conn'], 'link_type': peer_info['link_type'], 'language': peer_info['language'] } } self.framework.insert_data(data) self.log.debug('p0f info for ' + self.peer_address + ': ' + str(peer_info))