Added USBIP Project

This commit is contained in:
Sebastian Lohff 2011-12-26 03:59:12 +01:00
parent 3aa46878e6
commit 119e149cdc
4 changed files with 210 additions and 0 deletions

5
tunnel/usbip/README Normal file
View File

@ -0,0 +1,5 @@
Installation
============
You need
* python-pyudev

37
tunnel/usbip/conf.py Normal file
View File

@ -0,0 +1,37 @@
# ___________________________________________________
# | |
# | usbip - ip over usbsticks |
# |___________________________________________________|
import os
Conf = {
# ======== network settings ========
# ipsettings for the device
'devname': '',
'network':
{
'address': '10.10.10.11',
'netmask': '255.255.255.0',
#gateway: '',
'mtu': 1400,
},
# ======== USB-Stick settings ========
# udev attributes to choose a device on input
# make sure this only matches to mountable devices
'udevAttrs':
{
'ID_SERIAL': u'VBTM_Store__n__Go_0DE1A361400298C2-0:0',
'UDISKS_PARTITION_NUMBER': u'1',
},
# where to mount the usb stick
'mountpoint': '/mnt/',
# relative path from mountpoint, where to write network files
'usbNetworkDir': 'net/',
# prexif for all files, suffixed
'networkFilePrefix': 'data',
# sync after unmount?
'sync': True
}

14
tunnel/usbip/listDevices.py Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/python
import pyudev
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
for action, device in monitor:
if action == 'add':
print device
for k, v in device.items():
print k.ljust(34), v
print "-" * 80

154
tunnel/usbip/usbip.py Executable file
View File

@ -0,0 +1,154 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
import pyudev
import Queue
import subprocess
import sys
import threading
import time
sys.path.append("../../../")
from conf import Conf
from ether2any import Ether2Any
class USBWriter(threading.Thread):
def __init__(self, dev, networkQueue, writeLock):
threading.Thread.__init__(self)
self.daemon = True
self.quit = False
self.packetCounter = 0
self.dev = dev
self.writeLock = writeLock
self.networkQueue = networkQueue
self.mountpoint = Conf.get("mountpoint")
self.usbNetworkDir = Conf.get("usbNetworkDir")
self.networkFilePrefix = Conf.get("networkFilePrefix")
self.writePath = self.mountpoint + "/" + self.usbNetworkDir + "/"
def getPacketCounter(self):
return self.packetCounter
def resetPacketCounter(self):
self.packetCounter = 0
def run(self):
while not self.quit:
packet = self.networkQueue.get()
self.writeLock.acquire()
f = open(self.writePath + self.networkFilePrefix + "%09d" % self.packetCounter, "w")
f.write(packet)
f.close()
self.packetCounter += 1
self.writeLock.release()
class UdevHandler(threading.Thread):
def __init__(self, dev, usbwriter, writeLock):
threading.Thread.__init__(self)
self.daemon = True
self.quit = False
self.packetCounter = 0
self.dev = dev
self.usbwriter = usbwriter
self.writeLock = writeLock
self.context = pyudev.Context()
self.mountpoint = Conf.get("mountpoint")
self.usbNetworkDir = Conf.get("usbNetworkDir")
self.networkFilePrefix = Conf.get("networkFilePrefix")
self.sync = Conf.get("sync")
self.writePath = self.mountpoint + "/" + self.usbNetworkDir + "/"
self.attrs = Conf.get("udevAttrs")
self.devname = None
def isUsableDevice(self, device):
for k, v in self.attrs.items():
try:
if not device[k] == v:
return False
except KeyError:
return False
return True
def readAndSweep(self):
counter = 0
try:
for n in os.listdir(self.writePath):
if n == "." or n == "..":
continue
f = open(self.writePath + n, "r")
packet = f.read()
f.close()
os.unlink(self.writePath + n)
self.dev.write(packet)
counter += 1
except OSError, o:
print " !! Error reading from directory:", o
print " >> Read %d packet(s)" % counter
def run(self):
monitor = pyudev.Monitor.from_netlink(self.context)
monitor.filter_by(subsystem='block')
for action, device in monitor:
if self.isUsableDevice(device):
self.devname = device['DEVNAME']
if action == 'add':
p = subprocess.Popen(["/bin/mount", self.devname, self.mountpoint])
ret = p.wait()
if ret == 0:
print " ++ Mounted stick (%s) at %s" % (self.devname, self.mountpoint)
if not os.path.exists(self.writePath):
os.mkdir(self.writePath)
self.readAndSweep()
self.writeLock.release()
raw_input(" ** Press any key to release usbstick...")
print " >> %d packet(s) written" % (self.usbwriter.getPacketCounter(),)
self.usbwriter.resetPacketCounter()
print " ** Releasing stick..."
self.writeLock.acquire()
subprocess.Popen(["/bin/umount", "-f", self.devname])
if self.sync:
print " ** Syncing..."
subprocess.Popen("/bin/sync")
print " ** Unmounted"
else:
print " !! Error mounting stick (%s) at %s: Error id %d" % (self.devname, self.mountpoint, ret)
elif action == 'remove':
print " -- Stick (%s) removed." % self.devname
class USBIP(Ether2Any):
def __init__(self):
Ether2Any.__init__(self, tap=False)
network = Conf.get("network", {'mtu': 1400})
self.dev.ifconfig(**network)
self.dev.up()
self.networkQueue = Queue.Queue()
self.writeLock = threading.Lock()
self.writeLock.acquire()
self.usb = USBWriter(self.dev, self.networkQueue, self.writeLock)
self.usb.start()
self.udev = UdevHandler(self.dev, self.usb, self.writeLock)
self.udev.start()
def sendToNet(self, packet):
self.networkQueue.put(packet)
if __name__ == '__main__':
usbip = USBIP()
print "Starting ip over USB-Stick service..."
usbip.run()