From 07a51fa6aad36fd78dc77ab343f46fc0a8764264 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 4 Jul 2020 12:35:36 -0400 Subject: better approach for finding hub port that works when port is powered off --- src/Propellor/Property/SiteSpecific/JoeySites.hs | 44 ++++++++++++++++++------ 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'src/Propellor') diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs index 9b8a7e70..0abd1899 100644 --- a/src/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs @@ -1238,33 +1238,46 @@ homeNAS = propertyList "home NAS" $ props [ "# let users power control startech hub with uhubctl" , "ATTR{idVendor}==\"" ++ hubvendor ++ "\", ATTR{idProduct}==\"005a\", MODE=\"0666\"" ] - & autoMountDrivePort "archive-10" (USBHubPort hubvendor hubloc 1) + & autoMountDrivePort "archive-10" + (USBHubPort hubvendor 1) + (USBDriveId wd "1230") (Just "archive-oldest") - & autoMountDrivePort "archive-11" (USBHubPort hubvendor hubloc 2) + & autoMountDrivePort "archive-11" + (USBHubPort hubvendor 2) + (USBDriveId wd "25ee") (Just "archive-older") - & autoMountDrivePort "archive-12" (USBHubPort hubvendor hubloc 3) + & autoMountDrivePort "archive-12" + (USBHubPort hubvendor 3) + (USBDriveId seagate "3322") (Just "archive-old") - & autoMountDrivePort "archive-13" (USBHubPort hubvendor hubloc 4) + & autoMountDrivePort "archive-13" + (USBHubPort hubvendor 4) + (USBDriveId wd "25a3") (Just "archive") & autoMountDrive "passport" Nothing & Apt.installed ["git-annex", "borgbackup"] where hubvendor = "0409" - hubloc = "4-1.6" + wd = "1058" + seagate = "0bc2" data USBHubPort = USBHubPort { hubVendor :: String - , hubLocation :: String , hubPort :: Int } +data USBDriveId = USBDriveId + { driveVendorId :: String + , driveProductId :: String + } + -- Makes a USB drive with the given label automount, and unmount after idle -- for a while. -- -- The hub port is turned on and off automatically as needed, using -- uhubctl. -autoMountDrivePort :: Mount.Label -> USBHubPort -> Maybe FilePath -> Property DebianLike -autoMountDrivePort label hp malias = propertyList desc $ props +autoMountDrivePort :: Mount.Label -> USBHubPort -> USBDriveId -> Maybe FilePath -> Property DebianLike +autoMountDrivePort label hp drive malias = propertyList desc $ props & File.hasContent ("/etc/systemd/system/" ++ hub) [ "[Unit]" , "Description=Startech usb hub port " ++ show (hubPort hp) @@ -1272,7 +1285,7 @@ autoMountDrivePort label hp malias = propertyList desc $ props , "[Service]" , "Type=oneshot" , "RemainAfterExit=true" - , "ExecStart=/usr/sbin/uhubctl -a on " ++ selecthubport + , "ExecStart=/bin/sh -c 'uhubctl -a on " ++ selecthubport ++ "'" , "ExecStop=/bin/sh -c 'uhubctl -a off " ++ selecthubport -- Powering off the port does not remove device -- files, so ask udev to remove the devfile; it will @@ -1300,7 +1313,18 @@ autoMountDrivePort label hp malias = propertyList desc $ props selecthubport = unwords [ "-p", show (hubPort hp) , "-n", hubVendor hp - , "-l", hubLocation hp + , "-l", concat + -- The hub's location id, eg "1-1.4", does not seem + -- as stable as uhubctl claims it will be, + -- and the vendor is not sufficient since I have 2 + -- hubs from the same vendor. So search for the + -- drive lsusb to find that. This works even if the + -- port is powered off, as long as it's been on at + -- some point before. + [ "$(lsusb -tvv | perl -lne \"if (m!/sys/bus/usb/devices/(.*?) !) {\\\\$v=$1}; if (/" + , driveVendorId drive ++ ":" ++ driveProductId drive + ++ "/) { print \\\\$v; last}\")" + ] ] -- Makes a USB drive with the given label automount, and unmount after idle -- cgit v1.2.3