======OnlineDriverDB======
=====Contents=====
* [[https://www.linuxfoundation.org/#Introduction|1 Introduction]]
* [[https://www.linuxfoundation.org/#Client-side_Protocol|2 Client-side Protocol]]
* [[https://www.linuxfoundation.org/#HardwareID|2.1 HardwareID]]
* [[https://www.linuxfoundation.org/#DriverDesc|2.2 DriverDesc]]
* [[https://www.linuxfoundation.org/#query.28.29_argument_format|2.3 query() argument format]]
* [[https://www.linuxfoundation.org/#query.28.29_Response_format|2.4 query() Response format]]
* [[https://www.linuxfoundation.org/#Database_dump|2.5 Database dump]]
* [[https://www.linuxfoundation.org/#Administration_protocol|3 Administration protocol]]
* [[https://www.linuxfoundation.org/#Adding_an_entry|3.1 Adding an entry]]
* [[https://www.linuxfoundation.org/#Deleting_an_entry|3.2 Deleting an entry]]
* [[https://www.linuxfoundation.org/#Server_requirements|4 Server requirements]]
**Introduction**
Distro and kernel specific local detection of available device drivers
are hard to maintain for stable distribution releases, since they
require uploads. They also do not apply to community contributed
drivers which are not officially supported by the distribution. An
online database makes post-release updates much easier and less
intrusive, and also allows for DB instances which are community
supported.
This document defines the version 20080407, sub-version 0 of the
XML-RPC protocol RPC protocol, as discussed on the 2008
LinuxFoundation Collaboration Summit. This driver database protocol
can be used by [[https://launchpad.net/jockey|Jockey]].
TODO: How many instances of this DriverDB make sense, and where do
they life?
**Client-side Protocol**===== HardwareID =====
A particular piece of hardware is described by a "Hardware Identifier"
(''HardwareID'') in (type, value) pair. Currently defined types
are ''modalias'' and ''printer''; more types are likely to
get defined in the near future.
Examples:
* (''modalias'', ''pci:v00008086d000027A2sv00001028sd00000201bc03sc00i00'')
* (''printer'', ''Canon BJ2'')
Due to limitations of XML-RPC, the protocol encodes HardwareIDs as
a single string //type//://value// instead of a pair.
**DriverDesc**
The driver database cannot and should not store the actual driver
packages, but merely provide their description and location. This is
represented as a mapping //attribute// →//value//.
The following attributes are defined:
* ** driver_type **
* //kernel_module// | //printer_driver// | ... (required)
* ** driver_vendor **
* very short string, requirements as in pci.ids (required)
* ** description **
* //locale// → //string// mapping (human-readable single-line) (required)
* ** long_description **
* //locale// → //string// (human-readable paragraph) (optional)
* ** version **
* string, arbitrary differentiation (optional)
* ** jockey_handler **
* class name for Jockey handler (inferred from driver_type for standard handlers) (optional)
* ** repository **
* distribution specific package repository location (optional)
* ** package **
* Package name (optional)
* ** free **
* boolean; True (free software) or False (proprietary driver) (required)
* ** license **
* verbatim license text (required if free == no, otherwise optional)
Depending on the particular driver type, there are more required and
optional attributes. The only attribute so far is //kernel_module//
for the //kernel_module// driver type.
Example:
driver_type: kernel_module
driver_vendor: ABM
kernel_module: abm_sb43
description: ("C": "SuperBeam 43 Wifi cards", "de": "SuperBeam 43 Funknetzwerk")
repository: http://drivers.abm.com/foonux
package: linux-superbeam43
free: True
**query() argument format**
The //query()// call to the XML-RPC driver database takes a triple as argument:
> (//protocol_version//, //protocol_subversion//, //query_attribute// → //query_value//)
where
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** query_attribute → query_value **
* Mapping of hardware/OS attributes to values
The following query attributes must be supplied:
* ** system_vendor **
* Computer vendor (e. g. "Dell"); empty string if unknown
* ** system_product **
* Computer model (e. g. "Latitude D430"); empty string if unknown
* ** os_name **
* Operating system name
* ** os_version **
* Operating system version
* ** kernel_ver **
* Output of ''uname -r''
* ** architecture **
* Output of ''uname -m''
* ** components **
* list of HardwareID
Example (in Python syntax):
('20080407', '0', {
'components': ['modalias:pci:12345', 'printer:Canon BJ2'],
'system_vendor': 'Doll',
'system_product': 'Longitude A380',
'os_name': 'FooTux',
'os_version': '2.0',
'kernel_ver': '2.6.24-15-generic',
'architecture': 'i686'
})
**query() Response format**
The XML-RPC driver database server sends back a triple
> (//protocol_version//, //protocol_subversion//, //HardwareID// → list of //DriverDesc//)
//protocol_version// should generally match the version from the
request, //protocol_subversion// might differ. However, as with the
request format, the only defined protocol at the moment is 20080407/0.
//HardwareID// and //DriverDesc// are structured like described in the
previous two paragraphs.
Example (in Python syntax):
('20080407', '0', {
'modalias:pci:12345': [
{'driver_type': 'kernel_module',
'kernel_module': 'abm_sb43',
'driver_vendor': 'ABM',
'description': {'C': 'ABM SuperBeam 43 Wifi cards', 'de': 'SuperBeam 43 Funknetzwerk'},
'repository': 'http://drivers.abm.com/foonux',
'package': 'abm-superbeam43'
'free': False,
'license': 'You have to send us your soul to use this.',
},
{'driver_type': 'kernel_module',
'kernel_module': 'sbeam',
'driver_vendor': 'FooTux',
'description': {'C': 'Default SuperBeam Linux driver'},
'package': 'superbeam-drv',
'free': True
},
],
'printer:Canon BJ2': [
{'driver_type': 'printer_driver',
'driver_vendor': '', # local distro package
'description': {'C': 'Canon BubbleJet Color printer driver'},
'foomatic_module': 'canon_bj',
'bj_arg': 'color'
'free': True
}
]
})
**Database Dump**
The XML-RPC call for dumping the entire database has the following signature:
//dump//: () → (protocol_version, protocol_subversion, (query_attribute → query_value) → list of DriverDesc)
i. e. it takes no arguments at all, and returns a triple
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** query_attribute → query_value **
* as in "Query format" above, but with exactly one component
* ** list of DriverDesc **
* like above, but every driver record has an additional field "id" with an unique value to identify this driver record; this ID can be used to modify/delete driver records
\\
**Administration Protocol**
These commands should only be available to authorized people who are able to change the database.
**Adding an Entry**
Signature:
//add//: (protocol_version, protocol_subversion, (query_attribute → query_value), DriverDesc) → (protocol_version, protocol_subversion, status, id)
Input:
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** query_attribute → query_value **
* as in "Query format" above, but with exactly one component
* ** DriverDesc **
* as above
Output:
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** status **
* "OK" on success, or error message on failure
* ** id **
* assigned unique identifier for the driver, as returned in the //dump()// call
The command should fail if query → DriverDesc already exists, and return the existing id; in this case, the old record needs to be deleted first. This prevents admins from accidentally overwriting records.
**Deleting an Entry**
Signature:
//delete//: (protocol_version, protocol_subversion, id) → (protocol_version, protocol_subversion, status)
Input:
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** id **
* unique identifier for the driver, as returned in the //dump()// call
Output:
* ** protocol_version **
* ''20080407'' (this is the only defined standard at the moment)
* ** protocol_subversion **
* ''0'' (this is the only defined standard at the moment)
* ** status **
* "OK" on success, or error message on failure
Note: the database should clean up HardwareID records which do not have any associated drivers any more.
**Server Requirements**
The following features are needed to provide enough functionality for
a per-distro/per-community driver database, which could then be used
by Jockey:
* a database design which efficiently supports the query format above
* unauthenticated read-only data retrieval (queries)
* authenticated changing of data over an XML-RPC call
* autentication preferably happens over mutual SSL certificates, alternatively with a password from the client side
* should not have a lot of logic; all the clever data-extraction from modules etc. should happen on the distributor's client side
* A way to ensure data integrity (SSL authentication for queries? GPG signed checksums? TBD)
* An XML-RPC API to dump the entire database.
A further extension should implement server-side ACLs and multi-user
authentication, so that various distros/other groups can get access to
the distro specific database entries (selection by
os_name/os_version). With this, we can put the database on a common
server like drivertool.org, and synchronizing DB entries between
distros would become easier and more attractive.
Further improvements would provide:
* a WebUI for queries (unauthenticated)
* a WebUI for managing DB entries (authenticated)
* Knowledge about particular distribution repositories for providing integrity checks (URLs and package names correct, etc.)