| $line: | ";
$iommu = substr($line, 12);
$append = true;
} else {
$line = preg_replace("/^\t/","",$line);
$pciaddress = explode(" ", $line)[1];
if (preg_match($BDF_REGEX, $pciaddress)) {
// only was provided, assume Domain is 0000
$pciaddress = "0000:".$pciaddress;
}
echo ($append)?"":" | ";
exec("lspci -v -s $pciaddress", $outputvfio);
if (preg_grep("/vfio-pci/i", $outputvfio)) {
echo "";
$isbound = "true";
}
echo " | ";
if ((strpos($line, 'Host bridge') === false) && (strpos($line, 'PCI bridge') === false)) {
if (file_exists('/sys/kernel/iommu_groups/'.$iommu.'/devices/'.$pciaddress.'/reset')) echo "";
echo " | ";
echo in_array($iommu, $iommuinuse) ? ' " : ">";
} else { echo " | "; }
echo ' | '.$line.' | ';
unset($outputvfio);
switch (true) {
case (strpos($line, 'USB controller') !== false):
if ($isbound) {
echo ' | | | | '._('This controller is bound to vfio, connected USB devices are not visible').'. | ';
} else {
exec('for usb_ctrl in $(find /sys/bus/usb/devices/usb* -maxdepth 0 -type l);do path="$(realpath "${usb_ctrl}")";if [[ $path == *'.$pciaddress.'* ]];then bus="$(cat "${usb_ctrl}/busnum")";lsusb -s $bus:|sort;fi;done',$getusb);
foreach($getusb as $usbdevice) {
echo " | | | | $usbdevice | ";
}
unset($getusb);
}
break;
case (strpos($line, 'SATA controller') !== false):
case (strpos($line, 'Serial Attached SCSI controller') !== false):
case (strpos($line, 'RAID bus controller') !== false):
case (strpos($line, 'SCSI storage controller') !== false):
case (strpos($line, 'IDE interface') !== false):
case (strpos($line, 'Mass storage controller') !== false):
case (strpos($line, 'Non-Volatile memory controller') !== false):
if ($isbound) {
echo ' | | | | '._('This controller is bound to vfio, connected drives are not visible').'. | ';
} else {
exec('ls -al /sys/block/sd* /sys/block/hd* /sys/block/sr* /sys/block/nvme* 2>/dev/null | grep -i "'.$pciaddress.'"',$getsata);
foreach($getsata as $satadevice) {
$satadevice = substr($satadevice, strrpos($satadevice, '/', -1)+1);
$search = preg_grep('/'.$satadevice.'.*/', $lsscsi);
foreach ($search as $deviceline) {
echo ' | | | | '.$deviceline.' | ';
}
}
unset($search);
unset($getsata);
}
break;
}
unset($isbound);
$append = false;
}
}
echo ' | | | |
| ';
}
break;
case 't2':
exec('cat /sys/devices/system/cpu/*/topology/thread_siblings_list|sort -nu',$pairs);
$i = 1;
foreach ($pairs as $line) {
$line = preg_replace(['/(\d+)[-,](\d+)/','/(\d+)\b/'],['$1 / $2','cpu $1'],$line);
echo "| ".(strpos($line,'/')===false?"Single":"Pair ".$i++).": | $line | ";
}
break;
case 't3':
exec('lsusb|sort',$lsusb);
foreach ($lsusb as $line) {
list($bus,$id) = explode(':', $line, 2);
echo "| $bus: | ".trim($id)." | ";
}
break;
case 't4':
exec('lsscsi -s',$lsscsi);
foreach ($lsscsi as $line) {
if (strpos($line,'/dev/')===false) continue;
echo "| ".preg_replace('/\] +/','] | ',$line)." | ";
}
break;
}
?>
|