Add 'sdk/java-v2/' from commit '55f103e336ca9fb8bf1720d2ef4ee8dd4e221118'
[arvados.git] / lib / dispatchcloud / worker / verify.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package worker
6
7 import (
8         "bytes"
9         "errors"
10         "fmt"
11
12         "git.curoverse.com/arvados.git/lib/cloud"
13         "golang.org/x/crypto/ssh"
14 )
15
16 var (
17         errBadInstanceSecret = errors.New("bad instance secret")
18
19         // filename on instance, as given to shell (quoted accordingly)
20         instanceSecretFilename = "/var/run/arvados-instance-secret"
21         instanceSecretLength   = 40 // hex digits
22 )
23
24 type tagVerifier struct {
25         cloud.Instance
26 }
27
28 func (tv tagVerifier) VerifyHostKey(pubKey ssh.PublicKey, client *ssh.Client) error {
29         expectSecret := tv.Instance.Tags()[tagKeyInstanceSecret]
30         if err := tv.Instance.VerifyHostKey(pubKey, client); err != cloud.ErrNotImplemented || expectSecret == "" {
31                 // If the wrapped instance indicates it has a way to
32                 // verify the key, return that decision.
33                 return err
34         }
35         session, err := client.NewSession()
36         if err != nil {
37                 return err
38         }
39         defer session.Close()
40         var stdout, stderr bytes.Buffer
41         session.Stdin = bytes.NewBuffer(nil)
42         session.Stdout = &stdout
43         session.Stderr = &stderr
44         cmd := fmt.Sprintf("cat %s", instanceSecretFilename)
45         if u := tv.RemoteUser(); u != "root" {
46                 cmd = "sudo " + cmd
47         }
48         err = session.Run(cmd)
49         if err != nil {
50                 return err
51         }
52         if stdout.String() != expectSecret {
53                 return errBadInstanceSecret
54         }
55         return nil
56 }