blob: e0e8ec2b07768310afdf2dda69521c6076f80ccc [file] [log] [blame]
Sergiusz Bazanskib13b7ff2019-08-29 20:12:24 +02001package main
2
3import (
4 "context"
5 "crypto/x509"
6 "flag"
7 "fmt"
8 "os"
9 "os/user"
10 "syscall"
11
12 "github.com/golang/glog"
13 "golang.org/x/crypto/ssh/terminal"
14 "google.golang.org/grpc"
15 "google.golang.org/grpc/credentials"
16
17 "code.hackerspace.pl/cluster/certs"
18 pb "code.hackerspace.pl/hscloud/cluster/prodvider/proto"
19)
20
21var (
22 flagProdvider string
23 flagUsername string
24 flagForce bool
25)
26
27func init() {
28 flag.Set("logtostderr", "true")
29}
30
31func main() {
32 user, err := user.Current()
33 if err == nil {
34 flagUsername = user.Username
35 }
36
37 flag.StringVar(&flagProdvider, "prodvider", "prodvider.hswaw.net:443", "Prodvider endpoint")
38 flag.StringVar(&flagUsername, "username", flagUsername, "Username to authenticate with")
39 flag.BoolVar(&flagForce, "force", false, "Force retrieving certificates even if they already exist")
40 flag.Parse()
41
42 if flagUsername == "" {
43 glog.Exitf("Username could not be detected, please provide with -username flag")
44 }
45
46 cp := x509.NewCertPool()
47 if ok := cp.AppendCertsFromPEM(certs.Data["ca-kube.crt"]); !ok {
48 glog.Exitf("Could not load k8s CA")
49 }
50
51 creds := credentials.NewClientTLSFromCert(cp, "")
52 conn, err := grpc.Dial(flagProdvider, grpc.WithTransportCredentials(creds))
53 if err != nil {
54 glog.Exitf("Could not dial prodvider: %v", err)
55 }
56
57 prodvider := pb.NewProdviderClient(conn)
58 ctx := context.Background()
59
60 if !needKubernetesCreds() && !flagForce {
61 fmt.Printf("Kubernetes credentials exist. Use `prodaccess -force` to force update.\n")
62 os.Exit(0)
63 }
64
65 attempts := 0
66 for {
67 ok := authenticate(ctx, prodvider)
68 attempts += 1
69 if !ok {
70 if attempts >= 3 {
71 os.Exit(1)
72 }
73 } else {
74 fmt.Printf("Good evening professor. I see you have driven here in your Ferrari.\n")
75 os.Exit(0)
76 }
77 }
78}
79
80func authenticate(ctx context.Context, prodvider pb.ProdviderClient) bool {
81 req := &pb.AuthenticateRequest{
82 Username: flagUsername,
83 Password: password(),
84 }
85
86 res, err := prodvider.Authenticate(ctx, req)
87 if err != nil {
88 glog.Exitf("Prodvider error: %v", err)
89 }
90
91 switch res.Result {
92 case pb.AuthenticateResponse_RESULT_AUTHENTICATED:
93 break
94 case pb.AuthenticateResponse_RESULT_INVALID_CREDENTIALS:
95 fmt.Printf("Invalid username or password.\n")
96 return false
97 default:
98 glog.Exitf("Unknown authentication result: %v", res.Result)
99 }
100
101 useKubernetesKeys(res.KubernetesKeys)
102
103 return true
104}
105
106func password() string {
107 fmt.Printf("Enter SSO/LDAP password for %s@hackerspace.pl: ", flagUsername)
108 bytePassword, err := terminal.ReadPassword(int(syscall.Stdin))
109 if err != nil {
110 return ""
111 }
112 fmt.Printf("\n")
113 return string(bytePassword)
114}