天天看點

利用Python 程式實作Linux 網卡 bonding 實作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

<code>#!/usr/bin/env python</code>

<code>import</code> <code>os,sys,time,re,shutil</code>

<code>import</code> <code>socket</code>

<code>import</code> <code>fcntl</code>

<code>import</code> <code>struct</code>

<code>import</code> <code>traceback</code>

<code>import</code> <code>commands</code>

<code>#Get interface name</code>

<code>interface_path </code><code>=</code> <code>'/etc/sysconfig/network-scripts/'</code>

<code>def</code> <code>LOG(info):</code>

<code>    </code><code>""" Log files ...."""</code>

<code>    </code><code>logfile </code><code>=</code> <code>'/root/pxe_install.log'</code>

<code>    </code><code>files </code><code>=</code> <code>open</code><code>(logfile,</code><code>'a'</code><code>)</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>files.write(</code><code>'%s : %s \n'</code><code>%</code><code>(time.ctime(),info))</code>

<code>    </code><code>except</code> <code>IOError:</code>

<code>        </code><code>files.close()</code>

<code>    </code><code>files.close()</code>

<code>def</code> <code>get_interface ():</code>

<code>    </code><code>os.chdir(interface_path)</code>

<code>    </code><code>eth  </code><code>=</code> <code>em </code><code>=</code> <code>list</code><code>()</code>

<code>    </code><code>for</code> <code>inter </code><code>in</code> <code>os.listdir(interface_path):</code>

