hostapd.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #!/usr/bin/python
  2. #
  3. # Python class for controlling hostapd
  4. # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  5. #
  6. # This software may be distributed under the terms of the BSD license.
  7. # See README for more details.
  8. import os
  9. import time
  10. import logging
  11. import wpaspy
  12. logger = logging.getLogger()
  13. hapd_ctrl = '/var/run/hostapd'
  14. hapd_global = '/var/run/hostapd-global'
  15. class HostapdGlobal:
  16. def __init__(self):
  17. self.ctrl = wpaspy.Ctrl(hapd_global)
  18. def add(self, ifname):
  19. res = self.ctrl.request("ADD " + ifname + " " + hapd_ctrl)
  20. if not "OK" in res:
  21. raise Exception("Could not add hostapd interface " + ifname)
  22. def remove(self, ifname):
  23. self.ctrl.request("REMOVE " + ifname)
  24. class Hostapd:
  25. def __init__(self, ifname):
  26. self.ifname = ifname
  27. self.ctrl = wpaspy.Ctrl(os.path.join(hapd_ctrl, ifname))
  28. def request(self, cmd):
  29. logger.debug(self.ifname + ": CTRL: " + cmd)
  30. return self.ctrl.request(cmd)
  31. def ping(self):
  32. return "PONG" in self.request("PING")
  33. def set(self, field, value):
  34. logger.debug(self.ifname + ": SET " + field + "=" + value)
  35. if not "OK" in self.request("SET " + field + " " + value):
  36. raise Exception("Failed to set hostapd parameter " + field)
  37. def set_defaults(self):
  38. self.set("driver", "nl80211")
  39. self.set("hw_mode", "g")
  40. self.set("channel", "1")
  41. self.set("ieee80211n", "1")
  42. self.set("logger_stdout", "-1")
  43. self.set("logger_stdout_level", "0")
  44. def set_open(self, ssid):
  45. self.set_defaults()
  46. self.set("ssid", ssid)
  47. def set_wpa2_psk(self, ssid, passphrase):
  48. self.set_defaults()
  49. self.set("ssid", ssid)
  50. self.set("wpa_passphrase", passphrase)
  51. self.set("wpa", "2")
  52. self.set("wpa_key_mgmt", "WPA-PSK")
  53. self.set("rsn_pairwise", "CCMP")
  54. def set_wpa_psk(self, ssid, passphrase):
  55. self.set_defaults()
  56. self.set("ssid", ssid)
  57. self.set("wpa_passphrase", passphrase)
  58. self.set("wpa", "1")
  59. self.set("wpa_key_mgmt", "WPA-PSK")
  60. self.set("wpa_pairwise", "TKIP")
  61. def set_wpa_psk_mixed(self, ssid, passphrase):
  62. self.set_defaults()
  63. self.set("ssid", ssid)
  64. self.set("wpa_passphrase", passphrase)
  65. self.set("wpa", "3")
  66. self.set("wpa_key_mgmt", "WPA-PSK")
  67. self.set("wpa_pairwise", "TKIP")
  68. self.set("rsn_pairwise", "CCMP")
  69. def set_wep(self, ssid, key):
  70. self.set_defaults()
  71. self.set("ssid", ssid)
  72. self.set("wep_key0", key)
  73. def enable(self):
  74. if not "OK" in self.ctrl.request("ENABLE"):
  75. raise Exception("Failed to enable hostapd interface " + self.ifname)
  76. def disable(self):
  77. if not "OK" in self.ctrl.request("ENABLE"):
  78. raise Exception("Failed to disable hostapd interface " + self.ifname)
  79. def add_ap(ifname, params):
  80. logger.info("Starting AP " + ifname)
  81. hapd_global = HostapdGlobal()
  82. hapd_global.remove(ifname)
  83. hapd_global.add(ifname)
  84. hapd = Hostapd(ifname)
  85. if not hapd.ping():
  86. raise Exception("Could not ping hostapd")
  87. hapd.set_defaults()
  88. fields = [ "ssid", "wpa_passphrase", "nas_identifier", "wpa_key_mgmt",
  89. "wpa",
  90. "wpa_pairwise", "rsn_pairwise", "auth_server_addr" ]
  91. for field in fields:
  92. if field in params:
  93. hapd.set(field, params[field])
  94. for f,v in params.items():
  95. if f in fields:
  96. continue
  97. if isinstance(v, list):
  98. for val in v:
  99. hapd.set(f, val)
  100. else:
  101. hapd.set(f, v)
  102. hapd.enable()
  103. def wpa2_params(ssid=None, passphrase=None):
  104. params = { "wpa": "2",
  105. "wpa_key_mgmt": "WPA-PSK",
  106. "rsn_pairwise": "CCMP" }
  107. if ssid:
  108. params["ssid"] = ssid
  109. if passphrase:
  110. params["wpa_passphrase"] = passphrase
  111. return params
  112. def wpa_params(ssid=None, passphrase=None):
  113. params = { "wpa": "1",
  114. "wpa_key_mgmt": "WPA-PSK",
  115. "wpa_pairwise": "TKIP" }
  116. if ssid:
  117. params["ssid"] = ssid
  118. if passphrase:
  119. params["wpa_passphrase"] = passphrase
  120. return params
  121. def wpa_mixed_params(ssid=None, passphrase=None):
  122. params = { "wpa": "3",
  123. "wpa_key_mgmt": "WPA-PSK",
  124. "wpa_pairwise": "TKIP",
  125. "rsn_pairwise": "CCMP" }
  126. if ssid:
  127. params["ssid"] = ssid
  128. if passphrase:
  129. params["wpa_passphrase"] = passphrase
  130. return params
  131. def radius_params():
  132. params = { "auth_server_addr": "127.0.0.1",
  133. "auth_server_port": "1812",
  134. "auth_server_shared_secret": "radius",
  135. "nas_identifier": "nas.w1.fi" }
  136. return params
  137. def wpa2_eap_params(ssid=None):
  138. params = radius_params()
  139. params["wpa"] = "2"
  140. params["wpa_key_mgmt"] = "WPA-EAP"
  141. params["rsn_pairwise"] = "CCMP"
  142. params["ieee8021x"] = "1"
  143. if ssid:
  144. params["ssid"] = ssid
  145. return params