blob: 781db7b350524c0f22fbf1a6437d47d6bc10132e [file]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Command fleet-tlw implements the TLS wiring API for Chrome OS fleet labs.
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"net"
"sync"
"golang.org/x/crypto/ssh"
"google.golang.org/grpc"
)
var (
port = flag.Int("port", 0, "Port to listen to")
ufsService = flag.String("ufs-service", "ufs.api.cr.dev", "Host of the UFS service")
svcAcctJSONPath = flag.String("service-account-json", "", "Path to JSON file with service account credentials to use")
proxySSHKey = flag.String("proxy-ssh-key", "", "Path to SSH key for SSH proxy servers (no auth for ExposePortToDut Proxy Mode if unset)")
)
func main() {
if err := innerMain(); err != nil {
log.Fatalf("fleet-tlw: %s", err)
}
}
func innerMain() error {
flag.Parse()
l, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", *port))
if err != nil {
log.Fatalf("fleet-tlw: %s", err)
}
s := grpc.NewServer()
proxySSHSigner, err := authMethodFromKey(*proxySSHKey)
if err != nil {
return err
}
b := fleetTLWBuilder{ufsService: *ufsService, proxySSHSigner: proxySSHSigner, serviceAcctJSON: *svcAcctJSONPath}
tlw, err := b.build()
if err != nil {
return err
}
tlw.registerWith(s)
defer tlw.Close()
ss := newSessionServer(b)
ss.registerWith(s)
defer ss.Close()
c := setupSignalHandler()
var wg sync.WaitGroup
defer wg.Wait()
wg.Add(1)
go func() {
defer wg.Done()
sig := <-c
log.Printf("Captured %v, stopping fleet-tlw service and cleaning up...", sig)
s.GracefulStop()
}()
return s.Serve(l)
}
func authMethodFromKey(keyfile string) (ssh.Signer, error) {
key, err := ioutil.ReadFile(keyfile)
if err != nil {
return nil, fmt.Errorf("auth ssh from key: %s", err)
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return nil, fmt.Errorf("auth ssh from key: %s", err)
}
return signer, nil
}