~ubuntu-branches/ubuntu/gutsy/python-dns/gutsy-security

« back to all changes in this revision

Viewing changes to DNS/Base.py

  • Committer: Bazaar Package Importer
  • Author(s): Joerg Wendland
  • Date: 2003-08-20 14:25:29 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20030820142529-3facqpkoslard81q
Tags: 2.3.0-5
* debian/control:
  Use ${python:Depends} for Depends, so that correct Depends are
  generated by dh_python. (closes: Bug#205884)
* debian/python-dns.postinst
  debian/python-dns.prerm:
  Remove these files and let debhelper handle these issues.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
"""
2
 
$Id: Base.py,v 1.11 2002/03/19 13:05:02 anthonybaxter Exp $
 
2
$Id: Base.py,v 1.12 2002/04/23 06:04:27 anthonybaxter Exp $
3
3
 
4
4
This file is part of the pydns project.
5
5
Homepage: http://pydns.sourceforge.net
9
9
    Base functionality. Request and Response classes, that sort of thing.
10
10
"""
11
11
 
12
 
import socket
13
 
import string
 
12
import socket, string, types, time
14
13
import Type,Class,Opcode
15
14
import asyncore
16
15
 
30
29
        if not line or line[0]==';' or line[0]=='#':
31
30
            continue
32
31
        fields=string.split(line)
 
32
        if len(fields) == 0: 
 
33
            continue
33
34
        if fields[0]=='domain':
34
35
            defaults['domain']=fields[1]
35
36
        if fields[0]=='search':
61
62
    def argparse(self,name,args):
62
63
        if not name and self.defaults.has_key('name'):
63
64
            args['name'] = self.defaults['name']
64
 
        if type(name) is type(""):
 
65
        if type(name) is types.StringType:
65
66
            args['name']=name
66
67
        else:
67
68
            if len(name) == 1:
73
74
                    args[i]=self.defaults[i]
74
75
                else:
75
76
                    args[i]=defaults[i]
76
 
        if type(args['server']) == type(''):
 
77
        if type(args['server']) == types.StringType:
77
78
            args['server'] = [args['server']]
78
79
        self.args=args
79
80
 
146
147
        opcode = self.args['opcode']
147
148
        rd = self.args['rd']
148
149
        server=self.args['server']
149
 
        if type(self.args['qtype']) == type('foo'):
 
150
        if type(self.args['qtype']) == types.StringType:
150
151
            try:
151
152
                qtype = getattr(Type, string.upper(self.args['qtype']))
152
153
            except AttributeError:
162
163
            protocol = 'tcp'
163
164
        #print 'QTYPE %d(%s)' % (qtype, Type.typestr(qtype))
164
165
        m = Lib.Mpacker()
 
166
        # jesus. keywords and default args would be good. TODO.
165
167
        m.addHeader(0,
166
168
              0, opcode, 0, 0, rd, 0, 0, 0,
167
169
              1, 0, 0, 0)
168
170
        m.addQuestion(qname, qtype, Class.IN)
169
171
        self.request = m.getbuf()
170
172
        if protocol == 'udp':
171
 
            self.response=None
172
 
            self.socketInit(socket.AF_INET, socket.SOCK_DGRAM)
173
 
            for self.ns in server:
174
 
                try:
175
 
                    #self.s.connect((self.ns, self.port))
176
 
                    self.conn()
177
 
                    self.time_start=time.time()
178
 
                    if not self.async:
179
 
                        self.s.send(self.request)
180
 
                        self.response=self.processUDPReply()
181
 
                #except socket.error:
182
 
                except None:
183
 
                    continue
184
 
                break
185
 
            if not self.response:
 
173
            self.sendUDPRequest(server)
 
174
        else:
 
175
            self.sendTCPRequest(server)
 
176
        if self.async:
 
177
            return None
 
178
        else:
 
179
            return self.response
 
180
 
 
181
    def sendUDPRequest(self, server):
 
182
        "refactor me"
 
183
        self.response=None
 
184
        self.socketInit(socket.AF_INET, socket.SOCK_DGRAM)
 
185
        for self.ns in server:
 
186
            try:
 
187
                # TODO. Handle timeouts &c correctly (RFC)
 
188
                #self.s.connect((self.ns, self.port))
 
189
                self.conn()
 
190
                self.time_start=time.time()
186
191
                if not self.async:
187
 
                    raise DNSError,'no working nameservers found'
188
 
        else:
189
 
            self.response=None
190
 
            for self.ns in server:
191
 
                try:
192
 
                    self.socketInit(socket.AF_INET, socket.SOCK_STREAM)
193
 
                    self.time_start=time.time()
194
 
                    self.conn()
195
 
                    self.s.send(Lib.pack16bit(len(self.request)) +
196
 
                                                                self.request)
197
 
                    self.s.shutdown(1)
198
 
                    self.response=self.processTCPReply()
199
 
                except socket.error:
200
 
                    continue
201
 
                break
202
 
            if not self.response:
 
192
                    self.s.send(self.request)
 
193
                    self.response=self.processUDPReply()
 
194
            #except socket.error:
 
195
            except None:
 
196
                continue
 
197
            break
 
198
        if not self.response:
 
199
            if not self.async:
203
200
                raise DNSError,'no working nameservers found'
204
 
        if not self.async:
205
 
            return self.response
206
 
        else:
207
 
            return None
 
201
 
 
202
    def sendTCPRequest(self, server):
 
203
        " do the work of sending a TCP request "
 
204
        self.response=None
 
205
        for self.ns in server:
 
206
            try:
 
207
                self.socketInit(socket.AF_INET, socket.SOCK_STREAM)
 
208
                self.time_start=time.time()
 
209
                self.conn()
 
210
                self.s.send(Lib.pack16bit(len(self.request))+self.request)
 
211
                self.s.shutdown(1)
 
212
                self.response=self.processTCPReply()
 
213
            except socket.error:
 
214
                continue
 
215
            break
 
216
        if not self.response:
 
217
            raise DNSError,'no working nameservers found'
208
218
 
209
219
#class DnsAsyncRequest(DnsRequest):
210
220
class DnsAsyncRequest(DnsRequest,asyncore.dispatcher_with_send):
242
252
 
243
253
#
244
254
# $Log: Base.py,v $
 
255
# Revision 1.12  2002/04/23 06:04:27  anthonybaxter
 
256
# attempt to refactor the DNSRequest.req method a little. after doing a bit
 
257
# of this, I've decided to bite the bullet and just rewrite the puppy. will
 
258
# be checkin in some design notes, then unit tests and then writing the sod.
 
259
#
245
260
# Revision 1.11  2002/03/19 13:05:02  anthonybaxter
246
261
# converted to class based exceptions (there goes the python1.4 compatibility :)
247
262
#