[pve-devel] [PATCH qemu-server 1/3] copy scan_usb from PVE::Storage
Thomas Lamprecht
t.lamprecht at proxmox.com
Fri Nov 16 08:56:05 CET 2018
On 11/15/18 3:30 PM, Dominik Csapak wrote:
> it makes more sense to have it here rather than in storage
but doesn't it even make more sense to have this in pve-common?
This is nothing qemu specific? you just use it (indirectly) here.
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> PVE/QemuServer/USB.pm | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
>
> diff --git a/PVE/QemuServer/USB.pm b/PVE/QemuServer/USB.pm
> index 3d65d38..f51329b 100644
> --- a/PVE/QemuServer/USB.pm
> +++ b/PVE/QemuServer/USB.pm
> @@ -4,6 +4,7 @@ use strict;
> use warnings;
> use PVE::QemuServer::PCI qw(print_pci_addr);
> use PVE::JSONSchema;
> +use PVE::Tools qw(file_read_firstline);
> use base 'Exporter';
>
> our @EXPORT_OK = qw(
> @@ -124,4 +125,61 @@ sub print_usbdevice_full {
> return $usbdevice;
> }
>
> +# idea is from usbutils package (/usr/bin/usb-devices) script
> +sub __scan_usb_device {
> + my ($res, $devpath, $parent, $level) = @_;
> +
> + return if ! -d $devpath;
> + return if $level && $devpath !~ m/^.*[-.](\d+)$/;
> + my $port = $level ? int($1 - 1) : 0;
> +
> + my $busnum = int(file_read_firstline("$devpath/busnum"));
> + my $devnum = int(file_read_firstline("$devpath/devnum"));
> +
> + my $d = {
> + port => $port,
> + level => $level,
> + busnum => $busnum,
> + devnum => $devnum,
> + speed => file_read_firstline("$devpath/speed"),
> + class => hex(file_read_firstline("$devpath/bDeviceClass")),
> + vendid => file_read_firstline("$devpath/idVendor"),
> + prodid => file_read_firstline("$devpath/idProduct"),
> + };
> +
> + if ($level) {
> + my $usbpath = $devpath;
> + $usbpath =~ s|^.*/\d+\-||;
> + $d->{usbpath} = $usbpath;
> + }
> +
> + my $product = file_read_firstline("$devpath/product");
> + $d->{product} = $product if $product;
> +
> + my $manu = file_read_firstline("$devpath/manufacturer");
> + $d->{manufacturer} = $manu if $manu;
> +
> + my $serial => file_read_firstline("$devpath/serial");
> + $d->{serial} = $serial if $serial;
> +
> + push @$res, $d;
> +
> + foreach my $subdev (<$devpath/$busnum-*>) {
> + next if $subdev !~ m|/$busnum-[0-9]+(\.[0-9]+)*$|;
> + __scan_usb_device($res, $subdev, $devnum, $level + 1);
> + }
> +
> +};
> +
> +sub scan_usb {
> +
> + my $devlist = [];
> +
> + foreach my $device (</sys/bus/usb/devices/usb*>) {
> + __scan_usb_device($devlist, $device, 0, 0);
> + }
> +
> + return $devlist;
> +}
> +
> 1;
>
More information about the pve-devel
mailing list