]> git.sesse.net Git - nms/blob - zyxel/konfgen.py
Replaced the Z constant by a more hardcoded switch limit.
[nms] / zyxel / konfgen.py
1 #!/usr/bin/env python
2 # -*- coding: iso8859-1 -*-
3 #
4 # Dette er litt slitsomt, men virker.
5 # Scriptet produserer et runscript -script, som kjøres
6 # i minicom. 
7 #
8 # Du setter scriptet som _tolker_ i minicom. C-a O, valg "D".
9 # det skal stå som: "konfgen.py | runscript /dev/stdin"
10 #
11 # Husk at du må ha en fungerende minicom -konfig fra før. Rett
12 # serieport, 9600 8N1 osv. Med bare "minicom -o" skal du kunne
13 # trykke enter og få "please enter password"
14 #
15 # Start med "minicom -o -S hihi" (scriptfilen trenger ikke finnes)
16 #
17 # gangen i scriptet:
18 # * generisk hostoppsett (host, syslog, dato og saann)
19 # * ip-oppsett med router og slikt
20 # * vlan-oppsett
21
22 # start og sluttporter for å ikke stenge seg selv ute 
23 # mens man tester.
24 p1 = 1
25 p2 = 24+1
26
27 NETWORK="194.0"
28 TRAPHOST="194.0.255.20"
29 LOGHOST="194.0.255.20"
30
31 #MODE="RAW"
32 MODE="minicom"
33
34
35 import sys
36 import os
37 import time
38
39 sys.stderr = open("/tmp/err","w+")
40 #sys.stdout = open("/tmp/out","w+")
41 sys.stdout = open(sys.argv[1],"w+")
42
43 def deduceSwitch():
44     # virker kun hvis man kjører manuelt.
45     if len(sys.argv) > 1:
46         (row, no) = sys.argv[1].split("-")
47         return (int(row), int(no))
48     else:
49         # okay, dette er for jævlig.
50         # jeg burde vinne en eller annen perlpris for dette.
51         # min ppid er også runscripts ppid. den har -S -argumentet oppgitt
52         # på kommandolinjen. (hihi i eksempel over)
53         # jeg vil hente den ut, slik at vi kan vatte inn svitsjnummer der.
54         log( "print inget argument. forsøker å dedusere fra prosesstabell")
55         lines = os.popen("ps -f --ppid %s -o pid,cmd 2>/dev/null" % os.getppid()).readlines()
56         for line in lines:
57             line = line.split()
58             if (line[1] == "runscript"):
59                 log( "linje som traff: %s" % line)
60                 tmp = line[3] # det som skrives etter -S
61                 row = tmp.split("-")[0]
62                 num = tmp.split("-")[1]
63                 log( "jeg tror vi snakker om %s" % line[3])
64                 return (int(row),int(num))
65         log("KLARTE IKKE DEDUSERE SVITSJ. AVBRYTER.")
66         if MODE == "minicom":
67             send("! killall -9 minicom")
68         sys.exit(255)
69
70 def log(text):
71     if MODE=="RAW":
72         # vi trenger ikke kommentarer i raw-mode.
73         return 
74     elif MODE == "minicom":
75         # runscript -format
76         sys.stdout.write("print \"%s\"\n" % text)
77     else:
78         sys.stderr.write(text +"\n")
79
80 def send(text):
81     if MODE=="RAW":
82         sys.stdout.write(text + "\n")
83     elif MODE == "minicom":
84         sys.stdout.write("send \"%s\"\n" % text)
85 #        sys.stdout.write("print \"kommendoen er: %s\"\n" % text)
86     else: 
87         sys.stdout.write(text + "\n")
88
89 # No Z-constant for you!
90 def retSubnet(sw):
91     (rad,num) = sw
92     if rad <= 7 or (rad == 8 and (sw <= 3 or sw == 6)):
93         return "241"
94     if rad <= 13 or (rad == 14 and sw != 4) or (rad == 15 and sw <= 3):
95         return "242"
96     if rad <= 22 or (rad == 23 and sw >= 4) or (rad == 24 and sw == 4):
97         return "243"
98     if rad <= 29 or (rad == 30 and (sw == 4 or sw == 5)):
99         return "244"
100     return "245"
101
102 def retIP(sw):
103     (rad,num) = sw
104     gangefaktor = rad - ((rad - 1) / 2)
105     lopenr = 2 + 6 * gangefaktor + num
106     return NETWORK + ".%s.%s" % (retSubnet(sw), lopenr)
107
108 sw = deduceSwitch()
109
110 if ((sw[0] % 2) == 0):
111     print "det er ingen svitsjer på rad %i" % sw[0]
112     sys.exit(255)
113
114 if (sw[1] > 6):
115     print "det er maks 6 svitsjer pr. bordrad!"
116     sys.exit(255)
117
118
119
120 GW              = "%s.%s.1" % (NETWORK, retSubnet(sw)) 
121 IP              = retIP(sw)
122 NAME            = "e%i-%isw" % sw
123 VLAN            = "%i%i" % sw
124 MNGTVLAN        = "90%s" % retSubnet(sw)[-1]
125
126 if MODE == "minicom":
127     log ("logger paa")
128     # logger paa
129     send( "exit")
130     send( "exit")
131     send( "z1234")
132
133
134 ### GENERISK HOSTOPPSETT
135 log( "* generisk")
136 send("sys hostname %s" % NAME)
137
138 send("sys syslog server %s" % LOGHOST)
139
140 send("sys snmp getCommunity 2 immer" )
141 send("sys snmp setCommunity 2 dabei") 
142 send("sys snmp trapCommunity 2 jungel")
143 send("sys snmp trapDest 2 %s"    % TRAPHOST)
144 send("sys snmp trustedHost 2 %s" % TRAPHOST)
145
146 send( "ip igmpsnoop enable")
147 # sansynligvis noe med broadcast storm control her
148
149 ### IP
150 log( "* ip")
151
152 send("ip ifconfig swif0 %s/24" % IP)
153 # konfig fra fabrikken. fjerner om den finnes.
154 send("ip route drop 192.168.1.0/24")
155 # naermeste distro
156 send("ip route add default %s" % GW)
157
158 ### bw-begrensninger
159 send("sys sw bw port set 1 * 25 0 200000 TIL-VERDEN")
160 send("sys sw bw port set 1 25 * 0 200000 FRA-VERDEN")
161
162 ### VLAN
163 log( "* vlan")
164 send("sys sw vlan type 802.1q")
165 # oppretter management-vlanet
166 send("sys sw vlan1q svlan setentry MNGT %s 25 fixed tag" % MNGTVLAN)
167 send("sys sw vlan1q svlan active %s" % MNGTVLAN )
168
169
170 # sletter defaulten
171 send("sys sw vlan1q svlan delentry 1")
172
173 # oppretter brukervlan
174 send("sys sw vlan1q svlan setentry %s %s 25 fixed tag" % (NAME, VLAN))
175 send("sys sw vlan1q svlan active %s" % VLAN)
176
177 # Usage: sw vlan1q svlan setentry <name> <VID> <PORT> <ADCTL> <TAGCTL>
178 # name maa stemme, ellers setter du nytt navn paa vlanet.
179 # adctl er forbidden,fixed,normal
180 # tagctl er tag / untag
181
182 for i in range(p1,p2): 
183     send("sys sw vlan1q svlan setentry %s   %s %i fixed untag"   % (NAME, VLAN, i))
184
185 for i in range(p1,p2): 
186     send("sys sw vlan1q svlan setentry MNGT %s %i forbidden tag" % (MNGTVLAN, i))
187
188
189 ### PORT-oppsett
190 log( "* portoppsett")
191 send("sys sw vlan1q port vlanTrunking 25 enable")
192
193 for i in range(p1,p2): 
194     send("sys sw vlan1q port accept %s untagged" % i)
195
196 for i in range(p1,p2): 
197     send("sys sw vlan1q port defaultVID %s %s" % (i, VLAN))
198
199 for i in range(p1,p2): 
200     send("sys sw bmstorm set %i 8192 egress" % i)
201     send("sys sw bmstorm set %i 8192 ingress" % i)
202
203 send("sys sw bmstorm set 25 32767 ingress")
204
205 # disse tar av uante grunner flere sekunder pr. kommando.
206 # det virker som at alle er disablet i utgangspunktet, så vi slå
207 # kun på den som trengs.
208 send("sys sw vlan1q port defaultVID 25 %s" % MNGTVLAN)
209
210 send("config save")
211 # sette mngt-vlan
212 send("sys sw vlan1q svlan cpu %s" % MNGTVLAN)
213
214 if MODE == "minicom":
215     log("logger av")
216     send("exit")
217     print "! killall -9 minicom"