Changeset 45
- Timestamp:
- 02/11/04 22:48:18 (5 years ago)
- Files:
-
- trunk/TODO (modified) (1 diff)
- trunk/jjigw.dtd (modified) (2 diffs)
- trunk/jjigw.py (modified) (11 diffs)
- trunk/spidentd.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/TODO
r34 r45 3 3 which is not yet supported by PyXMPP, but with jabber:component:accept could 4 4 also be done). 5 - simple ident server with "uplink" capability6 5 - channel list browsing (using Service Discovery) 7 6 - more IRC stream error handling 7 - remove unneeded debuging code trunk/jjigw.dtd
r36 r45 1 1 2 <!ELEMENT jjigw (connect, network+) >2 <!ELEMENT jjigw (connect,spidentd?,network+) > 3 3 4 4 <!ELEMENT connect (host,port,secret) > … … 6 6 <!ELEMENT port (#PCDATA) > 7 7 <!ELEMENT secret (#PCDATA) > 8 9 <!ELEMENT spidentd (socket) > 10 <!ELEMENT socket (#PCDATA) > 8 11 9 12 <!ELEMENT network (server+,channel*) > trunk/jjigw.py
r40 r45 12 12 import random 13 13 import signal 14 import Queue 15 import time 14 16 15 17 from pyxmpp import ClientStream,JID,Iq,Presence,Message,StreamError … … 91 93 self.port=int(node.xpathEval("port")[0].getContent()) 92 94 self.secret=node.xpathEval("secret")[0].getContent() 95 96 class SPIdentDConfig: 97 def __init__(self,node): 98 node=node.xpathEval("socket")[0] 99 self.socket=node.getContent() 93 100 94 101 class ServerConfig: … … 152 159 self.connect=ConnectConfig(self.doc.xpathEval("jjigw/connect")[0]) 153 160 self.network=NetworkConfig(self.doc.xpathEval("jjigw/network")[0]) 161 spidentd=self.doc.xpathEval("jjigw/spidentd") 162 if spidentd: 163 self.spidentd=SPIdentDConfig(spidentd[0]) 164 else: 165 self.spidentd=None 154 166 def __del__(self): 155 167 if self.doc: … … 581 593 self.network=config.network 582 594 self.default_encoding=self.network.default_encoding 595 self.conninfo=None 583 596 nick=nick.encode(self.default_encoding,"strict") 584 597 if not self.network.valid_nick(nick): … … 722 735 self.socket.close() 723 736 self.socket=None 737 if self.conninfo: 738 self.component.unregister_connection(self.conninfo) 739 self.conninfo=None 724 740 finally: 725 741 self.lock.release() … … 730 746 self.exit="No servers left, quitting" 731 747 return 748 if self.conninfo: 749 self.component.unregister_connection(self.conninfo) 750 self.conninfo=None 732 751 if self.socket: 733 752 self.socket.close() … … 743 762 try: 744 763 self.socket.close() 764 if self.conninfo: 765 self.component.unregister_connection(self.conninfo) 766 self.conninfo=None 745 767 except: 746 768 pass … … 748 770 return 749 771 self._send("NICK %s" % (self.nick,)) 750 user=sha.new(self.jid.bare().as_string()).hexdigest() 772 user=sha.new(self.jid.bare().as_string()).hexdigest()[:64] 773 self.conninfo=ConnectionInfo(self.socket,user) 774 self.component.register_connection(self.conninfo) 751 775 self._send("USER %s 0 * :JJIGW User %s" % (user,user)) 752 776 self.server=server … … 1053 1077 self.component.print_exception() 1054 1078 1079 class ConnectionInfo: 1080 def __init__(self,socket,user): 1081 self.localip,self.localport=socket.getsockname() 1082 self.remoteip,self.remoteport=socket.getpeername() 1083 self.user=user 1084 1085 class SPIdentD: 1086 def __init__(self,component,config): 1087 self.socket_path=config.socket 1088 self.component=component 1089 self.socket=None 1090 self.queue=Queue.Queue(100) 1091 self.thread=threading.Thread(target=self.run_thread) 1092 self.thread.setDaemon(1) 1093 self.thread.start() 1094 1095 def run_thread(self): 1096 while not self.component.shutdown: 1097 self.socket=socket.socket(socket.AF_UNIX) 1098 try: 1099 try: 1100 self.socket.connect(self.socket_path) 1101 self.loop() 1102 except socket.error: 1103 self.print_exception() 1104 pass 1105 finally: 1106 try: 1107 self.socket.close() 1108 except: 1109 pass 1110 self.socket=None 1111 if not self.component.shutdown: 1112 print >>sys.stderr,"Waiting before spidentd connection restart..." 1113 time.sleep(10) 1114 1115 def loop(self): 1116 while not self.component.shutdown: 1117 try: 1118 item=self.queue.get(1,1) 1119 except Queue.Empty: 1120 continue 1121 while item: 1122 try: 1123 if item[0]=="add": 1124 ci=item[1] 1125 self.socket.send("add %s:%i %s:%i %s\n" % ( 1126 ci.localip,ci.localport,ci.remoteip,ci.remoteport,ci.user)) 1127 elif item[0]=="remove": 1128 ci=item[1] 1129 self.socket.send("remove %s:%i %s:%i\n" % ( 1130 ci.localip,ci.localport,ci.remoteip,ci.remoteport)) 1131 except socket.error: 1132 self.queue.put(item) 1133 raise 1134 try: 1135 item=self.queue.get(0) 1136 except Queue.Empty: 1137 break 1138 1139 def register_connection(self,conninfo): 1140 self.queue.put(("add",conninfo)) 1141 1142 def unregister_connection(self,conninfo): 1143 self.queue.put(("remove",conninfo)) 1144 1145 def debug(self,msg): 1146 self.component.debug(msg) 1147 1148 def print_exception(self): 1149 self.component.print_exception() 1150 1055 1151 class Component(pyxmpp.jabberd.Component): 1056 1152 def __init__(self,config): … … 1064 1160 self.irc_sessions={} 1065 1161 self.config=config 1162 if config.spidentd: 1163 self.ident_handler=SPIdentD(self,config.spidentd) 1164 else: 1165 self.ident_handler=None 1066 1166 1067 1167 def signal_handler(self,signum,frame): … … 1281 1381 return 1 1282 1382 1383 def register_connection(self,conninfo): 1384 if self.ident_handler: 1385 self.ident_handler.register_connection(conninfo) 1386 1387 def unregister_connection(self,conninfo): 1388 if self.ident_handler: 1389 self.ident_handler.unregister_connection(conninfo) 1390 1283 1391 try: 1284 1392 config=Config("jjigw.xml") trunk/spidentd.py
r43 r45 130 130 return line 131 131 if len(self.buf)>1024: 132 print >>sys.stderr,"Input line too long "132 print >>sys.stderr,"Input line too long: %r" % (self.buf,) 133 133 return None 134 134 r=self.socket.recv(1024)
