def wireshark_capture_packet_success(self, flag_pid): """ 功能描述: 成功抓到报文关键字执行成功,报文为空,关键字执行失败.\n 参数:\n flag_pid: Start WireShark Capture关键字执行成功后的返回值 返回值:无 Example: | Wireshark Capture Packet Success | ${flag_pid} | """ ret = None cls = self._current_remotelocal() if (isinstance(cls, Remote)): ret = auto_do_remote(cls) else: ret = cls.wireshark_capture_success(flag_pid) if IS_LOCAL and ret == WIRESHARK_NO_STOP: str_data = u"抓包服务器未停止,开始自动停止抓包服务器!" log.user_warn(str_data) self.stop_wireshark_capture(flag_pid) self.wireshark_capture_packet_success(flag_pid) else: return ret
def set_wireshark_install_path(self, wireshark_install_path=""): """ 功能描述:设置抓包电脑上wireshark的安装路径: 参数:file_path: wireshark软件的安装路径 """ ret = WIRESHARK_FAIL if not wireshark_install_path: str_data = u"设置wirershark路径为空!" else: temp_wireshark_install_path = join(wireshark_install_path, "tshark.exe") if isfile(temp_wireshark_install_path): ret = WIRESHARK_SUCCESS self.wireshark_install_path = wireshark_install_path str_data = u"设置wirershark路径 %s 成功!" % wireshark_install_path else: str_data = u"设置wirershark路径 %s 不合法!" % wireshark_install_path if ret == WIRESHARK_FAIL: err_info = u"%s 将采用默认的wireshark安装路径!" % str_data log.user_warn(err_info) self.wireshark_install_path = self._get_default_install_path() else: log.user_info(str_data)
def del_file_in_ftp_client(self, filename): """ 功能描述:删除客户端本地的文件 参数: filename: 表示要删除的文件名 返回值:无,如果删除文件失败,则抛出错误 Example: | del_file_in_ftp_client | test.txt | 注意:如果文件不存在,则关键字认为是成功的;如果是文件夹,则关键字认为是失败的。 """ # Change by jxy ,3013/3/20,增加参数合法性判断 if type(filename) is str: pass elif type(filename) is unicode: pass else: raise RuntimeError(u"传入的参数不是单个文件名,请传入单个文件名!") if not os.path.exists(filename): log.user_warn(u"不存在文件: %s" % filename) return if os.path.isdir(filename): raise RuntimeError(u"%s 是文件夹,请勿使用此关键字删除." % filename) try: os.remove(filename) log.user_info(u"删除本地文件:%s 成功." % filename) except Exception, e: raise RuntimeError(u"删除本地文件:%s 失败." % filename)
def removedir_in_ftp_client(self, dirname): """ 功能描述:删除客户端本地的文件夹 参数: dirname:表示要删除的文件夹名 返回值:无,如果删除文件夹失败,则抛出错误。 Example: | removedir_in_ftp_client | test | 注意:如果文件夹不存在,则关键字认为是成功的;如果是文件,则关键字认为是失败的。 """ if not os.path.exists(dirname): log.user_warn(u"不存在文件夹: %s" % dirname) return if os.path.isfile(dirname): raise RuntimeError(u"%s 是文件,请勿使用此关键字删除." % dirname) try: os.rmdir(dirname) log.user_info(u"删除本地文件夹:%s 成功." % dirname) except Exception, e: raise RuntimeError(u"删除本地文件夹:%s 失败." % dirname)
def stop_wireshark_capture(self, flag_pid): """ 功能描述: 停止当前网卡设备的抓包 参数: flag_pid: Start WireShark 关键字执行成功后的返回值 """ ret = WIRESHARK_SUCCESS ret_data = "" dict_data = self.dict_process_obj.get(flag_pid) if dict_data is None: str_warn = u"没有找到相应抓包服务器%s" % flag_pid log.user_warn(str_warn) ret_data = (None, "") elif dict_data.get("flag_stop"): str_data = u"%s该抓包服务器已停止过" % flag_pid log.user_info(str_data) ret_data = (None, "") else: ret, ret_data = self._stop_wireshark(dict_data) if dict_data and not dict_data.get("flag_stop"): dict_data["flag_stop"] = True self.dict_process_obj.update({flag_pid: dict_data}) return ret, ret_data
def stop_udp_server(self): """ 功能描述:停止UDP Server 参数:无 Example: | Stop Udp Server | | | | """ try: obj = self._current_remotelocal() except No_Remote_or_local_Exception: log.user_warn(u"UDP Server未开启,不需要停止!") return if (isinstance(obj, Remote)): auto_do_remote(obj) else: ret, log_data = obj.stop_udp_server() if ret == ATTUDPSERVER_SUC: log.user_info(log_data) else: raise RuntimeError(log_data)
def http_server_close_response_status_code(self): """ 功能描述:关闭状态码响应模块 参数:无 Example: | Http Server Close Response Status Code | """ try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能关闭状态码响应模块!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #关闭状态码响应模块 ret, log_data = cls.close_response_status_code() if ret == ATTTHTTPSERVER_SUC: log.user_info(u'关闭状态码响应模块成功') #log.user_info(log_data) else: log.user_info(u'关闭状态码响应模块失败') raise RuntimeError(log_data)
def http_server_set_client_authorization_type(self,type_string): """ 功能描述:设置客户端认证模式 参数: type_string: 描述认证模式类型的字符串,有效取值为:BASIC或DIGEST,值不区分大小写; 注意: BASIC类型表示只支持BASIC认证;默认客户端认证模式为BASIC类型; DIGEST类型表示只支持DIGEST认证; Example: | Http Server Set Client Authorization Type | BASIC | | Http Server Set Client Authorization Type | DIGEST | """ try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能设置客户端认证模式!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #设置客户端认证模式 ret, log_data = cls.set_client_authorization_type(type_string) if ret == ATTTHTTPSERVER_SUC: log.user_info(u'设置客户端认证模式成功') #log.user_info(log_data) else: log.user_info(u'设置客户端认证模式失败') raise RuntimeError(log_data)
def _stop_wireshark(self, dict_data): """ """ ret = WIRESHARK_SUCCESS ret_data = "" str_data = "" warn_data = "" packet_data = None # 该值设为默认的None是对没有找到包和包为空做区别 popen = dict_data.get("popen") file_path = dict_data.get("file_path") temp_packet_file_path = dict_data.get("temp_packet_file_path") popen_stdout_path = dict_data.get("popen_stdout_path") if popen.poll() == None: ret, str_data = self._stop_popen(popen, popen_stdout_path) else: pass # 读取数据包的数据内容,返回Robot本端 if ret == WIRESHARK_SUCCESS: str_data = u"停止抓包服务器成功" if temp_packet_file_path and exists(temp_packet_file_path): try: with open(temp_packet_file_path, "rb") as obj_file: packet_data = base64.b64encode(obj_file.read()) except Exception, e: warn_data = u"获取抓包文件内容失败!失败信息:%s " % e log.user_warn(warn_data) else: warn_data = u"未找到数据包文件!" log.user_warn(warn_data)
def http_server_close_check_authorization(self): """ 功能描述:关闭用户权限验证 参数:无 Example: | Http Server Close Check Authorization | """ try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能关闭用户权限验证!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #关闭用户权限验证 ret, log_data = cls.close_check_authorization() if ret == ATTTHTTPSERVER_SUC: #log.user_info(log_data) log.user_info(u'关闭用户权限验证模块成功') else: log.user_info(u'关闭用户权限验证模块失败') raise RuntimeError(log_data)
def http_server_unregister_user_account(self,uname): """ 功能描述:注销账户 参数: uname:账户名称,用于唯一标识某一个账户; Example: | Http Server Unregister User Account | user1 | """ #检查账户名称的合法性 temp_uname=copy.deepcopy(uname) if isinstance(uname, unicode): temp_uname=temp_uname.encode('utf-8') try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能注销账户!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #注销用户 ret, log_data = cls.unregister_user_account(uname) if ret == ATTTHTTPSERVER_SUC: #log.user_info(u'注销访问HTTP服务器账号成功') log.user_info(log_data) else: log.user_info(u'注销访问HTTP服务器账号失败') raise RuntimeError(log_data)
def stop_http_server(self): """ 功能描述:停止HTTP服务器 参数:无 Example: | Stop Http Server | """ try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不需要停止!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #停止HTTP服务器 ret, log_data=cls.stop_httpservet() if ret == ATTTHTTPSERVER_SUC: log.user_info(u"停止HTTP服务器成功") else: log.user_info(u"停止HTTP服务器失败") raise RuntimeError(log_data)
def set_tcp_src_addr(self, port, ip="0.0.0.0"): """ 功能描述:设置tcp报文的源IP和源端口,在需要指定发送报文的源端口时使用 参数: port: 发送的TCP报文的源端口 ip: 发送的TCP报文的源IP, 默认为"0.0.0.0" Example: | Set Tcp Src Addr | 50000 | | | Set Tcp Src Addr | 50000 | 10.10.10.10 | """ # 检查IP地址合法性 if not check_ipaddr_validity(ip): raise RuntimeError(u"关键字执行失败,IP地址为非法地址!") # 检查port端口合法性 ret, ret_str = check_port(port) if ret == ATTCOMMONFUN_FAIL: raise RuntimeError(ret_str) try: obj = self._current_remotelocal() except No_Remote_or_local_Exception: log.user_warn(u"TCP Client未初始化,不能设置源地址!") return if (isinstance(obj, Remote)): auto_do_remote(obj) else: obj.set_tcp_src_addr(port, ip)
def _get_packet_file_path(self, tuple_data): """ 功能描述:获取默认的抓包文件保存的路径 参数:tuple_data (prefix, file_path) 返回:file_path or error_message """ ret = FLAG_SUCCEED ret_data = "" prefix = tuple_data[0] file_path = tuple_data[1] for i in [1]: try: # 根据用户输入组建文件名 file_name = "%s_%s.pcap" % (prefix, get_time_stamp()) # 对用户输入的文件路径做检查 if isdir(file_path): file_path = join(file_path, file_name) elif isfile(file_path): file_path = join(dirname(file_path), file_name) elif file_path == "default": pass else: try: drive_name = os.path.splitdrive(file_path)[0] if exists(drive_name): os.mkdir(file_path) str_data = u"输入的路径不存在,创建新的目录 %s 成功!" % file_path file_path = join(file_path, file_name) else: str_data = u"输入的路径 %s 盘符不合法或者没有包含盘符,将使用默认路径!" % file_path log.user_warn(str_data) file_path = "default" except Exception, e: err_info = u"输入的路径 %s 不存在,创建新目录失败,失败原因:%s\n将使用默认路径!" % ( file_path, e) log.user_warn(err_info) file_path = "default" if file_path == "default": ret, ret_data = self._get_default_file_path(file_name) except Exception, e: ret = FLAG_FAIL ret_data = u"设置报文文件保存的路径发生异常,错误信息为:%s" % e
def makedir_in_ftp_site(self, dirname): """ 功能描述:在服务器上的新建文件夹。 参数: dirname:目录名 返回值:无,关键字失败则抛出错误 Example: | makedir_in_ftp_site | 测试目录 | 注意:如果服务器上有同名的文件夹存在,则服务器会返回550 exists, 这种情况下关键字认为新建目录也是成功的。 不支持一次新建多个嵌套文件夹,如:test1\test2\test3\ """ #add by jias 20130808 if not self.login: raise RuntimeError(u"请先登录FTP服务器") try: # GCW 20130306 更换ftpserver代码后无须关心编码,替换 # GCW 20130312 更新服务器代码出现远端无法解析K歌.doc的问题,统一处理 tmp_dirname = dirname if not isinstance(dirname, unicode): dirname = dirname.decode('utf-8') else: dirname = dirname.encode('utf-8') ret_info = self.ftp.mkd(dirname) # GCW END log.user_info(u"在FTP服务器上新建文件夹 %s 成功" % tmp_dirname) except Exception, e: # ret = "550 File exists." #兼容172.24.11.10 # ret2 = "550 %s: File exists" % dirname #兼容python版本的FTP服务器 # 为了兼容不同的服务器回复的不一致的情况,采用以下方法 if '550' in e.message and 'exists' in e.message: log.user_warn(u"在FTP服务器上已经存在文件夹:%s ,无须新建!" % tmp_dirname) else: e.message = e.message.decode(self.ftp_server_encode) raise RuntimeError(u"在FTP服务器上新建文件夹:%s 失败。详细信息为:%s" % (tmp_dirname, e.message))
def wireshark_query_option_str_value(self, flag_pid, option_name_or_offset, read_filter=""): """ 功能描述: 查询抓到数据包中某个字段的值 参数:\n flag_pid: Start WireShark Capture关键字执行成功后的返回值\n option_name_or_offset: 所要查询的字段名\n read_filter: 读取过滤器表达式\n 返回值:\n list_data: 查询成功返回列表形式option_name字段值或None Example: | ${list_data} | Wireshark Query Option Str Value | ${flag_pid} | ip.version | tcp | | ${list_data} | Wireshark Query Option Str Value | ${flag_pid} | frame[58:34] | tcp | """ ret = None cls = self._current_remotelocal() if (isinstance(cls, Remote)): ret = auto_do_remote(cls) else: ret = cls.wireshark_query_option_str_value(flag_pid, option_name_or_offset, read_filter) if IS_LOCAL and ret == WIRESHARK_NO_STOP: str_data = u"抓包服务器未停止,开始自动停止抓包服务器!" log.user_warn(str_data) self.stop_wireshark_capture(flag_pid) ret = self.wireshark_query_option_str_value( flag_pid, option_name_or_offset, read_filter) else: pass return ret
def http_server_set_response_status_code(self, status_code): """ 功能描述:设置响应状态码的值 参数: status_code:设置HTTP状态码响应的值; Example: | Http Server Set Response Status Code | 403 | """ #检查状态码的合法性 temp_status_code=copy.deepcopy(status_code) if isinstance(status_code, unicode): temp_status_code=temp_status_code.encode('utf-8') try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能设置响应状态码的值!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #设置状态码的值 ret, log_data = cls.set_response_status_code(status_code) if ret == ATTTHTTPSERVER_SUC: log.user_info(u'设置响应状态码的值成功') #log.user_info(log_data) else: log.user_info(u'设置响应状态码的值失败') if not temp_status_code.isdigit(): log_data=u"设置响应状态码的值失败,状态码响应的值非法!" else: if int(temp_status_code) < 100 or int(temp_status_code)> 600: log_data=u"设置响应状态码的值失败,状态码响应的值非法!" raise RuntimeError(log_data)
def stop_wireshark_capture(self, flag_pid): """ 功能描述: 停止当前网卡设备的抓包 参数:\n flag_pid: Start WireShark Capture关键字执行成功后的返回值 返回值:无 *注意:flag_pid传入为空或者None时不进行关闭动作。 Example: | ${flag_pid} | Start WireShark Capture | | ATT | | Stop WireShark Capture | ${flag_pid} | """ # 当同时开启多个抓包的时候会有抓不到包的情况,如果加1s延时效果好点 zsj2013/12/23 if not self.flag_stop_all: time.sleep(1) cls = self.dict_all_capture_pid_and_cls.get(flag_pid) if not cls: str_warn = u"没有找到相应抓包服务器%s" % flag_pid log.user_warn(str_warn) return if (isinstance(cls, Remote)): ret, ret_data = auto_do_remote(cls) else: ret, ret_data = cls.stop_wireshark_capture(flag_pid) if not IS_LOCAL: # 如果是如果不运行后面的保存文件等,直接返回 return ret, ret_data # 根据停止返回的数据保存抓包文件 if ret == WIRESHARK_SUCCESS: self._save_pcap_file_and_link_file(ret_data) # 删除已关闭的抓包服务器的存储 if self.dict_all_capture_pid_and_cls.get(flag_pid): self.dict_all_capture_pid_and_cls.pop(flag_pid)
def stop_all_ftp_server(self): """ 功能描述:停止所有ftp服务器 参数:无 Example: | Stop All Ftp Server | | | """ alias_list = self.dict_alias.keys() if not alias_list: log.user_warn(u"没有ftp服务器对象,不需要关闭!") return for alias in alias_list: try: self.switch_ftp_server(alias) self.stop_ftp_server() except Exception, e: continue
def stop_ftp_server(self): """ 功能描述:停止ftp服务器 参数:无 Example: | Stop Ftp Server | | | """ try: cls = self._current_remotelocal() except No_Remote_or_local_Exception: #modified by jias #修改为 没初始化实例的时候,调用关闭不报错 log.user_warn(u"FTP服务器未开启,不需要停止!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: cls.stop_ftp_server()
def makedir_in_ftp_client(self, dirname): """ 功能描述:新建客户端本地的文件夹 参数: dirname:表示新建文件夹名 返回值:无,如果新建文件夹失败,则抛出错误。 Example: | makedir_in_ftp_client | test | 注意:不支持一次新建多个嵌套文件夹,如:test1\test2\test3\ """ if os.path.exists(dirname): log.user_warn(u"已存在同名文件夹:%s,无须新建." % dirname) return try: os.mkdir(dirname) log.user_info(u"新建本地文件夹:%s 成功." % dirname) except Exception, e: raise RuntimeError(u"新建本地文件夹:%s 失败." % dirname)
def http_server_set_client_upload_type(self,type_string): """ 功能描述:设置客户端上传模式 参数: type_string: 描述上传模式类型的字符串,有效取值为:POST或PUT或BOTH,值不区分大小写; 注意: POST类型表示只支持POST上传; PUT类型表示只支持PUT上传; BOTH类型表示既支持POST上传也支持PUT上传;默认客户端上传模式为BOTH类型; Example: | Http Server Set Client Upload Type | POST | | Http Server Set Client Upload Type | PUT | | Http Server Set Client Upload Type | BOTH | """ try: cls = self._get_current_object() except No_Remote_or_local_Exception: log.user_warn(u"HTTP服务器未开启,不能设置客户端上传模式!") return if (isinstance(cls, Remote)): auto_do_remote(cls) else: #TODO #设置客户端上传模式 ret, log_data = cls.set_client_upload_type(type_string) if ret == ATTTHTTPSERVER_SUC: log.user_info(u'设置客户端上传模式成功') #log.user_info(log_data) else: log.user_info(u'设置客户端上传模式失败') raise RuntimeError(log_data)
""" 功能描述:停止所有本地和远端的HTTP服务器 参数:无 Example: | Stop All Http Server | """ try: alias_list=self._get_object_alias_list() except Exception, e: error_info=u"停止所有本地和远端的HTTP服务器失败,获取HTTP服务器对象别名列表异常!" raise RuntimeError(error_info) if not alias_list: log.user_warn(u"没有HTTP服务器对象,不需要关闭!") return for alias in alias_list: try: self.switch_http_server(alias) self.stop_http_server() except Exception, e: error_info=u"停止HTTP服务器(alias=%s)失败" % alias raise RuntimeError(error_info) log.user_info(u'停止所有本地和远端的HTTP服务器成功') return def _remote_release_stop_all_http_server(self):
break try: link = utils.get_link_path(path, default_log_path) logger.info("Capture file saved to '<a href=\"%s\">%s</a>'." % (link, path), html=True) err_info = u"链接报文文件到log文件中成功!" log.user_info(err_info) return except Exception, e: err_info = u"在log文件中链接抓包文件发生异常: %s" % e log.user_warn(err_info) def _get_default_log_dir(self): """ 功能描述: 获取默认的log保存路径 参数:无 返回: ret 1 or -1 成功状态码 ret_data log保存路径 or 错误信息 """ ret = FLAG_SUCCEED ret_data = "" try:
(tmp_del_file, ret_info)) except Exception, e: # GCW20130217解决删除查到有文件夹同名,用户误用文件夹名去删除的问题,同时兼容测试网服务器 # e = e.decode(self.ftp_server_encode).encode('utf-8') # raise RuntimeError(u"删除FTP服务器上的文件:%s 异常.错误信息:%s" % (del_file, e)) if '550' in e.message and 'Permission denied' in e.message: raise RuntimeError(u"待删除的 %s 不是一个文件,返回信息:%s " % (tmp_del_file, e)) else: e.message = e.message.decode(self.ftp_server_encode) raise RuntimeError(u"在FTP服务器上删除文件:%s 异常.返回错误信息: %s " % (tmp_del_file, e.message)) else: # 查到服务器上没有此文件,则不用删除 log.user_warn(u"FTP服务器上没有要删除的文件: %s ." % del_file) def makedir_in_ftp_site(self, dirname): """ 功能描述:在服务器上的新建文件夹。 参数: dirname:目录名 返回值:无,关键字失败则抛出错误 Example: | makedir_in_ftp_site | 测试目录 | 注意:如果服务器上有同名的文件夹存在,则服务器会返回550 exists,
elif version < 8: flag_version = -1 warn_data = u"WireShark软件版本为 %s 过低,请使用更高版本的WireShark版本,\ 否则测试效果不好!" % self.wireshark_version elif version == 8: pass else: warn_data = u"判定WireShark库的版本信息 %s 不识别,将使用1.8.x版本做处理!\ 错误信息:%s" % (self.wireshark_version, e) except Exception, e: warn_data = u"判定WireShark库的版本信息 %s 高低出错将使用1.8.x版本做处理!\ 错误信息:%s" % (self.wireshark_version, e) if warn_data: log.user_warn(warn_data) return flag_version def _get_wireshark_version(self): """ """ ret = PARSE_PCAP_FILE_F wireshark_version = None err_data = "" if not self.wireshark_version: cmd = '"%s\\Tshark.exe" -h' % self.tshark_install_path try: