现在工作主要做城域网,前些日子做商务楼脚本,才真实感觉受MAN
的配置量好大,作为终结3
层的7609
的配置上万行命令,与Winford
写了一整天脚本,才写好,好累,而且手工容易出错,就想到可以使用UtraEdit
的脚本。但Jav**ript
和宏命令很久没玩了,已忘了差不多了,调试了三天才达到预期的效果。
一.宏命令:根据子接口号自动增加一条封装VLAN命令。
interface Port-channel2.2000 access
description to ShuangGeDaSha GC1830
ip address 222.68.99.1 255.255.255.240
no ip redirects
no ip unreachables
no ip proxy-arp
修改后:
interface Port-channel2.2000 access
description to ShuangGeDaSha GC1830
encapsulation dot1Q 2000
ip address 222.68.99.1 255.255.255.240
no ip redirects
no ip unreachables
no ip proxy-arp
宏命令解释版:
**Mode //
使用**
模式
ColumnModeOff //
关闭列模式
HexOff //
关闭十六进制模式
Find RegExp "^interface Port-channel?" //
使用正则表达式查找关键字,关键字格式为:
//
行首以interface Port-channel
打头的,后面的?表示匹配除换行符外的任一单个//
字符,因为可能是Port-channel1
也可能是Port-channel2
,所以用?表示
IfFound //
若找到
Key RIGHT ARROW //
光标向右移一个字符
Start** //
开始选择
Loop 4 //
循环4
次
Key RIGHT ARROW //
也就是向右移动4
个字符
EndLoop
End** //
选择4
个字符,也就是VLAN ID
Copy //
复制VLAN ID
到剪贴板
Key DOWN ARROW //
向下移动两行
Key DOWN ARROW
Key HOME //
光标移到行首
"encapsulation dot1Q " //
输入"encapsulation dot1Q ",
注意后有个空格
Paste //
复制剪贴板中的VLAN ID
到dot1Q
后面,从而实现VLAN ID
的复制
" //
两行的双引号,实现换行
"
EndIf
二.Jav**ript共享VLAN脚本功能:根据VLAN和port的映射关系文本和配置模板,以VLANID为文件名自动生成配置文件。
其中:VLAN
和port
映射关系文本格式如下:
2000 1/0/1
2001 2/0/11
华为CX600
共享VLAN
配置模板:
user-group-queue GVLAN_vlan
shaping 1024 inbound
traffic behavior GVLAN_vlan-1st
user-queue cir 204 pir 1024 user-group-queue GVLAN_vlan
traffic behavior GVLAN_vlan-2nd
user-queue cir 204 pir 1024 user-group-queue GVLAN_vlan
traffic behavior GVLAN_vlan-3rd
user-queue cir 204 pir 1024 user-group-queue GVLAN_vlan
traffic behavior GVLAN_vlan-4th
user-queue cir 204 pir 1024 user-group-queue GVLAN_vlan
traffic behavior GVLAN_vlan-5th
user-queue cir 204 pir 1024 user-group-queue GVLAN_vlan
traffic policy GVLAN_vlan
share-mode
classifier 1st behavior GVLAN_vlan-1st
classifier 2nd behavior GVLAN_vlan-2nd
classifier 3rd behavior GVLAN_vlan-3rd
classifier 4th behavior GVLAN_vlan-4th
classifier 5th behavior GVLAN_vlan-5th
int g_port
port trunk allow-pass vlan _vlan
traffic-policy baseconfig inbound vlan _vlan all-layer
qos car cir 1024 cbs 51200 pbs 102400 green pass yellow pass red discard inbound vlan _vlan
interface Eth-Trunk0
traffic-policy GVLAN_vlan inbound vlan _vlan
脚本如下:
var vlanpath=UltraEdit.getString("
请输入VLAN
与Port
关系表的绝对路径名",1); //
必须全部是全英文目录
var modulepath=UltraEdit.getString("
请输入配置模板的绝对路径名",1);
var outputpath=UltraEdit.getString("
输出文件的绝对路径,
最后以\\
结束",1);
var vlanexp="^[0-9][0-9][0-9][0-9]"; //
想实现其他功能,请修改此regular expression,
比如行首三位数"^[0-9][0-9][0-9]"
var portexp="[0-9]/[0-9]/[0-9]+"; //
想实现其他功能,请修改此regular expression
var vlan,port,m;
var vlandocid;
var moduledocid;
UltraEdit.columnModeOff();
UltraEdit.open(vlanpath);
vlandocid=UltraEdit.activeDocumentIdx;
UltraEdit.open(modulepath);
moduledocid=UltraEdit.activeDocumentIdx;
UltraEdit.document[vlandocid].findReplace.regExp=true;
UltraEdit.document[vlandocid].findReplace.find(vlanexp);
while(UltraEdit.document[vlandocid].isFound()){
vlan=UltraEdit.document[vlandocid].**ion;
UltraEdit.document[vlandocid].findReplace.find(portexp);
if(UltraEdit.document[vlandocid].isFound()){
port=UltraEdit.document[vlandocid].**ion;
UltraEdit.document[moduledocid].setActive();
UltraEdit.document[moduledocid].**All;
m=UltraEdit.document[moduledocid].**ion;
UltraEdit.newFile; //
不能加();
UltraEdit.activeDocument.write(""+m);
UltraEdit.activeDocument.top();
UltraEdit.activeDocument.findReplace.replaceAll=true;
UltraEdit.activeDocument.findReplace.replace("_vlan",vlan);
UltraEdit.activeDocument.top();
UltraEdit.activeDocument.findReplace.replace("_port",port);
UltraEdit.saveAs(outputpath+vlan+".log");
UltraEdit.closeFile(outputpath+vlan+".log",1);
UltraEdit.open(modulepath);
UltraEdit.document[vlandocid].findReplace.find(vlanexp);
}
}
三.Jav**ript独享VLAN脚本功能:基本与共享脚本一样,主要不同是所有独享VLAN的配置放在同一文件上,调试也花了一天。
var vlanpath=UltraEdit.getString("
请输入VLAN
与Port
关系表的绝对路径名",1); ////
必须全部是全英文目录
var modulepath=UltraEdit.getString("
请输入配置模板的绝对路径名",1);
var outputpath=UltraEdit.getString("
输出文件的绝对路径名",1);
var vlanexp="^[0-9][0-9][0-9][0-9]";
var portexp="[0-9]/[0-9]/[0-9]+";
var vlan,port,m;
var vlandocid;
var moduledocid;
var outputdocid;
UltraEdit.columnModeOff();
UltraEdit.**Mode();
UltraEdit.open(outputpath); //
输入配置模板文件名,//
这个open
必须放在最前面,不然会失败,很奇异
outputdocid=UltraEdit.activeDocumentIdx;
UltraEdit.open(vlanpath);
vlandocid=UltraEdit.activeDocumentIdx;
UltraEdit.open(modulepath); //
输入VLAN
和Port
映射关系文件名
moduledocid=UltraEdit.activeDocumentIdx;
UltraEdit.document[vlandocid].findReplace.regExp=true;
UltraEdit.document[vlandocid].findReplace.find(vlanexp);
while(UltraEdit.document[vlandocid].isFound()){
vlan=UltraEdit.document[vlandocid].**ion;
UltraEdit.document[vlandocid].findReplace.find(portexp);
if(UltraEdit.document[vlandocid].isFound()){
port=UltraEdit.document[vlandocid].**ion;
UltraEdit.document[moduledocid].findReplace.replaceAll=true;
UltraEdit.document[moduledocid].findReplace.replace("_vlan",vlan); //
替换模板里面的关键字"_vlan"
UltraEdit.document[moduledocid].findReplace.replaceAll=true;
UltraEdit.document[moduledocid].findReplace.replace("_port",port); //
替换模板里面的"_Port"
UltraEdit.document[moduledocid].**All();
m=UltraEdit.document[moduledocid].**ion;
UltraEdit.document[outputdocid].setActive();
UltraEdit.document[outputdocid].bottom();
UltraEdit.document[outputdocid].write("\r\n"+m);
UltraEdit.closeFile(modulepath,2);
UltraEdit.open(modulepath);
UltraEdit.document[vlandocid].findReplace.find(vlanexp);
}
}
UltraEdit.closeFile(outputpath,1);
后记:编程这活,也是要经常写,才能熟练,熟能生巧啊。因为不熟,这3
个脚本基本花了我三天时间调试。虽然代码很简单,我没考虑ifelse
等的情况,也没采用function
的面向对象编程方法,结构并不优美,但关键是能用并实用,可以节省大量时间。UE
的正则表达式不如Unix
的好,不过我在写Jav**ript
时,UE
的find()
貌似不能直接使用jav**ript
的正则表达式,查了文档,才知道要使用//
或new
才能建立jav**ript
的正则表达式。本想好好利用这个兴致好好学下jav**ript
编程,不过,现在这3
个脚本,对于以后写脚本应该基本够用了,而且今年有好多事要做,只能有空偶尔研究下吧。希望对大家有帮助^_^
注以上脚本已在UlrtaEdit 17.00.0.1028
英文版和17.00.0.1030
中文版测试通过,在15.0
测试不生效,所以大家还是用17.0
版本吧。
如果想让脚本实现其他替换功能,要修改vlanexp
和portexp
这两个regular expression
。所以,字处理的另一难点也就是regular expression
。
附件是ShareVLAN.js
和IndependentVLAN.js,
下载后用UE
加载,方法是:
1.
菜单栏--scripting----scripts---add,
加载完毕后,
2.
用UE
新建一个空白文件
3.
菜单栏--scripting----
选择相应的脚本就可以执行了。