在上篇博客中,我已经提到了如何快速的获取家庭网关的配置数据并记录在文件里面,现在我们讲讲我是如何编写几个通用的tcl过程来实现脚本配置的。目前我正在写一个WIFI Range Reach的自动化,WIFI Range Reach是指在不同的衰减值下无线路由器到无线的客户端的上下行Throughput的测试。测试拓扑如下:

  1. 其中的AP是家庭网关
  2. STA是指一个高性能的无线客户端
  3. 在两个PC上需要安装Chariot
  4. 两个方框是指屏蔽箱,里面放了家庭网关和无线客户端
  5. 两个方框之间的四条连接线是射频连接线中间接了衰减器

手动测试的大至过程是这样的:

  1. 配置家庭网关的无线配置
  2. 设置衰减器的衰减值
  3. 用无线客户端连接AP
  4. 在PC上跑Chariot测试Throughput

所以脚本的业务逻辑是这样的:

####################################################################################
#!/bin/sh
# performace.tcl \
exec tclsh "$0" ${1+"$@"}
#####################################################################################初始化环境变量
source "init.tcl"#设置衰减器的值
#====================================================================================
attenSet $attenChannel 0#配置路由器
#======================================================================================
config_init $configFileNameOfDUT
action_config login
action_config 5GAX80MC36#配置无线客户端建立无线连接
#=====================================================================================
config_init $configFileNameOfSTA
action_config NetgearChangeTo5G $ipAddressOfSTA $guiPortOfSTA {timestamp=([[:digit:]]+)}
action_config NetgearApply $ipAddressOfSTA $guiPortOfSTA {timestamp=([[:digit:]]+)}#调用Chariot测试带宽
#=====================================================================================
puts "Chariot start running......"
......

在上面的测试逻辑中用到的config_init, action_config两个过程就是本人封装的两个tcl过程。config_init接收一个参数就是我们之前录制的配置文件的文件名,这个函数的作用就是读取所有的配置项,把他们放到内存的列表里面,以供后面的action_config函数使用。下面是这个函数的实现代码:

proc config_init {filename} {global actionsglobal cookieset cookie ""set f [open $filename r]while {[gets $f line] >= 0} {set line [string trim $line]if {$line == ""} {continue}if {[regexp {===(.+)===} $line no_use action_name]} {set actions($action_name) [list]} elseif {[info exists action_name]} {set line [regsub -all {\\r\\n} $line "\n"]lappend actions($action_name) [string range $line 2 end-1]}}close $f}

action_config这个函数可以有四个参数,但是后面三个是可选参数,最主要的是第一个参数,第一个参数就是配置项的名称,就是当时录制文件的时候取的配置项名称,上面配置项目用下面两条语句就把我们的配置项配置到真实的路由器上了。

action_config login
action_config 5GAX80MC36

第一条语句是登陆,第二条语句的意思是配置无线配置为这个配置项目5GAX80MC36记录的配置项目对应的数据。为什么需要登陆呢,是因为现在的家庭网管都会有个登陆过程然后产生一个session id或者cookies来供后续请求做鉴权,所以我通过这个登陆过程取得cookies。action_config的实现如下:

