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

« back to all changes in this revision

Viewing changes to etc/exabgp/processes/read-write.py

  • 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 errno
 
6
import fcntl
 
7
import select
 
8
 
 
9
errno_block = set((
 
10
        errno.EINPROGRESS, errno.EALREADY,
 
11
        errno.EAGAIN, errno.EWOULDBLOCK,
 
12
        errno.EINTR, errno.EDEADLK,
 
13
        errno.EBUSY, errno.ENOBUFS,
 
14
        errno.ENOMEM,
 
15
))
 
16
 
 
17
errno_fatal = set((
 
18
        errno.ECONNABORTED, errno.EPIPE,
 
19
        errno.ECONNREFUSED, errno.EBADF,
 
20
        errno.ESHUTDOWN, errno.ENOTCONN,
 
21
        errno.ECONNRESET, errno.ETIMEDOUT,
 
22
        errno.EINVAL,
 
23
))
 
24
 
 
25
errno_unavailable = set((
 
26
        errno.ECONNREFUSED, errno.EHOSTUNREACH,
 
27
))
 
28
 
 
29
def async (fd):
 
30
        try:
 
31
                fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK)
 
32
                return True
 
33
        except IOError:
 
34
                return False
 
35
 
 
36
def sync (fd):
 
37
        try:
 
38
                fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NDELAY)
 
39
                return True
 
40
        except IOError:
 
41
                return False
 
42
 
 
43
if not async(sys.stdin):
 
44
        print >> sys.stderr, "could not set stdin/stdout non blocking"
 
45
        sys.stderr.flush()
 
46
        sys.exit(1)
 
47
 
 
48
def _reader ():
 
49
        received = ''
 
50
 
 
51
        while True:
 
52
                try:
 
53
                        data = sys.stdin.read(4096)
 
54
                except IOError,e:
 
55
                        if e.args[0] in errno_block:
 
56
                                yield ''
 
57
                                continue
 
58
                        elif e.args[0] in errno_fatal:
 
59
                                print >> sys.stderr, "fatal error while reading on stdin : %s" % str(e)
 
60
                                sys.exit(1)
 
61
 
 
62
 
 
63
                received += data
 
64
                if '\n' in received:
 
65
                        line,received = received.split('\n',1)
 
66
                        yield line + '\n'
 
67
                else:
 
68
                        yield ''
 
69
 
 
70
reader = _reader().next
 
71
 
 
72
 
 
73
def write (data='',left=''):
 
74
        left += data
 
75
        try:
 
76
                if left:
 
77
                        number = sys.stdout.write(left)
 
78
                        left = left[number:]
 
79
                        sys.stdout.flush()
 
80
        except IOError,e:
 
81
                if e.args[0] in errno_block:
 
82
                        return not not left
 
83
                elif e.args[0] in errno_fatal:
 
84
                        # this may not send anything ...
 
85
                        print >> sys.stderr, "fatal error while reading on stdin : %s" % str(e)
 
86
                        sys.stderr.flush()
 
87
                        sys.exit(1)
 
88
 
 
89
        return not not left
 
90
 
 
91
def read (timeout):
 
92
        try:
 
93
                r, w, x = select.select([sys.stdin], [], [sys.stdin,], timeout)
 
94
        except IOError, e:
 
95
                if e.args[0] in errno_block:
 
96
                        return ''
 
97
                elif e.args[0] in errno_fatal:
 
98
                        # this may not send anything ...
 
99
                        print >> sys.stderr, "fatal error during select : %s" % str(e)
 
100
                        sys.stderr.flush()
 
101
                        sys.exit(1)
 
102
                else:
 
103
                        # this may not send anything ...
 
104
                        print >> sys.stderr, "unexpected error during select : %s" % str(e)
 
105
                        sys.stderr.flush()
 
106
                        sys.exit(1)
 
107
 
 
108
        if not r:
 
109
                return ''
 
110
 
 
111
        line = reader()
 
112
        if not line:
 
113
                return ''
 
114
 
 
115
        return line
 
116
 
 
117
 
 
118
announce = ['announce route 192.0.2.%d next-hop 10.0.0.1\n' % ip for ip in range(1,255)]
 
119
 
 
120
leftover  = False
 
121
try:
 
122
        while True:
 
123
                received = read(1.0)  # wait for a maximum of one second
 
124
                if received:
 
125
                        # do something with the data received
 
126
                        pass
 
127
 
 
128
                more,announce = announce[:10],announce[10:]
 
129
 
 
130
                if more:
 
131
                        leftover = write(''.join(more))
 
132
                elif leftover:
 
133
                        # echo back what we got
 
134
                        leftover = write()
 
135
except Exception,e:
 
136
        sync(sys.stdin)