<code>        </code><code>if</code> <code>inter[</code><code>0</code><code>:</code><code>-</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'ifcfg-em'</code><code>:</code>

<code>            </code><code>if</code> <code>inter </code><code>=</code><code>=</code> <code>'ifcfg-em1'</code> <code>or</code> <code>inter </code><code>=</code><code>=</code> <code>'ifcfg-em2'</code><code>:</code>

<code>                </code><code>em.append(inter)</code>

<code>        </code><code>elif</code> <code>inter[</code><code>0</code><code>:</code><code>-</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'ifcfg-eth'</code><code>:</code>

<code>            </code><code>if</code> <code>inter </code><code>=</code><code>=</code> <code>'ifcfg-eth0'</code> <code>or</code> <code>inter </code><code>=</code><code>=</code> <code>'ifcfg-eth1'</code><code>:</code>

<code>                </code><code>eth.append(inter)</code>

<code>    </code><code>if</code> <code>eth:</code>

<code>        </code><code>LOG(</code><code>"Getting interface file name %s is Ok"</code> <code>%</code><code>eth)</code>

<code>        </code><code>return</code> <code>eth</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>LOG(</code><code>"Getting interface file name %s is Ok"</code> <code>%</code><code>em)</code>

<code>        </code><code>return</code> <code>em</code>

<code> </code> 

<code>def</code> <code>main():</code>

<code>    </code><code>net_name </code><code>=</code> <code>get_interface()</code>

<code>    </code><code>ipaddr </code><code>=</code> <code>str</code><code>()</code>

<code>    </code><code>for</code> <code>inter </code><code>in</code> <code>net_name:</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>shutil.move(inter,</code><code>'/opt/'</code> <code>+</code> <code>inter</code><code>+</code><code>'.bak'</code><code>)</code>

<code>            </code><code>_interface_config(inter)</code>

<code>            </code><code>new_interface </code><code>=</code> <code>inter.split(</code><code>'-'</code><code>)[</code><code>-</code><code>1</code><code>]</code>

<code>            </code><code>if</code> <code>_configure_bond(new_interface):</code>

<code>                </code><code>_configure_bond(new_interface)</code>

<code>            </code><code>LOG(</code><code>"bond script init is Ok"</code><code>)</code>

<code>        </code><code>except</code> <code>Exception,e:</code>

<code>            </code><code>LOG(traceback.format_exc())</code>

<code>    </code><code>if</code> <code>_interface_modprobe():</code>

<code>        </code><code>_interface_modprobe()</code>

<code>    </code> 

<code>    </code><code>if</code> <code>_rester_network():</code>

<code>        </code><code>_rester_network()</code>

<code># Set interface eth* or em*</code>

<code>def</code> <code>_interface_config(interface):</code>

<code>    </code><code>"""</code>

<code>        </code><code>DEVICE=eth0</code>

<code>        </code><code>BOOTPROTO=static</code>

<code>        </code><code>NOBOOT=yes</code>

<code>        </code><code>NM_CONTROLLED=no</code>

<code>        </code><code>MASTER=bond0</code>

<code>        </code><code>SLAVE=yes</code>

<code>    </code><code>fp </code><code>=</code> <code>open</code><code>(interface,</code><code>'w'</code><code>)</code>

<code>    </code><code>new_interface </code><code>=</code> <code>interface.split(</code><code>'-'</code><code>)[</code><code>-</code><code>1</code><code>]</code>

<code>    </code><code>if</code> <code>interface </code><code>=</code><code>=</code> <code>'ifcfg-em1'</code><code>:</code>

<code>        </code><code>fp.write(</code><code>'DEVICE=%s \n'</code><code>%</code><code>new_interface)</code>

<code>        </code><code>fp.write(</code><code>'BOOTPROTO=static \n'</code><code>)</code>

<code>        </code><code>fp.write(</code><code>'ONBOOT=yes \n'</code><code>)</code>

<code>        </code><code>fp.write(</code><code>'NM_CONTROLLED=no \n'</code><code>)</code>

<code>        </code><code>fp.write(</code><code>'MASTER=bond0 \n'</code><code>)</code>

<code>        </code><code>fp.write(</code><code>'SLAVE=yes \n'</code><code>)</code>

<code>    </code><code>elif</code> <code>interface </code><code>=</code><code>=</code> <code>'ifcfg-em2'</code><code>:</code>

<code>    </code><code>elif</code> <code>interface </code><code>=</code><code>=</code> <code>'ifcfg-eth0'</code><code>:</code>

<code>    </code><code>elif</code> <code>interface </code><code>=</code><code>=</code> <code>'ifcfg-eth1'</code><code>:</code>

<code>    </code><code>fp.close()</code>

<code>def</code> <code>_configure_bond(inter):</code>

<code>    </code><code>DEVICE=bond0</code>

<code>    </code><code>BOOTPROTO=static</code>

<code>    </code><code>ONBOOT=yes</code>

<code>    </code><code>IPADDR=192.168.0.100</code>

<code>    </code><code>NETMASK=255.255.255.0</code>

<code>    </code><code>NETWORK=192.168.0.0</code>

<code>    </code><code>BROADCAST=192.168.0.255</code>

<code>    </code><code>#bond name message</code>

<code>    </code><code>if</code> <code>inter </code><code>=</code><code>=</code> <code>'eth0'</code><code>:</code>

<code>        </code><code>bond_name </code><code>=</code> <code>'ifcfg-bond0'</code>

<code>    </code><code>elif</code> <code>inter </code><code>=</code><code>=</code> <code>'em1'</code><code>:</code>

<code>        </code><code>bond_name </code><code>=</code>  <code>'ifcfg-bond0'</code>

<code>    </code><code>elif</code> <code>inter </code><code>=</code><code>=</code> <code>'eth1'</code><code>:</code>

<code>    </code><code>elif</code> <code>inter </code><code>=</code><code>=</code> <code>'em2'</code><code>:</code>

<code>    </code><code># ip address message</code>

<code>    </code><code>if</code> <code>_interface_get_ip(inter):</code>

<code>        </code><code>ipaddr  </code><code>=</code> <code>_interface_get_ip(inter)</code>

<code>        </code><code>ipaddr </code><code>=</code> <code>'0.0.0.0'</code>

<code>    </code><code># ip net mask info</code>

<code>        </code><code>net_mk  </code><code>=</code> <code>os.popen(</code><code>'ip a |grep %s|grep inet'</code> <code>%</code><code>inter).readlines()[</code><code>0</code><code>]</code>

<code>        </code><code>res </code><code>=</code> <code>net_mk.split()[</code><code>1</code><code>]</code>

<code>        </code><code>net_masklen </code><code>=</code> <code>res.split(</code><code>'/'</code><code>)[</code><code>-</code><code>1</code><code>]</code>

<code>    </code><code>except</code><code>:</code>

<code>        </code><code>net_masklen </code><code>=</code> <code>18</code>

<code>    </code><code>net_mask </code><code>=</code> <code>_interface_sum_master(net_masklen)</code>

<code>    </code><code># default gateway is ....</code>

<code>        </code><code>net_gate </code><code>=</code> <code>os.popen(</code><code>'ip route |grep default'</code><code>).readlines()[</code><code>0</code><code>]</code>

<code>        </code><code>net_gateway </code><code>=</code> <code>net_gate </code><code>=</code> <code>net_gate.split(</code><code>' '</code><code>)[</code><code>2</code><code>]</code>

<code>        </code><code>net_gateway </code><code>=</code> <code>'0.0.0.0'</code>

<code>   </code> 

<code>        </code><code>if</code> <code>ipaddr </code><code>=</code><code>=</code> <code>'0.0.0.0'</code><code>:</code>

<code>            </code><code>return</code> <code>''</code>

<code>        </code><code>fp </code><code>=</code> <code>open</code><code>(bond_name,</code><code>'w'</code><code>)</code>

<code>        </code><code>bond </code><code>=</code> <code>bond_name.split(</code><code>'-'</code><code>)[</code><code>-</code><code>1</code><code>]</code>

<code>        </code><code>fp.write(</code><code>"DEVICE=%s \n"</code> <code>%</code><code>bond)</code>

<code>        </code><code>fp.write(</code><code>"BOOTPROTO=static \n"</code><code>)</code>

<code>        </code><code>fp.write(</code><code>"ONBOOT=yes \n"</code><code>)</code>

<code>        </code><code>fp.write(</code><code>"IPADDR=%s \n"</code> <code>%</code><code>ipaddr)</code>

<code>        </code><code>fp.write(</code><code>"NETMASK=%s \n"</code> <code>%</code> <code>net_mask)</code>

<code>        </code><code>if</code> <code>bond </code><code>=</code><code>=</code> <code>'bond0'</code><code>:</code>

<code>            </code><code>fp.write(</code><code>"GATEWAY=%s \n"</code> <code>%</code> <code>net_gateway)</code>

<code>            </code><code>fp.write(</code><code>"DNS1=202.106.0.20 \n"</code><code>)</code>

<code>            </code><code>fp.write(</code><code>"DNS2=8.8.8.8 \n"</code><code>)</code>

<code>        </code><code>LOG(</code><code>"ifcfg-bond* configure is Ok"</code><code>)</code>

<code>        </code><code>return</code> <code>True</code>

<code>    </code><code>except</code> <code>Exception,e:</code>

<code>        </code><code>return</code> <code>False</code>

<code>def</code> <code>_interface_get_ip(inter):</code>

<code>        </code><code>s </code><code>=</code> <code>socket.socket(socket.AF_INET, socket.SOCK_DGRAM)</code>

<code>        </code><code>IP </code><code>=</code> <code>socket.inet_ntoa(fcntl.ioctl(</code>

<code>            </code><code>s.fileno(),</code>

<code>            </code><code>0x8915</code><code>,  </code><code># SIOCGIFADDR</code>

<code>            </code><code>struct.pack(</code><code>'24s'</code><code>,inter))[</code><code>20</code><code>:</code><code>24</code><code>])</code>

<code>        </code><code>return</code>  <code>IP</code>

<code>        </code><code>pass</code>

<code>        </code><code>return</code>

<code># Add modprobe bonding model</code>

<code>def</code> <code>_interface_modprobe():</code>

<code>        </code><code>fp </code><code>=</code> <code>open</code><code>(</code><code>'/etc/modprobe.d/bonding.conf'</code><code>,</code><code>'w'</code><code>)</code>

<code>        </code><code>fp.write(</code><code>"#Module options and blacklists written by bonding \n"</code><code>)</code>

<code>        </code><code>fp.write(</code><code>"alias bond0 bonding \n"</code><code>)</code>

<code>        </code><code>fp.write(</code><code>"options bond0 miimon=100 mode=1 \n"</code><code>)</code>

<code>        </code><code>fp.close()</code>

<code>        </code><code>x,y  </code><code>=</code> <code>commands.getstatusoutput(</code><code>'modprobe bonding'</code><code>)</code>

<code>        </code><code>if</code> <code>x !</code><code>=</code> <code>0</code><code>:</code>

<code>            </code><code>LOG(</code><code>"modprobe bonding is failed"</code><code>)</code>

<code>        </code><code>LOG(traceback.format_exc())</code>

<code># Restart Network</code>

<code>def</code> <code>_rester_network():</code>

<code>    </code><code>x,y  </code><code>=</code> <code>commands.getstatusoutput(</code><code>'service network restart'</code><code>)</code>

<code>    </code><code>if</code> <code>x </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>        </code><code>LOG(</code><code>"restart netowrk is Ok "</code><code>)</code>

<code>        </code><code>LOG(</code><code>"restart netowrk is Faild "</code><code>)</code>

<code># According to the CIDR calculation.net master</code>

<code>def</code> <code>_interface_sum_master(net_master):</code>

<code>    </code><code>mask </code><code>=</code>  <code>(</code><code>2</code><code>*</code><code>*</code> <code>8</code><code>) </code><code>-</code> <code>2</code> <code>*</code><code>*</code> <code>(</code><code>24</code> <code>-</code> <code>int</code><code>(net_master))</code>

<code>    </code><code>return</code> <code>'255.255.%s.0'</code> <code>%</code> <code>mask</code>

<code>if</code> <code>__name__  </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>sc </code><code>=</code> <code>main()</code>

本文轉自 swq499809608 51CTO部落格,原文連結:http://blog.51cto.com/swq499809608/1557187