".$iommu[$i++]."$line"; } else { foreach ($groups as $line) { if (!$line) continue; if ($line[0]=='I') { if ($spacer) echo ""; else $spacer = true; echo "$line:"; $iommu = substr($line, 12); $append = true; } else { $line = preg_replace("/^\t/","",$line); $pciaddress = substr($line, 12, 7); echo ($append)?"":""; exec("lspci -v -s $pciaddress", $outputvfio); if (preg_grep("/vfio-pci/i", $outputvfio)) { echo ""; $isbound = "true"; } unset($outputvfio); echo ""; if (file_exists('/sys/kernel/iommu_groups/'.$iommu.'/devices/0000:'.$pciaddress.'/reset')) echo ""; echo ""; echo in_array_r($pciaddress, $inuse) ? ' " : ">"; echo $line; echo ""; 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:;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* | grep -i "'.$pciaddress.'"',$getsata); exec('ls -al /sys/block/hd* | grep -i "'.$pciaddress.'"',$getsata); exec('ls -al /sys/block/sr* | grep -i "'.$pciaddress.'"',$getsata); exec('ls -al /sys/block/nvme* | 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; } } } 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; } ?>