tokenhub.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. # vim: set expandtab tabstop=4 shiftwidth=4:
  4. """
  5. $Id$
  6. This file is part of the xsser project, http://xsser.03c8.net
  7. Copyright (c) 2011/2016 psy <epsylon@riseup.net>
  8. xsser is free software; you can redistribute it and/or modify it under
  9. the terms of the GNU General Public License as published by the Free
  10. Software Foundation version 3 of the License.
  11. xsser is distributed in the hope that it will be useful, but WITHOUT ANY
  12. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  13. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  14. details.
  15. You should have received a copy of the GNU General Public License along
  16. with xsser; if not, write to the Free Software Foundation, Inc., 51
  17. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  18. """
  19. from threading import Thread
  20. import socket
  21. import time
  22. class ReceiverThread(Thread):
  23. def __init__(self, client, addr, parent):
  24. Thread.__init__(self)
  25. self.daemon = True
  26. self.client = client
  27. self.parent = parent
  28. def run(self):
  29. data = self.client.recv(1024)
  30. if data:
  31. self.parent.data_arrived(data)
  32. self.client.send('thanks for coming!')
  33. self.client.close()
  34. self.parent.client_finished(self)
  35. class HubThread(Thread):
  36. def __init__(self, parent):
  37. Thread.__init__(self)
  38. self.daemon = True
  39. self._clients = []
  40. self._armed = True
  41. self.ready = False
  42. self.running =False
  43. self.parent = parent
  44. def url_request(self, url):
  45. split_url = url.split("/")
  46. if len(split_url) > 2:
  47. if split_url[1] == 'success':
  48. self.parent.token_arrived(split_url[2])
  49. def data_arrived(self, data):
  50. data.split("\n")[0]
  51. if data.startswith("GET"):
  52. split_data = data.split()
  53. if len(split_data) > 1:
  54. self.url_request(split_data[1])
  55. def client_finished(self, _thread):
  56. self._clients.remove(_thread)
  57. def shutdown(self):
  58. if self.ready:
  59. self.socket.shutdown(socket.SHUT_RDWR)
  60. self.socket.close()
  61. self.running = False
  62. self._armed = False
  63. self.ready = False
  64. def run(self):
  65. while not self.running and self._armed:
  66. try:
  67. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  68. s.bind(('localhost', 19084))
  69. self.running = True
  70. except socket.error as e:
  71. #print("socket busy, retry opening")
  72. if e.errno == 98: # its in use wait a bit and retry
  73. time.sleep(3)
  74. if not self._armed:
  75. return
  76. self.socket = s
  77. self.ready = True
  78. s.listen(1)
  79. while self.running and self._armed:
  80. try:
  81. conn, addr = s.accept()
  82. except socket.timeout:
  83. pass
  84. except socket.error, e:
  85. if self.ready == False:
  86. return
  87. else:
  88. break
  89. else:
  90. t = ReceiverThread(conn, addr, self)
  91. t.start()
  92. self._clients.append(t)
  93. if self.ready:
  94. s.close()
  95. self.ready = False