forked from miquella/vaulted
/
spawn.go
60 lines (47 loc) · 1.14 KB
/
spawn.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
package main
import (
"fmt"
"time"
"github.com/miquella/ask"
"github.com/miquella/vaulted/lib"
)
type Spawn struct {
VaultName string
Role string
Command []string
DisplayStatus bool
}
func (s *Spawn) Run(steward Steward) error {
session, err := s.getSession(steward)
if err != nil {
return err
}
timeRemaining := session.Expiration.Sub(time.Now())
timeRemaining = time.Second * time.Duration(timeRemaining.Seconds())
if s.DisplayStatus {
ask.Print(fmt.Sprintf("%s — expires: %s (%s remaining)\n", session.Name, session.Expiration.Format("2 Jan 2006 15:04 MST"), timeRemaining))
}
code, err := session.Spawn(s.Command)
if err != nil {
return ErrorWithExitCode{err, 2}
} else if *code != 0 {
return ErrorWithExitCode{ErrNoError, *code}
}
return nil
}
func (s *Spawn) getSession(steward Steward) (*vaulted.Session, error) {
var err error
// default session
session := DefaultSession()
if s.VaultName != "" {
// get specific session
_, session, err = steward.GetSession(s.VaultName, nil)
if err != nil {
return nil, err
}
}
if s.Role != "" {
return session.Assume(s.Role)
}
return session, nil
}