~ubuntu-branches/ubuntu/utopic/exabgp/utopic

« back to all changes in this revision

Viewing changes to QA/sbin/recorder-listener

  • Committer: Package Import Robot
  • Author(s): Henry-Nicolas Tourneur
  • Date: 2014-03-08 19:07:00 UTC
  • mfrom: (1.1.8)
  • Revision ID: package-import@ubuntu.com-20140308190700-xjbibpg1g6001c9x
Tags: 3.3.1-1
* New upstream release
* Bump python minimal required version (2.7)
* Closes: #726066 Debian packaging improvements proposed by Vincent Bernat
* Closes: #703774 not existent rundir (/var/run/exabgp) after reboot

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
 
3
 
import os
4
 
import sys
5
 
import pwd
6
 
import time
7
 
import asyncore
8
 
import socket
9
 
import errno
10
 
from struct import unpack
11
 
 
12
 
def dump (value):
13
 
        def spaced (value):
14
 
                even = None
15
 
                for v in value:
16
 
                        if even is False:
17
 
                                yield ' '
18
 
                        yield '%02X' % ord(v)
19
 
                        even = not even
20
 
        return ''.join(spaced(value))
21
 
 
22
 
class RecordHandler(asyncore.dispatcher_with_send):
23
 
        raw = True
24
 
 
25
 
        def setup (self,name,ip,port):
26
 
                now = time.strftime("%a-%d-%b-%Y-%H:%M:%S", time.gmtime())
27
 
                self.record = open("%s-%s" % (name,now),'w')
28
 
                if not self.raw:
29
 
                        self.record.write('Connection from %s:%d\n' % (ip,port))
30
 
 
31
 
        def handle_read (self):
32
 
                try:
33
 
                        _read_size = 10240
34
 
                        count = 0
35
 
                        space = False
36
 
                        while True:
37
 
                                try:
38
 
                                        bytes = self.recv(_read_size)
39
 
                                except socket.error, e:
40
 
                                        if e.errno in (errno.EWOULDBLOCK,errno.EAGAIN):
41
 
                                                continue
42
 
                                        raise e
43
 
                                if not bytes:
44
 
                                        print "connection closed"
45
 
                                        break
46
 
 
47
 
                                if len(bytes) == _read_size:
48
 
                                        print '.',
49
 
                                else:
50
 
                                        print "%d" % len(bytes),
51
 
                                sys.stdout.flush()
52
 
 
53
 
                                if self.raw:
54
 
                                        self.record.write(bytes)
55
 
                                        self.record.flush()
56
 
                                        if not bytes:
57
 
                                                break
58
 
                                        continue
59
 
 
60
 
                                for byte in bytes:
61
 
                                        self.record.write('%02X' % ord(byte))
62
 
                                        count = (count + 1) % 32
63
 
                                        if not count:
64
 
                                                self.record.write('\n')
65
 
                                                space = False
66
 
                                                continue
67
 
                                        if space:
68
 
                                                self.record.write(' ')
69
 
                                        space = not space
70
 
                                self.record.flush()
71
 
 
72
 
                        self.record.close()
73
 
                except KeyboardInterrupt:
74
 
                        self.record.close()
75
 
                        self.close()
76
 
 
77
 
class RecordServer(asyncore.dispatcher):
78
 
        def __init__(self, host, port,name):
79
 
                asyncore.dispatcher.__init__(self)
80
 
                self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
81
 
                self.set_reuse_addr()
82
 
                self.bind((host, port))
83
 
                self.listen(5)
84
 
                self.name = name
85
 
 
86
 
        def handle_accept(self):
87
 
                pair = self.accept()
88
 
                if pair is not None:
89
 
                        sock, (ip,port) = pair
90
 
                        print "new BGP connection from %s:%d" % (ip, port)
91
 
                        handler = RecordHandler(sock).setup(self.name,ip,port)
92
 
 
93
 
def drop ():
94
 
        uid = os.getuid()
95
 
        gid = os.getgid()
96
 
 
97
 
        if uid and gid:
98
 
                return
99
 
 
100
 
        for name in ['nobody',]:
101
 
                try:
102
 
                        user = pwd.getpwnam(name)
103
 
                        nuid = int(user.pw_uid)
104
 
                        ngid = int(user.pw_uid)
105
 
                except KeyError:
106
 
                        pass
107
 
 
108
 
        if not gid:
109
 
                os.setgid(ngid)
110
 
        if not uid:
111
 
                os.setuid(nuid)
112
 
 
113
 
# IP, port, file
114
 
server = RecordServer(sys.argv[1], int(sys.argv[2]), sys.argv[3])
115
 
drop()
116
 
try:
117
 
        asyncore.loop()
118
 
except (KeyboardInterrupt,SystemExit):
119
 
        pass