Changeset 151


Ignore:
Timestamp:
05/16/12 08:56:50 (12 years ago)
Author:
atzm
Message:
  • add basic auth support to client
File:
1 edited

Legend:

Unmodified
Added
Removed
  • etherws/trunk/etherws.py

    r150 r151  
    1111# 
    1212# todo: 
    13 #   - authentication support 
    1413#   - servant mode support (like typical p2p software) 
    1514# 
     
    4443import os 
    4544import sys 
    46 import time 
    4745import base64 
    4846import hashlib 
     47import getpass 
    4948import argparse 
    5049import threading 
     
    112111    def on_close(self): 
    113112        self._tap.unregister_client(self) 
     113 
     114 
     115class  EtherWebSocketClient(object): 
     116    def __init__(self, tap, url, user=None, passwd=None): 
     117        self._sock = None 
     118        self._tap = tap 
     119        self._url = url 
     120        self._options = {} 
     121 
     122        if user and passwd: 
     123            token = base64.b64encode('%s:%s' % (user, passwd)) 
     124            auth = ['Authorization: Basic %s' % token] 
     125            self._options['header'] = auth 
     126 
     127    def open(self): 
     128        self._sock = websocket.WebSocket() 
     129        self._sock.connect(self._url, **self._options) 
     130 
     131    def close(self): 
     132        self._sock.close() 
     133        self._sock = None 
     134 
     135    def write_message(self, message, binary=False): 
     136        flag = websocket.ABNF.OPCODE_TEXT 
     137        if binary: 
     138            flag = websocket.ABNF.OPCODE_BINARY 
     139        self._sock.send(message, flag) 
     140 
     141    def run_forever(self): 
     142        try: 
     143            if not self._sock: 
     144                self.open() 
     145            while True: 
     146                data = self._sock.recv() 
     147                if data is None: 
     148                    break 
     149                self._tap.write(self, data) 
     150        finally: 
     151            self.close() 
    114152 
    115153 
     
    214252            args.port = 80 
    215253 
    216     if not args.foreground: 
    217         daemonize() 
    218  
    219254    tap = TapHandler(args.device, debug=args.debug) 
    220255    app = tornado.web.Application([ 
     
    226261    ioloop = tornado.ioloop.IOLoop.instance() 
    227262    ioloop.add_handler(tap.fileno(), tap, ioloop.READ) 
     263 
     264    if not args.foreground: 
     265        daemonize() 
     266 
    228267    ioloop.start() 
    229268 
     
    233272        websocket.enableTrace(True) 
    234273 
     274    passwd = None 
     275    if args.user: 
     276        passwd = getpass.getpass() 
     277 
     278    tap = TapHandler(args.device, debug=args.debug) 
     279    client = EtherWebSocketClient(tap, args.uri, args.user, passwd) 
     280 
     281    tap.register_client(client) 
     282    client.open() 
     283 
     284    t = threading.Thread(target=client.run_forever) 
     285    t.setDaemon(True) 
     286 
     287    ioloop = tornado.ioloop.IOLoop.instance() 
     288    ioloop.add_handler(tap.fileno(), tap, ioloop.READ) 
     289 
    235290    if not args.foreground: 
    236291        daemonize() 
    237292 
    238     tap = TapHandler(args.device, debug=args.debug) 
    239     client = websocket.WebSocketApp(args.uri) 
    240     client.on_message = lambda s, m: tap.write(client, m) 
    241     client.write_message = \ 
    242         lambda m, b: client.sock.send(m, websocket.ABNF.OPCODE_BINARY) 
    243     tap.register_client(client) 
    244  
    245     t = threading.Thread(target=client.run_forever) 
    246     t.setDaemon(True) 
    247293    t.start() 
    248  
    249     while not client.sock: 
    250         time.sleep(0.1) 
    251  
    252     ioloop = tornado.ioloop.IOLoop.instance() 
    253     ioloop.add_handler(tap.fileno(), tap, ioloop.READ) 
    254294    ioloop.start() 
    255295 
     
    273313    parser_client = subparsers.add_parser('client') 
    274314    parser_client.add_argument('--uri', action='store', required=True) 
     315    parser_client.add_argument('--user', action='store') 
    275316 
    276317    args = parser.parse_args() 
Note: See TracChangeset for help on using the changeset viewer.