check_ethernet: add toggle_usb_interface() method

Add "toggle USB interface" method which uses "authorized" field which
controls if a USB port can have a driver bind to it. On a few platforms,
this also results in the port dropping power while "0".

BUG=chromium:677572
TEST=TBD

Change-Id: I7a27199539a7f6c94dfbc4f6af821ed76ba4d614
Reviewed-on: https://chromium-review.googlesource.com/608612
Commit-Ready: Grant Grundler <grundler@chromium.org>
Tested-by: Grant Grundler <grundler@chromium.org>
Reviewed-by: Richard Barnette <jrbarnette@google.com>
Reviewed-by: Grant Grundler <grundler@chromium.org>
diff --git a/recover_duts/hooks/check_ethernet.hook b/recover_duts/hooks/check_ethernet.hook
index ecc196c..0c8305f 100755
--- a/recover_duts/hooks/check_ethernet.hook
+++ b/recover_duts/hooks/check_ethernet.hook
@@ -136,6 +136,29 @@
   return $ret
 }
 
+toggle_usb_interfaces() {
+  local device_path
+  local ret=1
+  for device_path in /sys/class/net/*; do
+    local usbpath=$(readlink -f "${device_path}")
+    # Example of what usbpath is expect to look like:
+    #    usbpath=/sys/devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0/net/eth1
+    #
+    # But we want the port for that device:
+    #    echo ${usbpath%/*/net/eth[0-9]*}
+    #    /sys/devices/pci0000:00/0000:00:14.0/usb2/2-2
+    usbpath=${usbpath%/*/net/eth[0-9]*}
+    if [ -w ${usbpath}/authorized ]; then
+      ret=0
+      # disable port: sort of like unplugging/plugging the dongle
+      echo 0 > ${usbpath}/authorized
+      sleep 3
+      echo 1 > ${usbpath}/authorized
+    fi
+  done
+  return $ret
+}
+
 restart_connection_manager() {
   # NB: -e will fail on a dangling symlink. That's deliberate. The
   # symlink should point at /proc/<locker's PID>. And if that path is
@@ -160,6 +183,7 @@
   for recovery_method in \
       ensure_connection_manager_is_running \
       toggle_ethernet_interfaces \
+      toggle_usb_interfaces \
       reload_usb_ethernet_devices \
       restart_connection_manager; do
     critical_msg "Attempting recovery method \"${recovery_method}\""