aboutsummaryrefslogtreecommitdiff
path: root/h-client/hlibrary.py
diff options
context:
space:
mode:
Diffstat (limited to 'h-client/hlibrary.py')
-rw-r--r--h-client/hlibrary.py1055
1 files changed, 0 insertions, 1055 deletions
diff --git a/h-client/hlibrary.py b/h-client/hlibrary.py
deleted file mode 100644
index 85faca6..0000000
--- a/h-client/hlibrary.py
+++ /dev/null
@@ -1,1055 +0,0 @@
-# -*- coding: utf-8 -*-
-# h-client, a client for an h-source server (such as http://www.h-node.com)
-# Copyright (C) 2011 Antonio Gallo
-#
-#
-# h-client is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# h-client is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with h-client. If not, see <http://www.gnu.org/licenses/>.
-
-import os
-import string
-import re
-import sys
-import pycurl
-import urllib
-import htmlentitydefs
-from xml.dom import minidom
-from odict import *
-
-
-
-class Device(object):
-
- #from codename to h-source distro code
- _distrosTable = {
- 'deltah' : 'gnewsense_2_3',
- 'metad' : 'gnewsense_3_0',
- 'awen' : 'trisquel_3_5',
- 'taranis' : 'trisquel_4_0',
- 'slaine' : 'trisquel_4_5'
- }
-
- #list of options for the howItWorks entry
- _howItWorksOptions = ['yes','no']
-
- #list of subtypes
- _subtypes = []
-
- #allowed years of commercialization
- _years = [
- 'not-specified',
- '2011',
- '2010',
- '2009',
- '2008',
- '2007',
- '2006',
- '2005',
- '2004',
- '2003',
- '2002',
- '2001',
- '2000',
- '1999',
- '1998',
- '1997',
- '1996',
- '1995',
- '1994',
- '1993',
- '1992'
- ]
-
- #list of interfaces
- _interfaces = []
-
- _status = True
-
- errors = []
-
- def __init__(self):
- self._post = {}
- self._type = ''
- self._vendor = ''
- self._model = ''
- self._otherNames = ''
- self._kernel = ''
- self._distributions = [self.userDistribution()]
- self._interface = 'not-specified'
- self._year = 'not-specified'
- self._vendorId = ''
- self._productId = ''
- self._howItWorks = ''
- self._driver = ''
- self._description = ''
- self._subtype = 'not-specified'
- self._icon = 'unknown.png'
-
- def setPost(self):
- self._post['model'] = self._model
- self._post['other_names'] = self._otherNames.replace("\n","\r\n")
- self._post['kernel'] = self._kernel
- self._post['distribution'] = self.createDistroEntry()
- self._post['comm_year'] = self._year
- self._post['pci_id'] = self._vendorId + ':' + self._productId
- self._post['interface'] = self._interface
- self._post['description'] = self._description.replace("\n","\r\n")
- self._post['driver'] = self._driver
-
- #replace the HTML entitites with utf-8 characters
- def htmlentitiesDecode(self,string):
- for entity,code in htmlentitydefs.name2codepoint.iteritems():
- string = string.replace("&"+entity+";",unichr(code))
- string = string.replace("&#039;","'")
- return string.encode('utf-8')
-
- #get the h-source distro code from the codename
- def getDistroCode(self,codenameString):
- codenames = self._distrosTable.keys()
- for codename in codenames:
- if codenameString.find(codename) != -1:
- return self._distrosTable[codename]
- return ''
-
- #create the distribution entry
- def createDistroEntry(self):
- cleanDistros = []
- for distro in self._distributions:
- cleanDistros.append(distro.lstrip().rstrip())
-
- #remove duplicates
- cleanDistros = list(set(cleanDistros))
- #sort the elements
- cleanDistros = sorted(cleanDistros)
-
- dis = ' , '.join(cleanDistros)
- #correct a strange python behaviour
- if dis != '':
- if dis[0] == ' , ':
- dis = dis[3:]
- return dis
-
- #add a distribution
- def addDistribution(self,distroName):
- self._distributions.append(distroName)
-
- #add many distributions
- #distroList: comma separated list of distros (type: string)
- def addDistributions(self,distroList):
- distros = distroList.split(',')
- for distro in distros:
- self.addDistribution(distro)
-
- #get the h-source distro code of the user
- def userDistribution(self):
- if not os.system('cat /etc/*-release | grep CODENAME > tmp/distro'):
- f = open('tmp/distro','r')
- row = f.readline().rstrip("\n").lower()
- f.close();
- os.system('rm -f tmp/distro')
- return self.getDistroCode(row)
- else:
- self._status = False
- self.errors.append('tmp folder not writable')
-
- def getSubtype(self):
- return self._subtype
-
- def getSubtypes(self):
- return self._subtypes
-
- def getHowItWorksOptions(self):
- return self._howItWorksOptions
-
- def getInterfaces(self):
- return self._interfaces
-
- def getYears(self):
- return self._years
-
- def getType(self):
- return self._type
-
- def getVendor(self):
- return self._vendor
-
- def getModel(self):
- return self._model
-
- def getOtherNames(self):
- return self._otherNames
-
- def getKernel(self):
- return self._kernel
-
- def getDistributions(self):
- return self._distributions
-
- def getInterface(self):
- return self._interface
-
- def getYear(self):
- return self._year
-
- def getVendorId(self):
- return self._vendorId
-
- def getProductId(self):
- return self._productId
-
- def getHowItWorks(self):
- return self._howItWorks
-
- def getDriver(self):
- return self._driver
-
- def getDescription(self):
- return self._description
-
- def getIcon(self):
- return self._icon
-
- def setType(self,ttype):
- self._type = ttype
-
- def setVendor(self,vendor):
- self._vendor = vendor
-
- def setModel(self,model):
- self._model = model
-
- def setOtherNames(self,otherNames):
- self._otherNames = otherNames
-
- def setKernel(self,kernel):
- self._kernel = kernel
-
- def setDistributions(self,distributions):
- self._distributions = distributions
-
- def setInterface(self,interface):
- self._interface = interface
-
- def setYear(self,year):
- self._year = year
-
- def setVendorId(self,vendorId):
- self._vendorId = vendorId
-
- def setProductId(self,productId):
- self._productId = productId
-
- def setHowItWorks(self,howItWorks):
- self._howItWorks = howItWorks
-
- def setDriver(self,driver):
- self._driver = driver
-
- def setDescription(self,description):
- self._description = description
-
- def setSubtype(self,subtype):
- self._subtype = subtype
-
- def setIcon(self,icon):
- self._icon = icon
-
- def getStatus(self):
- return self._status
-
- def getPost(self):
- return self._post
-
-class Videocard(Device):
-
- def __init__(self):
- super(Videocard, self).__init__()
- self._type = 'videocard'
- self._howItWorks = 'does_not_work'
- self._interfaces = ['not-specified','PCI','AGP','PCI-E','ISA','MCA','VLB']
- self._howItWorksOptions = ['works_with_3D','works_without_3D','does_not_work']
- self._icon = 'videocard.png'
-
- def setPost(self):
- super(Videocard, self).setPost()
- self._post['video_card_works'] = self._howItWorks
-
-class Wifi(Device):
-
- def __init__(self):
- super(Wifi, self).__init__()
- self._type = 'wifi'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','PCI','PCI-E','mini-PCI','mini-PCI-E','ExpressCard','PC-Card']
- self._icon = 'wifi.png'
-
- def setPost(self):
- super(Wifi, self).setPost()
- self._post['wifi_works'] = self._howItWorks
-
-class Soundcard(Device):
-
- def __init__(self):
- super(Soundcard, self).__init__()
- self._type = 'soundcard'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','PCI','ISA','USB','Firewire','Parallel','PCI-E','PCMCIA']
- self._icon = 'soundcard.png'
-
- def setPost(self):
- super(Soundcard, self).setPost()
- self._post['sound_card_works'] = self._howItWorks
-
-class Printer(Device):
-
- def __init__(self):
- super(Printer, self).__init__()
- self._type = 'printer'
- self._howItWorks = 'C-None'
- self._interfaces = ['not-specified','USB','Serial','Parallel','Firewire','SCSI','Ethernet']
- self._howItWorksOptions = ['A-Full','B-Partial','C-None']
- self._subtypes = ['not-specified','laser','inkjet','other']
- self._icon = 'printer.png'
-
- def setPost(self):
- super(Printer, self).setPost()
- self._post['compatibility'] = self._howItWorks
- self._post['subtype'] = self._subtype
-
-class Scanner(Device):
-
- def __init__(self):
- super(Scanner, self).__init__()
- self._type = 'scanner'
- self._howItWorks = 'C-None'
- self._interfaces = ['not-specified','USB','Serial','Parallel','Firewire','SCSI','Ethernet']
- self._howItWorksOptions = ['A-Full','B-Partial','C-None']
- self._icon = 'scanner.png'
-
- def setPost(self):
- super(Scanner, self).setPost()
- self._post['compatibility'] = self._howItWorks
-
-class Threegcard(Device):
-
- def __init__(self):
- super(Threegcard, self).__init__()
- self._type = '3G-card'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','PCI','PCI-E','mini-PCI','mini-PCI-E','ExpressCard','PC-Card']
- self._icon = '3G-card.png'
-
- def setPost(self):
- super(Threegcard, self).setPost()
- self._post['wifi_works'] = self._howItWorks
-
-class Webcam(Device):
-
- def __init__(self):
- super(Webcam, self).__init__()
- self._type = 'webcam'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','Firewire','Parallel','Wifi','Serial']
- self._icon = 'webcam.png'
-
- def setPost(self):
- super(Webcam, self).setPost()
- self._post['webcam_works'] = self._howItWorks
-
-class Bluetooth(Device):
-
- def __init__(self):
- super(Bluetooth, self).__init__()
- self._type = 'bluetooth'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','PCI','PCI-E','mini-PCI','mini-PCI-E','ExpressCard','PC-Card']
- self._icon = 'bluetooth.png'
-
- def setPost(self):
- super(Bluetooth, self).setPost()
- self._post['bluetooth_works'] = self._howItWorks
-
-class Acquisitioncard(Device):
-
- def __init__(self):
- super(Acquisitioncard, self).__init__()
- self._type = 'acquisition-card'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','PCI','PCI-E','mini-PCI','mini-PCI-E','ExpressCard','PC-Card','Firewire','Parallel','Serial']
- self._icon = 'acquisition-card.png'
-
- def setPost(self):
- super(Acquisitioncard, self).setPost()
- self._post['compatibility'] = self._howItWorks
-
-class Fingerprintreader(Device):
-
- def __init__(self):
- super(Fingerprintreader, self).__init__()
- self._type = 'fingerprint-reader'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB','PCI','PCI-E','mini-PCI','mini-PCI-E','ExpressCard','PC-Card','Firewire','Parallel','Serial']
- self._icon = 'fingerprint-reader.png'
-
- def setPost(self):
- super(Fingerprintreader, self).setPost()
- self._post['fingerprint_works'] = self._howItWorks
-
-class Unknown(Device):
-
- def __init__(self):
- super(Unknown, self).__init__()
- self._type = 'unknown'
- self._howItWorks = 'no'
- self._interfaces = ['not-specified','USB']
- self._icon = 'unknown.png'
-
- def setPost(self):
- super(Unknown, self).setPost()
-
-#class to carry out http requests by means of pycurl
-class Mycurl:
-
- _post = None
-
- #set the domain
- def __init__(self,domain):
- self.contents = ''
- self.setDomain(domain)
-
- def getStatus(self):
- return self._status
-
- def setDomain(self,domain):
- self.domain = domain
- #check if the trailing slash is present
- if len(self.domain) > 1:
- if self.domain[len(self.domain)-1] != '/':
- self.domain += '/'
-
- def getDomain(self):
- return self.domain
-
- def setPost(self,post):
- self._post = post
-
- def body_callback(self, buf):
- self.contents = self.contents + buf
-
- #perform the HTTP request
- def perform(self,requestUri = ''):
-
- self.url = self.domain + requestUri;
- #print self.url
- self.contents = ''
- c = pycurl.Curl()
- c.setopt(c.URL, self.url)
- c.setopt(pycurl.COOKIEFILE, 'tmp/cookies.txt')
- c.setopt(pycurl.COOKIEJAR, 'tmp/cookies.txt')
- if self._post != None:
- c.setopt(c.POSTFIELDS, urllib.urlencode(self._post))
- c.setopt(c.WRITEFUNCTION, self.body_callback)
-
- try:
- c.perform()
- result = True
- except:
- result = False
-
- #print c.getinfo(c.HTTP_CODE)
- #result = False
- #if c.getinfo(c.HTTP_CODE) == 200:
- #result = True
-
- c.close()
- return result
-
-class Client:
-
- devices = {}
-
- _status = True
- errors = []
-
- _types = {
- '0403' : {
- 'type' : 'soundcard',
- 'controller': 'soundcards'
- },
- '0280' : {
- 'type' : 'wifi',
- 'controller': 'wifi'
- },
- '0300' : {
- 'type' : 'videocard',
- 'controller': 'videocards'
- },
- '070100' : {
- 'type' : 'printer',
- 'controller': 'printers'
- },
- '070101' : {
- 'type' : 'printer',
- 'controller': 'printers'
- },
- '070102' : {
- 'type' : 'printer',
- 'controller': 'printers'
- },
- '070103' : {
- 'type' : 'printer',
- 'controller': 'printers'
- },
- '0701ff' : {
- 'type' : 'printer',
- 'controller': 'printers'
- },
- 'e00101' : {
- 'type' : 'bluetooth',
- 'controller': 'bluetooth'
- },
- '020205' : {
- 'type' : '3G-card',
- 'controller': 'threegcards'
- },
- '0e0100' : {
- 'type' : 'webcam',
- 'controller': 'webcams'
- },
- 'ff0100' : {
- 'type' : 'webcam',
- 'controller': 'webcams'
- },
- '060101' : {
- 'type' : 'scanner',
- 'controller': 'scanners'
- },
- '0d0000' : {
- 'type' : 'fingerprint-reader',
- 'controller': 'fingerprintreaders'
- },
- 'ffffff' : {
- 'type' : 'unknown',
- 'controller': 'unknown'
- }
- }
-
- def __init__(self,url = ''):
-
- self.request = Mycurl(url)
-
- #create the allowedDistros ordered dictionary
- self.allowedDistros = OrderedDict([
- ('blag_90001','BLAG 90001'),
- ('blag_120000','BLAG 120000'),
- ('dragora_1_1','Dragora 1.1'),
- ('dragora_2_0','Dragora 2.0 Ardi'),
- ('dynebolic_2_5_2','Dynebolic 2.5.2 DHORUBA'),
- ('gnewsense_2_3','gNewSense 2.3 Deltah'),
- ('gnewsense_3_0','gNewSense 3.0 Metad'),
- ('musix_2_0','Musix GNU+Linux 2.0 R0'),
- ('parabola','Parabola GNU/Linux'),
- ('trisquel_3_5','Trisquel 3.5 Awen'),
- ('trisquel_4_0','Trisquel 4.0 Taranis'),
- ('trisquel_4_5','Trisquel 4.5 Slaine'),
- ('ututo_xs_2009','UTUTO XS 2009'),
- ('ututo_xs_2010','UTUTO XS 2010'),
- ('venenux_0_8','VENENUX 0.8'),
- ('venenux_0_8_2','VENENUX-EC 0.8.2')]
- )
-
-
- #get the list of types
- def getTypes(self):
- types = []
- for Class,struct in self._types.iteritems():
- if struct['type'] not in types:
- types.append(struct['type'])
- return types
-
- #check if a distro code is allowed or not
- def distroIsAllowed(self,distroCode):
- allowedDistroCodes = self.allowedDistros.keys()
- if distroCode in allowedDistroCodes:
- return True
- return False
-
- def getNode(self):
- return self.request.getDomain()
-
- def setNode(self,domain):
- self.request.setDomain(domain)
-
- #get the type from the Class id
- def getType(self, Class):
- Classes = self._types.keys()
- if Class in Classes:
- return self._types[Class]['type']
- return None
-
- #get the controller from the Class id
- def getController(self, Class):
- Classes = self._types.keys()
- if Class in Classes:
- return self._types[Class]['controller']
- return None
-
- #return a device object
- def getObject(self,Class):
- if Class == '0403':
- return Soundcard()
- elif Class == '0280':
- return Wifi()
- elif Class == '0300':
- return Videocard()
- elif Class == '070100' or Class == '070101' or Class == '070102' or Class == '070103' or Class == '0701ff':
- return Printer()
- elif Class == '0e0100' or Class == 'ff0100':
- return Webcam()
- elif Class == 'e00101':
- return Bluetooth()
- elif Class == '060101':
- return Scanner()
- elif Class == '0d0000':
- return Fingerprintreader()
- elif Class == '020205':
- return Threegcard()
- elif Class == 'ffffff':
- return Unknown()
- else:
- return None
-
- def getObjectFromType(self,Type):
- if Type == 'soundcard':
- return Soundcard()
- elif Type == 'wifi':
- return Wifi()
- elif Type == 'videocard':
- return Videocard()
- elif Type == 'printer':
- return Printer()
- elif Type == 'webcam':
- return Webcam()
- elif Type == 'bluetooth':
- return Bluetooth()
- elif Type == 'scanner':
- return Scanner()
- elif Type == 'fingerprint-reader':
- return Fingerprintreader()
- elif Type == '3G-card':
- return Threegcard()
- else:
- return None
-
- #get the class from the type
- def getClassFromType(self,Type):
- for Class,struct in self._types.iteritems():
- if struct['type'] == Type:
- return Class
-
- #get the kernel version
- def getKernel(self):
- if not os.system('uname -r > tmp/kernel'):
- f = open('tmp/kernel','r')
- row = f.readline().replace("\n","")
- f.close();
- os.system('rm -f tmp/kernel')
- return row
- else:
- self._status = False
- self.errors.append('tmp folder not writable')
-
- #log in
- def login(self, username, password):
- self.request.setPost({'username' : username, 'password' : password})
- result = self.request.perform('users/login/en')
- self.request.setPost(None)
- if result:
- if self.isLogged():
- return True
- else:
- self.errors.append("wrong username or password")
- else:
- self.errors.append("unable to connect to server")
-
- return False
-
- #log out
- def logout(self):
- result = self.request.perform('users/logout/en')
-
- if result:
- return True
- else:
- self.errors.append("unable to connect to server")
- return False
-
- #get info about the user logged
- def getUserInfo(self):
- result = self.request.perform('client/userinfo/en')
-
- if result:
- try:
- xmldoc = minidom.parseString(self.request.contents)
- status = xmldoc.getElementsByTagName("status")[0].childNodes[0].data
-
- username = ''
- token = ''
- groups = ''
-
- if status == 'logged':
- username = xmldoc.getElementsByTagName("username")[0].childNodes[0].data
- token = xmldoc.getElementsByTagName("token")[0].childNodes[0].data
- groups = xmldoc.getElementsByTagName("groups")[0].childNodes[0].data
-
- return {'status':status,'username':username,'token':token,'groups':groups}
- except:
- self.errors.append("the server is not up-to-date: unable to parse the xml database")
- return False
- else:
- self.errors.append("unable to connect to server")
- return False
-
- #return True if the user is logged, else return False
- def isLogged(self):
- info = self.getUserInfo()
-
- if info != False:
- if info['status'] == 'logged':
- return True
-
- return False
-
- #return the license info
- def getLicenseNotice(self):
- result = self.request.perform("client/licenseinfo/en");
- if result:
- xmldoc = minidom.parseString(self.request.contents)
- notice = xmldoc.getElementsByTagName("license_info")[0].childNodes[0].data.encode('utf-8')
- return notice
- else:
- self.errors.append("unable to connect to server")
- return False
-
-
- def addLeadingZero(self,string):
- if len(string) == 1:
- return '0'+string
- else:
- return string
-
-
- def createDevices(self):
- #parse the poutput of the lspci command
- if not os.system('lspci -vmmnn > tmp/temp'):
- f = open('tmp/temp','r')
-
- while 1:
- row = f.readline()
-
- if not row:
- break
-
- #get the slot
- if row.find('Slot') != -1:
- #get the class
- row = f.readline().rstrip("\n")
- if row:
- cl = re.match('Class\:(.*)\[(.*)\]',row,re.I)
- if cl:
- #get the object
- dev = self.getObject(cl.group(2))
- if dev:
- #set the type attribute of the device object
- dev.setType(self.getType(cl.group(2)))
- #get the vendorid
- row = f.readline().rstrip("\n")
- if row:
- vn = re.match('Vendor\:(.*)\[(.*)\]',row,re.I)
- if vn:
- dev.setVendorId(vn.group(2).lstrip("\t"))
- #get the productid
- row = f.readline().rstrip("\n")
- if row:
- pr = re.match('Device\:(.*)\[(.*)\]',row,re.I)
- if pr:
- dev.setProductId(pr.group(2).lstrip("\t"))
- dev.setModel(pr.group(1).lstrip("\t"))
-
- dev.setKernel(self.getKernel())
-
- self.devices['p_' + dev.getVendorId() + ':' + dev.getProductId()] = [dev,cl.group(2),'insert','0']
-
- else:
- self.errors.append('the lspci -vmmnn output is not a standard output, some products row not found')
- else:
- self.errors.append('the lspci -vmmnn output is not a standard output, some vendors row not found')
- else:
- self.errors.append('the lspci -vmmnn output is not a standard output, some class row not found')
-
- f.close();
- else:
- self.errors.append('tmp folder not writable')
-
-
- #parse the output of the lsusb command
- if not os.system('lsusb -v > tmp/temp'):
- f = open('tmp/temp','r')
-
- deviceDict = {}
-
- keyNumber = 0
- usbDeviceIsFound = 'N'
-
- while 1:
- row = f.readline()
- crow = row.replace("\n","").lstrip().rstrip()
-
- if not row:
- break
-
- #clear pid and vid if a new device has been found
- if row.find('Device Descriptor:') != -1 and row.find('HID Device Descriptor:') == -1:
- usbDeviceIsFound = 'N'
- keyNumber = keyNumber + 1
- keyString = str(keyNumber)
- deviceDict[keyString] = {}
-
- #find the vendor
- if crow.find('idVendor') != -1:
- #print crow
- res = re.match('idVendor(.*)0x([a-zA-Z0-9]{4})(.*)',crow,re.I)
- if res:
- deviceDict[keyString]['vendorId'] = res.group(2).lstrip().rstrip()
- deviceDict[keyString]['vendorName'] = res.group(3).lstrip().rstrip()
-
- #find the product
- if crow.find('idProduct') != -1:
- #print crow
- res = re.match('idProduct(.*)0x([a-zA-Z0-9]{4})(.*)',crow,re.I)
- if res:
- deviceDict[keyString]['productId'] = res.group(2).lstrip().rstrip()
- deviceDict[keyString]['productName'] = res.group(3).lstrip().rstrip()
-
- if usbDeviceIsFound == 'N':
- #find the class
- if crow.find('bInterfaceClass') != -1:
- #print crow
- res = re.match('bInterfaceClass([\s]*)([0-9]*)(.*)',crow,re.I)
- if res:
- cl = hex(int(res.group(2).lstrip().rstrip()))
- deviceDict[keyString]['classId'] = self.addLeadingZero(cl[2:])
- deviceDict[keyString]['className'] = res.group(3).lstrip().rstrip()
-
- #find the subclass
- if crow.find('bInterfaceSubClass') != -1:
- #print crow
- res = re.match('bInterfaceSubClass([\s]*)([0-9]*)(.*)',crow,re.I)
- if res:
- cl = hex(int(res.group(2).lstrip().rstrip()))
- deviceDict[keyString]['subclassId'] = self.addLeadingZero(cl[2:])
- deviceDict[keyString]['subclassName'] = res.group(3).lstrip().rstrip()
-
- #find the protocol
- if crow.find('bInterfaceProtocol') != -1:
- #print crow
- res = re.match('bInterfaceProtocol([\s]*)([0-9]*)(.*)',crow,re.I)
- if res:
- cl = hex(int(res.group(2).lstrip().rstrip()))
- deviceDict[keyString]['protocolId'] = self.addLeadingZero(cl[2:])
- deviceDict[keyString]['protocolName'] = res.group(3).lstrip().rstrip()
-
- currentClassCode = str(deviceDict[keyString]['classId'])+str(deviceDict[keyString]['subclassId'])+str(deviceDict[keyString]['protocolId'])
-
- if self.getObject(currentClassCode) and currentClassCode != 'ffffff':
- usbDeviceIsFound = 'Y'
-
- f.close();
-
- #create the USB devices
- for key,value in deviceDict.iteritems():
- Class = str(value['classId']) + str(value['subclassId']) + str(value['protocolId'])
-
- #get the USB object
- dev = self.getObject(Class)
- if dev:
- dev.setType(self.getType(Class))
- dev.setVendorId(value['vendorId'])
- dev.setInterface('USB')
- dev.setProductId(value['productId'])
- dev.setModel(value['productName'])
-
- dev.setKernel(self.getKernel())
-
- self.devices['u_' + dev.getVendorId() + ':' + dev.getProductId()] = [dev,Class,'insert','0']
-
- else:
- self.errors.append('tmp folder not writable')
-
- #change the type of a device
- #deviceCode: the code of the device
- #nType: the new type of the device
- def changeType(self,deviceCode,nType):
- dev = self.getObjectFromType(nType)
-
- if dev != None:
- dev.setModel(self.devices[deviceCode][0].getModel())
- dev.setOtherNames(self.devices[deviceCode][0].getOtherNames())
- dev.setKernel(self.devices[deviceCode][0].getKernel())
- dev.setDistributions(self.devices[deviceCode][0].getDistributions())
- dev.setInterface(self.devices[deviceCode][0].getInterface())
- dev.setYear(self.devices[deviceCode][0].getYear())
- dev.setVendorId(self.devices[deviceCode][0].getVendorId())
- dev.setProductId(self.devices[deviceCode][0].getProductId())
- dev.setHowItWorks(self.devices[deviceCode][0].getHowItWorks())
- dev.setDriver(self.devices[deviceCode][0].getDriver())
- dev.setDescription(self.devices[deviceCode][0].getDescription())
- dev.setSubtype(self.devices[deviceCode][0].getSubtype())
- dev.setIcon(nType+".png")
-
- Class = self.getClassFromType(nType)
- self.devices[deviceCode][0] = dev
- self.devices[deviceCode][1] = Class
-
-
- #syncronize with the xml database
- def sync(self):
-
- #perform an http request
- self.request.contents = ''
-
- result = self.request.perform('download/all/en')
- #print result
- if result:
-
- #loop the found devices
- for key,dev in self.devices.iteritems():
- #find the class
- #Class = dev[1]
- vendorid_productid = key[2:]
-
- #reset the device params
- dev[2] = 'insert'
- dev[3] = '0'
-
- #parse the xml database
- try:
- xmldoc = minidom.parseString(self.request.contents)
- devices = xmldoc.getElementsByTagName("device")
- for device in devices:
-
- #check it is not a notebook
- deviceType = device.getElementsByTagName("type")[0].childNodes[0].data.encode('utf-8')
-
- if deviceType != 'notebook':
- code = device.getElementsByTagName("vendorid_productid")[0]
- if code.hasChildNodes():
- if code.childNodes[0].data == vendorid_productid:
-
- if deviceType != dev[0].getType():
- self.changeType(key,deviceType)
-
- modelName = device.getElementsByTagName("model_name")[0].childNodes[0].data.encode('utf-8')
- interface = device.getElementsByTagName("interface")[0].childNodes[0].data.encode('utf-8')
- distribution = device.getElementsByTagName("distribution")[0].childNodes[0].data.encode('utf-8')
- idDevice = device.getElementsByTagName("id")[0].childNodes[0].data.encode('utf-8')
-
- if deviceType == 'printer' or deviceType == 'scanner':
- works = device.getElementsByTagName("compatibility")[0].childNodes[0].data.encode('utf-8')
-
- if deviceType == 'printer':
- #set the subtype
- subtype = device.getElementsByTagName("subtype")[0].childNodes[0].data.encode('utf-8')
- dev[0].setSubtype(subtype)
- else:
- works = device.getElementsByTagName("it_works")[0].childNodes[0].data.encode('utf-8')
-
- year = device.getElementsByTagName("year")[0].childNodes[0].data.encode('utf-8')
-
- if device.getElementsByTagName("other_names")[0].hasChildNodes():
- other_names = device.getElementsByTagName("other_names")[0].childNodes[0].data.encode('utf-8')
- dev[0].setOtherNames(other_names)
- else:
- dev[0].setOtherNames('')
-
- if device.getElementsByTagName("description")[0].hasChildNodes():
- description = device.getElementsByTagName("description")[0].childNodes[0].data.encode('utf-8')
- dev[0].setDescription(dev[0].htmlentitiesDecode(description))
- else:
- dev[0].setDescription('')
-
- if device.getElementsByTagName("kernel_libre")[0].hasChildNodes():
- kernel_libre = device.getElementsByTagName("kernel_libre")[0].childNodes[0].data.encode('utf-8')
- dev[0].setKernel(kernel_libre)
-
- if device.getElementsByTagName("driver")[0].hasChildNodes():
- driver = device.getElementsByTagName("driver")[0].childNodes[0].data.encode('utf-8')
- dev[0].setDriver(driver)
- else:
- dev[0].setDriver('')
-
- #print modelName
- dev[0].setModel(modelName)
- dev[0].setInterface(interface)
- dev[0].setDistributions([])
- dev[0].addDistributions(distribution)
- dev[0].setHowItWorks(works)
- dev[0].setYear(year)
- dev[2] = 'update'
- dev[3] = idDevice
- except:
- self.errors.append("the server is not up-to-date: unable to parse the xml database")
- else:
- self.errors.append("unable to connect to server")
-
-
- def submit(self,deviceCode = None):
- for key,dev in self.devices.iteritems():
- if key == deviceCode or deviceCode == None:
- dev[0].setPost()
- post = dev[0].getPost()
-
- #get the node controller
- controller = self.getController(dev[1])
-
- #get the user info
- info = self.getUserInfo()
- token = info['token']
-
- post['from_client'] = 'yes'
-
- if dev[2] == 'update':
-
- post['id_hard'] = dev[3]
- post['updateAction'] = 'update'
- url = controller + '/update/en/' + token
-
- elif dev[2] == 'insert':
-
- post['insertAction'] = 'insert'
- url = controller + '/insert/en/' + token
-
- self.request.setPost(post)
- self.request.perform(url.encode('utf-8'))
-
- #parse the response
- xmldoc = minidom.parseString(self.request.contents)
- response = xmldoc.getElementsByTagName("status")[0].childNodes[0].data.encode('utf-8')
-
- notice = xmldoc.getElementsByTagName("notice")[0].childNodes[1].data.encode('utf-8')
- self.errors.append(notice.lstrip().rstrip())
-
- if response == 'executed':
- return True
- else:
- return False \ No newline at end of file