Labo

Sign in or create your account | Project List | Help

Labo Commit Details

Date:2009-05-10 01:39:32 (1 year 3 months ago)
Author:naps
Commit:a186983abb5b32c005f828e39ec59d78cb9ba130
Message:Adding option to select between arp gratuitous or standard request

Files: arprequest/README (2 diffs)
arprequest/arprequest.py (4 diffs)
arprequest/setup.py (2 diffs)

Change Details

arprequest/README
2121>>> ar2.request()
2222False
2323
24Changelog
25---------
26
270.3 :
28
29 - You can now select type of ARP request. This is done with "arp_type"
30   argument of ArpRequest class. You can use arprequest.ARP_GRATUITOUS
31   to make an ARP Gratuitous request (what is currently done) or use
32   arprequest.ARP_STANDARD to do a standard ARP request.
33
34   This option was created to use this library with systems which are
35   configured to block Arp Gratuitous.
36
2437Constraints
2538-----------
2639
...... 
2841   unix signals.
2942 - ArpRequest work only as root, because it uses raw sockets.
3043 - Module is commented in french. I will translate comments in english,
31   a day...
44   some day...
3245
arprequest/arprequest.py
2020from struct import pack, unpack
2121import signal
2222
23ARP_GRATUITOUS = 1
24ARP_STANDARD = 2
25
2326def val2int(val):
2427    '''Retourne une valeur sous forme d'octet en valeur sous forme
2528       d'entier.'''
...... 
6063class ArpRequest:
6164    '''Génère une requête ARP et attend la réponse'''
6265
63    def __init__(self, ipaddr, if_name):
66    def __init__(self, ipaddr, if_name, arp_type=ARP_GRATUITOUS):
6467        # Initialisation du socket (socket brut, donc besoin d'ê root)
68        self.arp_type = arp_type
69        self.if_ipaddr = socket.gethostbyname(socket.gethostname())
70
6571        self.socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW,
6672                                                        socket.SOCK_RAW)
6773        self.socket.bind((if_name, socket.SOCK_RAW))
...... 
8692    def _send_arp_request(self):
8793        '''Envois une requête ARP pour la machine'''
8894
95        # Adresse logicielle de l'émetteur :
96        if self.arp_type == ARP_STANDARD:
97            saddr = pack('!4B',
98                           *[int(x) for x in self.if_ipaddr.split('.')])
99        else:
100            saddr = pack('!4B',
101                              *[int(x) for x in self.ipaddr.split('.')])
102
103
104
89105        # Forge de la trame :
90106        frame = [
91107            ### Partie ETHERNET ###
...... 
101117            pack('!HHBB', 0x0001, 0x0800, 0x0006, 0x0004),
102118            # Type d'opération (=ARP Request) :
103119            pack('!H', 0x0001),
104            # Adresse matériel de l'éméteur :
120            # Adresse matériel de l'émetteur :
105121            self.socket.getsockname()[4],
106            # Adresse logicielle de l'émetteur (=adresse IP cible =
107            # ARP gratuit)
108            pack('!4B', *[int(x) for x in self.ipaddr.split('.')]),
122            # Adresse logicielle de l'émetteur :
123            saddr,
109124            # Adresse matérielle de la cible (=00*6) :
110125            pack('!6B', *(0,) * 6),
111126            # Adresse logicielle de la cible (=adresse fournie au
arprequest/setup.py
55
66setup(
77    name='arprequest',
8    version='0.2',
8    version='0.3',
99    description=('A class which sends an ARP Request to know if a '
1010                    'host is online on local networks'),
1111    long_description=ldesc,
...... 
1414    author_email='antoine@inaps.org',
1515    license='WTFPL',
1616    py_modules=['arprequest'],
17    url='http://dev.inaps.org/trac/wiki/ArpRequest',
17    url='http://idevelop.org/p/labo/page/ArpRequest/',
1818    classifiers=[
1919        'Topic :: Communications',
2020        'Topic :: System :: Networking',

Archive Download the corresponding diff file

Branches:
master