proc action_config { action_name {ipaddress 192.168.1.1} {port 80} {getexp ""} } {global actionsglobal cookieset getdata ""foreach message $actions($action_name) {set headerneeded [list]regexp {(.+)\n\n(.*)} $message no_use headers messagebodyset headerlist [split $headers "\n"]set startline [lindex $headerlist 0]regexp {([[:alpha:]]+?)\s*(/.*) HTTP/1.[0|1].*} $startline no_use m pathset url http://${ipaddress}:$port$path        set size [llength $headerlist]for {set i 1} {$i < $size} {incr i} {set header [lindex $headerlist $i]set useless_headers [list Connection "" Content-Length Cookie Accept User-Agent]regexp {^(.+?):\s*(.*)$} $header no_use headername headercontentif {[lsearch -exact $useless_headers $headername] == -1 & $headercontent != ""} {lappend headerneeded $headername $headercontent}}if {$cookie != ""} {lappend headerneeded Cookie $cookie}if {$getdata != "" && $getexp != ""} {regsub -all $getexp  $url $getdata url}puts Request:$urlset handler [::http::geturl $url -headers $headerneeded -query $messagebody -method $m]puts Response:[::http::code $handler]if {[::http::ncode $handler]==401} {puts Request:$url::http::cleanup $handlerset handler [::http::geturl $url -headers $headerneeded -query $messagebody -method $m]puts Response:[::http::code $handler]            }set response_header [::http::meta $handler]set index [lsearch $response_header Set-Cookie]if {$index != -1} {set cookie [lindex $response_header [expr $index+1]]puts "Get cookie from response data: $cookie"}if {[string compare $getexp ""]} {if {[::http::ncode $handler] == 200} {set response "[::http::meta $handler][::http::data $handler]" regexp $getexp $response getdataputs "Get customized data field from response data:$getdata"}}if {[::http::status $handler] != "ok"} {puts [::http::error $handler]::http::cleanup $handlerreturn "error"}::http::cleanup $handler}return "ok"
}

家庭网关自动化(三)通用配置过程相关推荐

  1. 第三篇——第二部分——第三文 配置SQL Server镜像——域环境

    原文: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境 原文出处:http://blog.csdn.net/dba_huangzj/article/details/2890450 ...

  2. OpenCV4.0+VS2017完整安装配置过程(详细!)

    刚步入研究生生活,老师要求安装OpenCV+VS,所以昨天捣鼓了下,成功''吃鸡''.所以今天写下昨天安装的过程,也便自己对此印象更加深刻. 一.下载安装VS2017 我安装的版本是目前最新的Visu ...

  3. 图解MySQL5.5详细安装与配置过程

    出自:http://www.dbhom.com/show.aspx?id=77&cid=9 MySQL是一个开源的关系型数据库管理系统,原由瑞典MySQL AB公司开发,目前属于Oracle公 ...

  4. PCIe设备的配置过程

    PCIe设备的配置过程 文章目录 PCIe设备的配置过程 参考资料: 一. PCIe系统硬件结构 二. PCIe系统软件层次 三.事务层TLP格式 3.1 Posted和Non-Posted 3.2 ...

  5. MacBook 整个配置过程,供新入手MacBook的同学

    这里记录了MacBook 的整个配置过程,可供新入手MacBook和觉得MacBook比较难用的同学参考. 外围拓展 笔记本电脑的特点是携带方便,缺点是屏幕太小,因此你首先需要再申请领用一个外接显示器 ...

  6. Project Server 2007安装配置过程图解

    微软的Office Project软件是Office办公软件的组件之一,是一个通用的项目管理工具软件.(具体介绍可参考:微软Project项目管理软件简介 ) 微软企业项目管理解决方案(EPM)是微软 ...

  7. 中科院周少华教授:对深度学习自动化、通用表征学习的研究心得

    2021-02-06 19:36:24 医学影像AI的落地道阻且长.在深度学习自动化.通用表征学习.学习与知识融合等方向上,2020年底当选NAI Fellow的周少华教授分享了最新的学术研究成果. ...

  8. Jenkins自动化打包iOS配置流程

    前提条件:Mac系统,并且已经安装xcode,homedrew,Java,如果项目工程中集成了cocoapod,也需要安装cocoapod Jenkins打包方式分为两种,一种是xcode插件化配置打 ...

  9. STM32-时钟篇以及复位时时钟的配置过程

    STM32-时钟篇以及复位时时钟的配置过程 时钟就是一个芯片的心脏,CPU的处理速度也是由时钟来直接决定,相比51单一的时钟源,STM32具有强大的时钟系统,我们的所有的外设都离不开时钟,时钟是学习S ...

最新文章

  1. 【html】如何解决标签设置成超链接后字体格式及颜色变化的问题
  2. Flutter Exception降到万分之几的秘密
  3. 本地php后台密码恢复默认,找回wordpress后台管理密码的PHP脚本方法
  4. 收集计算机网络经典的面试题
  5. 预充电电路工作原理_常见变频空调室外机电路工作原理及组成
  6. django-登装饰器
  7. linux 硬盘响,完美解决Ubuntu Linux关机异响[SATA硬盘]
  8. MvcMusicStore学习中常出现的一个BUG
  9. AutoLISP圆内接多边形
  10. Mac小白入门小技巧
  11. 后疫情时代,用户到访识别已成为商业地产数字化升级“近义词”
  12. MYSQL命令行闪退问题解决
  13. 华为P30 HL2ELLEM VER.A手机图纸
  14. golang的chan有趣用法
  15. python猴子吃桃子的问题_张含韵忍不住一吃再吃的这种湖南美食,你可能买到假货...
  16. Python 文件加密
  17. viper4android小米活塞,打造小米手机终极HIFI 有效提升小米手机音质
  18. 201871010123-吴丽丽《面向对象程序设计(Java)》第四周学习总结
  19. 圆上三点求圆心和半径
  20. 判断MySQL安装是否成功的两种验证方法

热门文章

  1. oracle中cascade是什么意思啊,oracle中的drop user和drop user cascade有什么区别?
  2. Windows Server 安装Erlang以及无法识别erl命令解决方法
  3. 如何是iPad/iPhone程序满屏显示【也就是没有上面的电量条】
  4. MPAS-A模式的介绍
  5. 【翻译】Postmortem-debugging-Go-services-with-Delve
  6. 走出金融危机-让我们从IT治理开始
  7. IDEA导入Spring源码缺失spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar
  8. 揭秘职业骗保师月入十万的骚操作
  9. 2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
  10. (郁闷p2pover中)整理记录四