[videomode] fix dependency
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / WirelessAccessPoint / plugin.py
1 from Screens.Screen import Screen
2 from Components.ConfigList import ConfigListScreen, ConfigList
3 from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigSelection, ConfigIP, ConfigInteger
4 from Components.config import ConfigText, ConfigYesNo, NoSave, ConfigPassword, ConfigNothing, ConfigSequence
5 from Components.ActionMap import ActionMap
6 from Screens.MessageBox import MessageBox
7 from Components.Sources.StaticText import StaticText
8 from Plugins.Plugin import PluginDescriptor
9 from Tools.Directories import fileExists
10 from math import pow as math_pow
11 from Components.Network import iNetwork
12 from Components.PluginComponent import plugins
13 from Components.Console import Console
14 from os import path as os_path, system as os_system, listdir
15 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
16 from enigma import eTimer
17 import wirelessap
18
19 debug_msg_on = False
20 def printDebugMsg(msg):
21         global debug_msg_on
22         if debug_msg_on:
23                 print "[Wireless Access Point] ", msg
24
25 class fixedValue:
26         def __init__(self, value = ""):
27                 self.value = value
28
29 apModeConfig = ConfigSubsection()
30 apModeConfig.useap = ConfigYesNo(default = False)
31 apModeConfig.setupmode = ConfigSelection(default = "simple", choices = [ ("simple", "Simple"), ("advanced", "Advanced") ] )
32 #apModeConfig.wirelessdevice = fixedValue(value = "")
33 apModeConfig.branch = fixedValue(value = "br0")
34 apModeConfig.driver = fixedValue(value = "nl80211")
35 apModeConfig.wirelessmode = ConfigSelection(default = "g", choices = [ ("b", "802.11b"), ("a", "802.11a"), ("g", "802.11g") ] )
36 apModeConfig.channel = ConfigInteger(default = 1, limits = (1,13) )
37 apModeConfig.ssid = ConfigText(default = "Input SSID", visible_width = 50, fixed_size = False)
38 apModeConfig.beacon = ConfigInteger(default = 100, limits = (15,65535))
39 apModeConfig.rts_threshold = ConfigInteger(default = 2347, limits = (0,2347) )
40 apModeConfig.fragm_threshold = ConfigInteger(default = 2346, limits = (256,2346) )
41 apModeConfig.preamble = ConfigSelection(default = "0", choices = [ ("0", "Long"), ("1", "Short") ] )
42 apModeConfig.ignore_broadcast_ssid = ConfigSelection(default = "0", choices = [ ("0", _("disabled")), ("1", _("enabled")) ])
43
44 apModeConfig.encrypt = ConfigYesNo(default = False)
45 apModeConfig.method = ConfigSelection(default = "0", choices = [
46         ("0", _("WEP")), ("1", _("WPA")), ("2", _("WPA2")),("3", _("WPA/WPA2"))])
47 apModeConfig.wep = ConfigYesNo(default = False)
48 #apModeConfig.wep_default_key = ConfigSelection(default = "0", choices = [ ("0", "0"), ("1", "1"), ("2", "2"), ("3", "3") ] )
49 apModeConfig.wep_default_key = fixedValue(value = "0")
50 apModeConfig.wepType = ConfigSelection(default = "64", choices = [
51         ("64", _("Enable 64 bit (Input 10 hex keys)")), ("128", _("Enable 128 bit (Input 26 hex keys)"))])
52 apModeConfig.wep_key0 = ConfigPassword(default = "", visible_width = 50, fixed_size = False)
53 apModeConfig.wpa = ConfigSelection(default = "0", choices = [
54         ("0", _("not set")), ("1", _("WPA")), ("2", _("WPA2")),("3", _("WPA/WPA2"))])
55 apModeConfig.wpa_passphrase = ConfigPassword(default = "", visible_width = 50, fixed_size = False)
56 apModeConfig.wpagrouprekey = ConfigInteger(default = 600, limits = (0,3600))
57 apModeConfig.wpa_key_mgmt = fixedValue(value = "WPA-PSK")
58 apModeConfig.wpa_pairwise = fixedValue(value = "TKIP CCMP")
59 apModeConfig.rsn_pairwise = fixedValue(value = "CCMP")
60
61 apModeConfig.usedhcp = ConfigYesNo(default=True)
62 apModeConfig.address = ConfigIP(default = [0,0,0,0])
63 apModeConfig.netmask = ConfigIP(default = [255,0,0,0])
64 apModeConfig.gateway = ConfigIP(default = [0,0,0,0])
65
66 class WirelessAccessPoint(Screen,ConfigListScreen):
67         skin = """
68                 <screen position="center,center" size="590,450" title="Wireless Access Point" >
69                 <ePixmap pixmap="skin_default/buttons/red.png" position="20,0" size="140,40" alphatest="on" />
70                 <ePixmap pixmap="skin_default/buttons/green.png" position="160,0" size="140,40" alphatest="on" />
71                 <ePixmap pixmap="skin_default/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" />
72                 <ePixmap pixmap="skin_default/buttons/blue.png" position="440,0" size="140,40" alphatest="on" />
73
74                 <widget source="key_red" render="Label" position="20,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#9f1313" transparent="1" />
75                 <widget source="key_green" render="Label" position="160,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#1f771f" transparent="1" />
76                 <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#a08500" transparent="1" />
77                 <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#18188b" transparent="1" />
78
79                 <widget name="config" zPosition="2" position="10,70" size="580,270" scrollbarMode="showOnDemand" transparent="1" />
80                 <widget source="current_settings" render="Label" position="10,340" size="570,20" font="Regular;19" halign="center" valign="center" transparent="1" />
81                 <widget source="IPAddress_text" render="Label" position="130,370" size="190,21" font="Regular;19" transparent="1" />
82                 <widget source="Netmask_text" render="Label" position="130,395" size="190,21" font="Regular;19" transparent="1" />
83                 <widget source="Gateway_text" render="Label" position="130,420" size="190,21" font="Regular;19" transparent="1" />
84                 <widget source="IPAddress" render="Label" position="340,370" size="240,21" font="Regular;19" transparent="1" />
85                 <widget source="Netmask" render="Label" position="340,395" size="240,21" font="Regular;19" transparent="1" />
86                 <widget source="Gateway" render="Label" position="340,420" size="240,21" font="Regular;19" transparent="1" />
87                 </screen>"""
88
89         def __init__(self,session):
90                 Screen.__init__(self,session)
91                 self.session = session
92                 self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
93                 {
94                         "ok": self.doConfigMsg,
95                         "cancel": self.keyCancel,
96                         "red": self.keyCancel,
97                         "green": self.doConfigMsg,
98                 }, -2)
99                 self.list = []
100                 ConfigListScreen.__init__(self, self.list,session = self.session)
101                 self["key_red"] = StaticText(_("Cancel"))
102                 self["key_green"] = StaticText(_("Ok"))
103                 self["key_yellow"] = StaticText(_(" "))
104                 self["key_blue"] = StaticText(_(" "))
105                 self["current_settings"] = StaticText(_("Current settings (interface : br0)"))
106                 self["IPAddress_text"] = StaticText(_("IP Address"))
107                 self["Netmask_text"] = StaticText(_("Netmask"))
108                 self["Gateway_text"] = StaticText(_("Gateway"))
109                 self["IPAddress"] = StaticText(_("N/A"))
110                 self["Netmask"] = StaticText(_("N/A"))
111                 self["Gateway"] = StaticText(_("N/A"))
112                 self.wirelessAP = wirelessap.wirelessAP()
113                 self.checkRunHostapd()
114                 self.checkWirelessDevices()
115                 self.makeConfigList()
116                 self.loadInterfacesConfig()
117                 self.loadHostapConfig()
118                 self.setupCurrentEncryption()
119                 self.createConfigEntry()
120                 self.createConfig()
121                 self.onClose.append(self.__onClose)
122                 self.onLayoutFinish.append(self.checkwlanDeviceList)
123                 self.onLayoutFinish.append(self.currentNetworkSettings)
124                 self.checkwlanDeviceListTimer = eTimer()
125                 self.checkwlanDeviceListTimer.callback.append(self.WirelessDeviceNotDetectedMsg)
126
127         def checkwlanDeviceList(self):
128                 if len(self.wlanDeviceList) == 0:
129                         self.checkwlanDeviceListTimer.start(100,True)
130
131         def WirelessDeviceNotDetectedMsg(self):
132                 self.session.openWithCallback(self.close ,MessageBox, _("Wireless Lan Device is not detected."), MessageBox.TYPE_ERROR)
133
134         def currentNetworkSettings(self):
135                 self["IPAddress"].setText(self.formatAddr(iNetwork.getAdapterAttribute("br0", "ip")))
136                 self["Netmask"].setText(self.formatAddr(iNetwork.getAdapterAttribute("br0", "netmask")))
137                 self["Gateway"].setText(self.formatAddr(iNetwork.getAdapterAttribute("br0", "gateway")))
138
139         def formatAddr(self, address = [0,0,0,0]):
140                 if address is None:
141                         return "N/A"
142                 return "%d:%d:%d:%d"%(address[0],address[1],address[2],address[3])
143
144         def checkRunHostapd(self):
145                 global apModeConfig
146                 if fileExists("/var/run/hostapd", 0):
147                         apModeConfig.useap.value = True
148
149         def makeConfigList(self):
150                 global apModeConfig
151                 self.hostapdConfigList = {}
152                 self.hostapdConfigList["interface"] = apModeConfig.wirelessdevice
153                 self.hostapdConfigList["bridge"] = apModeConfig.branch # "br0"
154                 self.hostapdConfigList["driver"] = apModeConfig.driver # "nl80211"
155                 self.hostapdConfigList["hw_mode"] = apModeConfig.wirelessmode
156                 self.hostapdConfigList["channel"] = apModeConfig.channel
157                 self.hostapdConfigList["ssid"] = apModeConfig.ssid
158                 self.hostapdConfigList["beacon_int"] = apModeConfig.beacon
159                 self.hostapdConfigList["rts_threshold"] = apModeConfig.rts_threshold
160                 self.hostapdConfigList["fragm_threshold"] = apModeConfig.fragm_threshold
161                 self.hostapdConfigList["preamble"] = apModeConfig.preamble
162 #               self.hostapdConfigList["macaddr_acl"] = "" # fix to add Access Control List Editer
163 #               self.hostapdConfigList["accept_mac_file"] = "" # fix to add Access Control List Editer
164 #               self.hostapdConfigList["deny_mac_file"] = "" # fix to add Access Control List Editer
165                 self.hostapdConfigList["ignore_broadcast_ssid"] = apModeConfig.ignore_broadcast_ssid
166 #               self.hostapdConfigList["wmm_enabled"] = ""
167 #               self.hostapdConfigList["ieee80211n"] = ""
168 #               self.hostapdConfigList["ht_capab"] = ""
169                 self.hostapdConfigList["wep_default_key"] = apModeConfig.wep_default_key
170                 self.hostapdConfigList["wep_key0"] = apModeConfig.wep_key0
171                 self.hostapdConfigList["wpa"] = apModeConfig.wpa
172                 self.hostapdConfigList["wpa_passphrase"] = apModeConfig.wpa_passphrase
173                 self.hostapdConfigList["wpa_key_mgmt"] = apModeConfig.wpa_key_mgmt # "WPA-PSK"
174                 self.hostapdConfigList["wpa_pairwise"] = apModeConfig.wpa_pairwise # "TKIP CCMP"
175                 self.hostapdConfigList["rsn_pairwise"] = apModeConfig.rsn_pairwise # "CCMP"
176                 self.hostapdConfigList["wpa_group_rekey"] = apModeConfig.wpagrouprekey
177
178         def loadInterfacesConfig(self):
179                 global apModeConfig
180                 try:
181                         fp = file('/etc/network/interfaces', 'r')
182                         datas = fp.readlines()
183                         fp.close()
184                 except:
185                         printDebugMsg("interfaces - file open failed")
186                 # check br0 configuration
187                 current_iface = ""
188                 ifaceConf = {}
189                 try:
190                         for line in datas:
191                                 split = line.strip().split(' ')
192                                 if (split[0] == "iface"):
193                                         current_iface = split[1]
194                                         if (current_iface == "br0") and (len(split) == 4 and split[3] == "dhcp"):
195                                                 apModeConfig.usedhcp.value = True
196                                         else:
197                                                 apModeConfig.usedhcp.value = False
198                                 if (current_iface == "br0" or current_iface == "eth0"):
199                                         if (split[0] == "address"):
200                                                 apModeConfig.address.value = map(int, split[1].split('.'))
201                                         if (split[0] == "netmask"):
202                                                 apModeConfig.netmask.value = map(int, split[1].split('.'))
203                                         if (split[0] == "gateway"):
204                                                 apModeConfig.gateway.value = map(int, split[1].split('.'))
205                 except:
206                         printDebugMsg("configuration parsing error! - /etc/network/interfaces")
207
208         def loadHostapConfig(self):
209                 hostapdConf = { }
210                 ret = self.wirelessAP.loadHostapConfig(hostapdConf)
211                 if ret != 0:
212                         printDebugMsg("configuration opening failed!!")
213                         return
214                 for (key,value) in hostapdConf.items():
215                         if key == "config.wep":
216                                 apModeConfig.wep.value = int(value)
217                         elif key in ["channel", "beacon_int", "rts_threshold", "fragm_threshold", "wpa_group_rekey"]:
218                                 self.hostapdConfigList[key].value = int(value)
219                         elif key in self.hostapdConfigList.keys():
220                                 self.hostapdConfigList[key].value = value
221                         if key == "channel" and int(value) not in range(14):
222                                 self.hostapdConfigList[key].value = 1
223
224 #               for key in self.hostapdConfigList.keys():
225 #                       printDebugMsg("[cofigList] key : %s, value : %s"%(key, str(self.hostapdConfigList[key].value)) )
226
227         def setupCurrentEncryption(self):
228                 if apModeConfig.wpa.value is not "0" and apModeConfig.wpa_passphrase.value: # (1,WPA), (2,WPA2), (3,WPA/WPA2)
229                         apModeConfig.encrypt.value = True
230                         apModeConfig.method.value = apModeConfig.wpa.value
231                 elif apModeConfig.wep.value and apModeConfig.wep_key0.value:
232                         apModeConfig.encrypt.value = True
233                         apModeConfig.method.value = "0"
234                         if len(apModeConfig.wep_key0.value) > 10:
235                                 apModeConfig.wepType.value = "128"
236                 else:
237                         apModeConfig.encrypt.value = False
238
239         def createConfigEntry(self):
240                 global apModeConfig
241 #hostap settings
242                 self.useApEntry = getConfigListEntry(_("Use AP Mode"), apModeConfig.useap)
243                 self.setupModeEntry = getConfigListEntry(_("Setup Mode"), apModeConfig.setupmode)
244                 self.wirelessDeviceEntry = getConfigListEntry(_("AP Device"), apModeConfig.wirelessdevice)
245                 self.wirelessModeEntry = getConfigListEntry(_("AP Mode"), apModeConfig.wirelessmode)
246                 self.channelEntry = getConfigListEntry(_("Channel (1~13)"), apModeConfig.channel)
247                 self.ssidEntry = getConfigListEntry(_("SSID (1~32 Characters)"), apModeConfig.ssid)
248                 self.beaconEntry = getConfigListEntry(_("Beacon (15~65535)"), apModeConfig.beacon)
249                 self.rtsThresholdEntry = getConfigListEntry(_("RTS Threshold (0~2347)"), apModeConfig.rts_threshold)
250                 self.fragmThresholdEntry = getConfigListEntry(_("FRAGM Threshold (256~2346)"), apModeConfig.fragm_threshold)
251                 self.prambleEntry = getConfigListEntry(_("Preamble"), apModeConfig.preamble)
252                 self.ignoreBroadcastSsid = getConfigListEntry(_("Ignore Broadcast SSID"), apModeConfig.ignore_broadcast_ssid)
253 # hostap encryption
254                 self.encryptEntry = getConfigListEntry(_("Encrypt"), apModeConfig.encrypt)
255                 self.methodEntry = getConfigListEntry(_("Method"), apModeConfig.method)
256                 self.wepKeyTypeEntry = getConfigListEntry(_("KeyType"), apModeConfig.wepType)
257                 self.wepKey0Entry = getConfigListEntry(_("WEP Key (HEX)"), apModeConfig.wep_key0)
258                 self.wpaKeyEntry = getConfigListEntry(_("KEY (8~63 Characters)"), apModeConfig.wpa_passphrase)
259                 self.groupRekeyEntry = getConfigListEntry(_("Group Rekey Interval"), apModeConfig.wpagrouprekey)
260 # interface settings
261                 self.usedhcpEntry = getConfigListEntry(_("Use DHCP"), apModeConfig.usedhcp)
262                 self.ipEntry = getConfigListEntry(_("IP Address"), apModeConfig.address)
263                 self.netmaskEntry = getConfigListEntry(_("NetMask"), apModeConfig.netmask)
264                 self.gatewayEntry = getConfigListEntry(_("Gateway"), apModeConfig.gateway)
265
266         def createConfig(self):
267                 global apModeConfig
268                 self.configList = []
269                 self.configList.append( self.useApEntry )
270                 if apModeConfig.useap.value is True:
271                         self.configList.append( self.setupModeEntry )
272                         self.configList.append( self.wirelessDeviceEntry )
273                         self.configList.append( self.wirelessModeEntry )
274                         self.configList.append( self.channelEntry )
275                         self.configList.append( self.ssidEntry )
276                         if apModeConfig.setupmode.value  is "advanced":
277                                 self.configList.append( self.beaconEntry )
278                                 self.configList.append( self.rtsThresholdEntry )
279                                 self.configList.append( self.fragmThresholdEntry )
280                                 self.configList.append( self.prambleEntry )
281                                 self.configList.append( self.ignoreBroadcastSsid )
282                         self.configList.append( self.encryptEntry )
283                         if apModeConfig.encrypt.value is True:
284                                 self.configList.append( self.methodEntry )
285                                 if apModeConfig.method.value is "0": # wep
286                                         self.configList.append( self.wepKeyTypeEntry )
287                                         self.configList.append( self.wepKey0Entry )
288                                 else:
289                                         self.configList.append( self.wpaKeyEntry )
290                                         if apModeConfig.setupmode.value  is "advanced":
291                                                 self.configList.append( self.groupRekeyEntry )
292 ##              set network interfaces
293                         self.configList.append( self.usedhcpEntry )
294                         if apModeConfig.usedhcp.value is False:
295                                 self.configList.append( self.ipEntry )
296                                 self.configList.append( self.netmaskEntry )
297                                 self.configList.append( self.gatewayEntry )
298                 self["config"].list = self.configList
299                 self["config"].l.setList(self.configList)
300
301         def keyLeft(self):
302                 ConfigListScreen.keyLeft(self)
303                 self.newConfig()
304
305         def keyRight(self):
306                 ConfigListScreen.keyRight(self)
307                 self.newConfig()
308
309         def newConfig(self):
310                 if self["config"].getCurrent() in [ self.encryptEntry, self.methodEntry, self.useApEntry, self.usedhcpEntry, self.setupModeEntry]:
311                         self.createConfig()
312
313         def doConfigMsg(self):
314                 try:
315                         self.session.openWithCallback(self.doConfig, MessageBox, (_("Are you sure you want to setup your AP?\n\n") ) )
316                 except:
317                         printDebugMsg("doConfig failed")
318
319         def doConfig(self, ret = False):
320                 global apModeConfig
321                 if ret is not True:
322                         return
323                 if apModeConfig.useap.value is True and apModeConfig.encrypt.value is True:
324                         if not self.checkEncrypKey():
325                                 return
326                 if not self.checkConfig():
327                         return
328                 self.configStartMsg = self.session.openWithCallback(self.ConfigFinishedMsg, MessageBox, _("Please wait for AP Configuration....\n") , type = MessageBox.TYPE_INFO, enable_input = False)
329                 if apModeConfig.useap.value is True:
330                         self.networkRestart( nextFunc = self.makeConf )
331                 else:
332                         self.networkRestart( nextFunc = self.removeConf )
333
334         def checkEncrypKey(self):
335                 if apModeConfig.method.value == "0":
336                         if self.checkWep(apModeConfig.wep_key0.value) is False:
337                                 self.session.open(MessageBox, _("Invalid WEP key\n\n"), type = MessageBox.TYPE_ERROR, timeout = 10 )
338                         else:
339                                 return True
340                 else:
341                         if not len(apModeConfig.wpa_passphrase.value) in range(8,65):
342                                 self.session.open(MessageBox, _("Invalid WPA key\n\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
343                         else:
344                                 return True
345                 return False
346
347         def checkWep(self,  key):
348                 length = len(key)
349                 if length == 0:
350                         return False
351                 elif apModeConfig.wepType.value == "64" and length == 10:
352                         return True
353                 elif apModeConfig.wepType.value == "128" and length == 26:
354                         return True
355                 else:
356                         return False
357
358         def checkConfig(self):
359                 # ssid Check
360                 if len(apModeConfig.ssid.value) == 0 or len(apModeConfig.ssid.value) > 32:
361                         self.session.open(MessageBox, _("Invalid SSID\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
362                         return False;
363                 elif apModeConfig.channel.value not in range(1,14):
364                         self.session.open(MessageBox, _("Invalid channel\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
365                         return False;
366                 elif apModeConfig.beacon.value < 15 or apModeConfig.beacon.value > 65535:
367                         self.session.open(MessageBox, _("Invalid beacon\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
368                         return False;
369                 elif apModeConfig.rts_threshold.value < 0 or apModeConfig.rts_threshold.value > 2347:
370                         self.session.open(MessageBox, _("Invalid RTS Threshold\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
371                         return False;
372                 elif apModeConfig.fragm_threshold.value < 256 or apModeConfig.fragm_threshold.value > 2346:
373                         self.session.open(MessageBox, _("Invalid Fragm Threshold\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
374                         return False;
375                 elif apModeConfig.wpagrouprekey.value < 0 or apModeConfig.wpagrouprekey.value > 3600:
376                         self.session.open(MessageBox, _("Invalid wpagrouprekey\n"), type = MessageBox.TYPE_ERROR, timeout = 10)
377                         return False;
378                 return True;
379
380         def networkRestart(self, nextFunc = None ):
381                 self.networkRestart_stop( nextFunc = nextFunc )
382
383         def networkRestart_stop(self, nextFunc = None ):
384                 printDebugMsg("networkRestart_stop")
385                 self.msgPlugins(False)
386                 self.commands = [] # stop current network
387                 self.networkRestartConsole = Console()
388                 self.commands.append("/etc/init.d/avahi-daemon stop")
389                 for iface in iNetwork.getAdapterList():
390                         if iface != 'eth0' or not iNetwork.onRemoteRootFS():
391                                 self.commands.append("ifdown " + iface)
392                                 self.commands.append("ip addr flush dev " + iface)
393                 self.commands.append("/etc/init.d/hostapd stop")
394                 self.commands.append("/etc/init.d/networking stop")
395                 self.commands.append("killall -9 udhcpc")
396                 self.commands.append("rm /var/run/udhcpc*")
397                 self.networkRestartConsole.eBatch(self.commands, nextFunc, debug = True)
398
399         def makeConf(self,extra_args):
400                 printDebugMsg("makeConf")
401                 self.writeNetworkInterfaces()
402                 result = self.writeHostapdConfig()
403                 if result == -1:
404                         self.configStartMsg.close(False)
405                         return
406                 self.setIpForward(1)
407                 self.networkRestart_start()
408
409         def removeConf(self,extra_args):
410                 printDebugMsg("removeConf")
411                 if fileExists("/etc/hostapd.conf", 0):
412                         os_system("mv /etc/hostapd.conf /etc/hostapd.conf.linuxap.back")
413                 fp = file("/etc/network/interfaces", 'w')
414                 fp.write("# automatically generated by AP Setup Plugin\n# do NOT change manually!\n\n")
415                 fp.write("auto lo\n")
416                 fp.write("iface lo inet loopback\n\n")
417                 # eth0 setup
418                 fp.write("auto eth0\n")
419                 if apModeConfig.usedhcp.value is True:
420                         fp.write("iface eth0 inet dhcp\n")
421                 else:
422                         fp.write("iface eth0 inet static\n")
423                         fp.write("      address %d.%d.%d.%d\n" % tuple(apModeConfig.address.value) )
424                         fp.write("      netmask %d.%d.%d.%d\n" % tuple(apModeConfig.netmask.value) )
425                         fp.write("      gateway %d.%d.%d.%d\n" % tuple(apModeConfig.gateway.value) )
426                 fp.close()
427                 self.setIpForward(0)
428                 self.networkRestart_start()
429
430         def networkRestart_start(self):
431                 printDebugMsg("networkRestart_start")
432                 self.restartConsole = Console()
433                 self.commands = []
434                 self.commands.append("/etc/init.d/networking start")
435                 self.commands.append("/etc/init.d/avahi-daemon start")
436                 self.commands.append("/etc/init.d/hostapd start")
437                 self.restartConsole.eBatch(self.commands, self.networkRestartFinished, debug=True)
438
439         def networkRestartFinished(self, data):
440                 printDebugMsg("networkRestartFinished")
441                 iNetwork.removeAdapterAttribute('br0',"ip")
442                 iNetwork.removeAdapterAttribute('br0',"netmask")
443                 iNetwork.removeAdapterAttribute('br0',"gateway")
444                 iNetwork.getInterfaces(self.getInterfacesDataAvail)
445
446         def getInterfacesDataAvail(self, data):
447                 if data is True and self.configStartMsg is not None:
448                         self.configStartMsg.close(True)
449
450         def ConfigFinishedMsg(self, ret):
451                 if ret is True:
452                         self.session.openWithCallback(self.ConfigFinishedMsgCallback ,MessageBox, _("Configuration your AP is finished"), type = MessageBox.TYPE_INFO, timeout = 5, default = False)
453                 else:
454                         self.session.openWithCallback(self.close ,MessageBox, _("Invalid model or Image."), MessageBox.TYPE_ERROR)
455
456         def ConfigFinishedMsgCallback(self,data):
457                 self.close()
458
459         def msgPlugins(self,reason = False):
460                 for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ):
461                                 p(reason=reason)
462
463         def writeNetworkInterfaces(self):
464                 global apModeConfig
465                 fp = file("/etc/network/interfaces", 'w')
466                 fp.write("# automatically generated by AP Setup Plugin\n# do NOT change manually!\n\n")
467                 fp.write("auto lo\n")
468                 fp.write("iface lo inet loopback\n\n")
469                 # eth0 setup
470                 fp.write("auto eth0\n")
471                 fp.write("iface eth0 inet manual\n")
472                 fp.write("      up ip link set $IFACE up\n")
473                 fp.write("      down ip link set $IFACE down\n\n")
474                 # Wireless device setup
475                 fp.write("auto %s\n" % apModeConfig.wirelessdevice.value)
476                 fp.write("iface %s inet manual\n" % apModeConfig.wirelessdevice.value)
477                 fp.write("      up ip link set $IFACE up\n")
478                 fp.write("      down ip link set $IFACE down\n")
479                 # branch setup
480                 fp.write("auto br0\n")
481                 if apModeConfig.usedhcp.value is True:
482                         fp.write("iface br0 inet dhcp\n")
483                 else:
484                         fp.write("iface br0 inet static\n")
485                         fp.write("      address %d.%d.%d.%d\n" % tuple(apModeConfig.address.value) )
486                         fp.write("      netmask %d.%d.%d.%d\n" % tuple(apModeConfig.netmask.value) )
487                         fp.write("      gateway %d.%d.%d.%d\n" % tuple(apModeConfig.gateway.value) )
488                 fp.write("      pre-up brctl addbr br0\n")
489                 fp.write("      pre-up brctl addif br0 eth0\n")
490 #               fp.write("      pre-up brctl addif br0 wlan0\n") // runned by hostpad
491                 fp.write("      post-down brctl delif br0 eth0\n")
492 #               fp.write("      post-down brctl delif br0 wlan0\n") // runned by hostpad
493                 fp.write("      post-down brctl delbr br0\n\n")
494                 fp.write("\n")
495                 fp.close()
496
497         def writeHostapdConfig(self): #c++
498                 global apModeConfig
499                 configDict = {}
500                 for key in self.hostapdConfigList.keys():
501                         configDict[key] = str(self.hostapdConfigList[key].value)
502                 configDict["config.encrypt"] = str(int(apModeConfig.encrypt.value))
503                 configDict["config.method"] = apModeConfig.method.value
504                 ret = self.wirelessAP.writeHostapdConfig(configDict)
505                 if(ret != 0):
506                         return -1
507                 return 0
508
509         def setIpForward(self, setValue = 0):
510                 ipForwardFilePath = "/proc/sys/net/ipv4/ip_forward"
511                 if not fileExists(ipForwardFilePath):
512                         return -1
513                 printDebugMsg("set %s to %d" % (ipForwardFilePath, setValue))
514                 f = open(ipForwardFilePath, "w")
515                 f.write("%d" % setValue)
516                 f.close()
517                 sysctlPath = "/etc/sysctl.conf"
518                 sysctlLines = []
519                 if fileExists(sysctlPath):
520                         fp = file(sysctlPath, "r")
521                         sysctlLines = fp.readlines()
522                         fp.close()
523                 sysctlList = {}
524                 for line in sysctlLines:
525                         line = line.strip()
526                         try:
527                                 (key,value) = line.split("=")
528                                 key=key.strip()
529                                 value=value.strip()
530                         except:
531                                 continue
532                         sysctlList[key] = value
533                 sysctlList["net.ipv4.ip_forward"] = str(setValue)
534                 fp = file(sysctlPath, "w")
535                 for (key,value) in sysctlList.items():
536                         fp.write("%s=%s\n"%(key,value))
537                 fp.close()
538                 return 0
539
540         def checkWirelessDevices(self):
541                 global apModeConfig
542                 self.wlanDeviceList = []
543                 wlanIfaces =[]
544                 for x in iNetwork.getInstalledAdapters():
545                         if x.startswith('eth') or x.startswith('br') or x.startswith('mon'):
546                                 continue
547                         wlanIfaces.append(x)
548                         description=self.getAdapterDescription(x)
549                         if description == "Unknown network adapter":
550                                 self.wlanDeviceList.append((x, x))
551                         else:
552                                 self.wlanDeviceList.append(( x, description + " (%s)"%x ))
553                 apModeConfig.wirelessdevice = ConfigSelection( choices = self.wlanDeviceList )
554
555         def getAdapterDescription(self, iface):
556                 classdir = "/sys/class/net/" + iface + "/device/"
557                 driverdir = "/sys/class/net/" + iface + "/device/driver/"
558                 if os_path.exists(classdir):
559                         files = listdir(classdir)
560                         if 'driver' in files:
561                                 if os_path.realpath(driverdir).endswith('rtw_usb_drv'):
562                                         return _("Realtek")+ " " + _("WLAN adapter.")
563                                 elif os_path.realpath(driverdir).endswith('ath_pci'):
564                                         return _("Atheros")+ " " + _("WLAN adapter.")
565                                 elif os_path.realpath(driverdir).endswith('zd1211b'):
566                                         return _("Zydas")+ " " + _("WLAN adapter.")
567                                 elif os_path.realpath(driverdir).endswith('rt73'):
568                                         return _("Ralink")+ " " + _("WLAN adapter.")
569                                 elif os_path.realpath(driverdir).endswith('rt73usb'):
570                                         return _("Ralink")+ " " + _("WLAN adapter.")
571                                 else:
572                                         return str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter")
573                         else:
574                                 return _("Unknown network adapter")
575                 else:
576                         return _("Unknown network adapter")
577
578         def __onClose(self):
579                 for x in self["config"].list:
580                         x[1].cancel()
581                 apModeConfig.wpa.value = "0"
582                 apModeConfig.wep.value = False
583
584         def keyCancel(self):
585                 self.close()
586
587 def main(session, **kwargs):
588         session.open(WirelessAccessPoint)
589
590 def Plugins(**kwargs):
591         return [PluginDescriptor(name=_("Wireless Access Point"), description="Using a Wireless module as access point.", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = True, fnc=main)]
592