Usage: labtunnel [options] <tunnel_operation> <dut_host>

  Supported tunnel_operation values:

    wificell        Opens an ssh tunnel for port 22 to the dut, pcap, and router
                    of a wificell.

                      - The dut hostname is resolved from <dut_host> by removing
                        the prefix "crossk-" if it is present. This can be
                        overridden with the --dut option.

                      - The pcap hostname is dut hostname plus the "-pcap"
                        suffix. This can be overridden with the --pcap option.
                        If the dut hostname ends with ".cros", the pcap hostname
                        will end with "-pcap.cros". To skip the creation of
                        the pcap tunnel, use the --no-pcap option.

                      - The router hostname is dut hostname plus the "-router"
                        suffix. This can be overridden with the --router option.
                        If the dut hostname ends with ".cros", the router
                        hostname will end with "-router.cros".

                      - All tunnels are destroyed upon stopping this script.


    callbox         Opens ssh tunnels for dut ssh, the callbox manager on a
                    proxy server, and the specified callbox through the proxy
                    server.

                      - The dut tunnel is created in the same manner as with the
                        wificell tunnel_operation.

                      - The callbox manager tunnel is made to port 5000 on the
                        proxy server.

                      - The proxy server location defaults to
                        "access@chromeos1-proxy" and can be overridden with the
                        --proxy option.

                      - The callbox tunnel is made to <callbox>:5025 on the
                        proxy server, as the callboxes do not support SSH. Use
                        the --callbox option to specify the callbox host.

                      - All tunnels are destroyed upon stopping this script.


    dut             Opens an ssh tunnel for port 22 to the dut.

                      - The dut tunnel is created in the same manner as with the
                        wificell tunnel_operation.

                      - All tunnels are destroyed upon stopping this script.


    dutvnc          Starts kmsvnc on the dut via ssh, opens a tunnel to it on
                    port 5900, and connects to it using TigerVNC.

                      - The kmsvnc process on the dut and TigerVNC client on
                        this machine are stopped and all tunnels are destroyed
                        upon stopping this script.

                      - To use a different VNC client other than TigerVNC, use
                        the --do-not-open-vnc option to skip connecting to the
                        VNC server with TigerVNC and then connect to
                        localhost:5900 with your preferred VNC client.

    btpeers         Opens ssh tunnels to Chameleond running on bluetooth peers.

                      - Specify the number of bluetooth peers to connect to
                        with the --btpeer-count option.

                      - Specify the remote Chameleond port with the
                        --chameleond-port option. The local forwarded ports will
                        also reflect this same port with an offset for the
                        btpeer number.

                      - This does not create a tunnel for the dut, it just
                        uses the provided dut hostname to determine the
                        hostnames of the btpeers. The formula for the btpeer
                        hostname is "<dut>-btpeer<n>", where "<dut>" is the dut
                        hostname (as used in the dut tunnel_operation) and "<n>"
                        is the Nth bluetooth peer, starting at 1. If you need
                        tunnel to the dut, it's suggested to just run another
                        labtunnel process using the dut tunnel_operation.


  Supported options:
   --help|help|-h             Prints this help text and exists.

   --port|-p <port>           Sets the start port number to <port> for ssh
                              tunnels to remote port 22. Defaults to 2200.

   --dut <host>               Sets the DUT hostname to <host> and does not
                              resolve it any further like how <dut_host> is
                              resolved.

   --pcap <host>              Sets the PCAP hostname to <host>. If unset, it is
                              resolved from the dut hostname.

   --router <host>            Sets the router hostname to <host>. If unset, it
                              is resolved from the dut hostname.

   --no-pcap                  Skips pcap tunnel creation during the wificell
                              tunnel_operation.

   --callbox <host>           Sets the callbox hostname to <host>. This host
                              must be resolvable by the proxy server. Required
                              for callbox tunnel_operation.

   --do-not-open-vnc          Skips opening the TigerVNC client for
                              tunnel_operation dutvnc.

   --lease                    The <dut_host> will be leased with crosfleet prior
                              to preforming any other operation. The lease is
                              abandoned upon stopping this script.

   --lease-retain             Prevents the script from abandoning the lease
                              created with --lease upon closing.

   --lease-option <option>    Adds the CLI option <option> to the crosfleet dut
                              lease call with --lease. Can be repeated.

   --lease-options <options>  Sets all the CLI options to <options> to the
                              crosfleet dut lease call with --lease.

   --ssh-option <option>      Adds the CLI option <option> to the options used
                              in all ssh commands. Can be repeated.

   --ssh-options <options>    Sets all the CLI options to <options> used for all
                              ssh commands.

   --btpeer-count <n>         Specifies the number of bluetooth peers to tunnel
                              to for the btpeers tunnel_operation. Must be a
                              positive integer. Defaults to 1.

   --chameleond-port <port>   Specifies the remote Chameleond port to tunnel to
                              for btpeers. Defaults to 9992.
