forked from threadwaste/finto
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
98 lines (79 loc) · 2.03 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
"flag"
"fmt"
"net/http"
"os"
"os/user"
"path/filepath"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/sts"
"github.com/gorilla/handlers"
"github.com/benoitlouy/finto"
)
var (
fintorc = flag.String("config", defaultRC(), "location of config file")
addr = flag.String("addr", "169.254.169.254", "bind to addr")
logfile = flag.String("log", "", "log http to file")
port = flag.Uint("port", 16925, "listen on port")
printver = flag.Bool("version", false, "print version")
)
func main() {
flag.Parse()
if *printver {
fmt.Println("finto", finto.Version)
os.Exit(0)
}
logdest, err := prepareLog(*logfile)
if err != nil {
panic(err)
}
defer logdest.Close()
config, err := LoadConfig(*fintorc)
if err != nil {
panic(err)
}
// SharedCredentialsProvider defaults to file=~/.aws/credentials and
// profile=default when provided zero-value strings
rs := finto.NewRoleSet(sts.New(session.New(), &aws.Config{
Credentials: credentials.NewSharedCredentials(
config.Credentials.File,
config.Credentials.Profile,
),
}))
for alias, arn := range config.Roles {
rs.SetRole(alias, arn)
}
context, err := finto.InitFintoContext(rs, config.DefaultRole)
if err != nil {
fmt.Println("warning: default role not set:", err)
}
router := finto.FintoRouter(&context)
handler := handlers.LoggingHandler(logdest, router)
err = http.ListenAndServe(fmt.Sprint(*addr, ":", *port), handler)
if err != nil {
panic(err)
}
}
func homeDir() (string, error) {
currentUser, err := user.Current()
if err != nil {
return "", fmt.Errorf("failed to get user: %s", err)
}
return currentUser.HomeDir, err
}
func defaultRC() string {
dir, err := homeDir()
if err != nil {
return ""
}
return filepath.Join(dir, ".fintorc")
}
func prepareLog(filename string) (*os.File, error) {
if filename != "" {
return os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
}
return os.Stdout, nil
}