Changeset 43

Show
Ignore:
Timestamp:
02/11/04 21:52:10 (5 years ago)
Author:
jajcus
Message:

- programming seems to work :)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/spidentd.py

    • Property svn:eol-style deleted
    • Property svn:executable deleted
    • Property svn:keywords deleted
    r42 r43  
    1313import grp 
    1414import getopt 
     15import re 
    1516 
    1617class Driver: 
     
    7475 
    7576class SocketDriverClient: 
    76         def __init_(self,driver,sock): 
     77        add_re=re.compile(r"add (\d+\.\d+\.\d+\.\d+):(\d+) (\d+\.\d+\.\d+\.\d+):(\d+) (.*)") 
     78        remove_re=re.compile(r"remove (\d+\.\d+\.\d+\.\d+):(\d+) (\d+\.\d+\.\d+\.\d+):(\d+)") 
     79        def __init__(self,driver,sock): 
    7780                self.socket=sock 
     81                self.driver=driver 
    7882                self.thread=threading.Thread(target=self.run_thread) 
    7983                self.thread.setDaemon(1) 
    8084                self.conn_users={} 
    81                 self.thread.run() 
     85                self.buf="" 
     86                self.thread.start() 
     87 
     88        def run_thread(self): 
     89                try: 
     90                        self._run_thread() 
     91                finally: 
     92                        self.conn_users={} 
     93                        try: 
     94                                self.driver.clients.remove(self) 
     95                        except ValueError: 
     96                                pass 
     97                        try: 
     98                                self.sock.close() 
     99                        except: 
     100                                pass 
     101                                 
     102        def _run_thread(self): 
     103                global exit 
     104                while not exit: 
     105                        l=self.read_line() 
     106                        if not l: 
     107                                break 
     108                        print >>sys.stderr,"Got %r on programming socket" % (l,) 
     109                        m=self.add_re.match(l) 
     110                        if m: 
     111                                localip,localport,remoteip,remoteport,user=m.groups() 
     112                                self.conn_users[(int(localport),localip, 
     113                                                int(remoteport),remoteip)]=user 
     114                                continue 
     115                        m=self.remove_re.match(l) 
     116                        if m: 
     117                                localip,localport,remoteip,remoteport=m.groups() 
     118                                try: 
     119                                        del self.conn_users[(int(localport),localip, 
     120                                                        int(remoteport),remoteip)] 
     121                                except KeyError: 
     122                                        pass 
     123                                continue 
     124                        print >>sys.stderr,"Bad protocol on programming socket" 
     125                         
     126        def read_line(self): 
     127                while 1: 
     128                        if "\n" in self.buf: 
     129                                line,self.buf=self.buf.split("\n",1) 
     130                                return line 
     131                        if len(self.buf)>1024: 
     132                                print >>sys.stderr,"Input line too long" 
     133                                return None 
     134                        r=self.socket.recv(1024) 
     135                        if not r: 
     136                                return None 
     137                        self.buf+=r 
     138         
    82139 
    83140class SocketDriver(Driver): 
    84141        def __init__(self,path): 
    85142                self.socket=socket.socket(socket.AF_UNIX) 
     143                try: 
     144                        os.unlink(path) 
     145                except: 
     146                        pass 
    86147                self.socket.bind(path) 
    87148                self.socket.listen(1) 
     
    90151        def lookup(self,localport,localip,remoteport,remoteip): 
    91152                for c in self.clients: 
    92                         connuser=c.conn_users.get[(localport,localip,remoteport,remoteip)] 
     153                        connuser=c.conn_users.get((localport,localip,remoteport,remoteip)) 
    93154                        if connuser: 
    94155                                return connuser 
     
    124185                        sock.close() 
    125186                        return 
    126                 if buf.find("\r\n")
     187                if buf.find("\r\n")>=0
    127188                        break 
    128189        query=buf.split("\r",1)[0] 
     
    245306 
    246307sock=socket.socket() 
    247 sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
     308try: 
     309        sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
     310except: 
     311        pass 
    248312sock.bind((ip,port)) 
    249313