Skip to content

Commit c7565e8

Browse files
committed
add once
Signed-off-by: Jess Frazelle <[email protected]>
1 parent 94b44ff commit c7565e8

File tree

2 files changed

+51
-30
lines changed

2 files changed

+51
-30
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,23 @@ $ docker run -d --restart always \
3636
## Usage
3737

3838
```console
39+
$ sshb0t -h
3940
_ _ ___ _
4041
___ ___| |__ | |__ / _ \| |_
4142
/ __/ __| '_ \| '_ \| | | | __|
4243
\__ \__ \ | | | |_) | |_| | |_
4344
|___/___/_| |_|_.__/ \___/ \__|
4445
A bot for keeping your ssh authorized_keys up to date with user's GitHub keys
4546
Version: v0.3.0
47+
Build: 94b44ff
48+
4649
-d run in debug mode
4750
-interval string
4851
update interval (ex. 5ms, 10s, 1m, 3h) (default "30s")
4952
-keyfile string
50-
file to update the authorized_keys (default "/home/jess/.ssh/authorized_keys")
53+
file to update the authorized_keys (default "/home/jessie/.ssh/authorized_keys")
54+
-once
55+
run once and exit, do not run as a daemon
5156
-user value
5257
GitHub usernames for which to fetch keys
5358
-v print version and exit (shorthand)

main.go

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,18 @@ const (
2929
|___/___/_| |_|_.__/ \___/ \__|
3030
A bot for keeping your ssh authorized_keys up to date with user's GitHub keys
3131
Version: %s
32+
Build: %s
33+
3234
`
3335
)
3436

3537
var (
3638
home string
3739
authorizedKeysFile string
3840
users stringSlice
39-
interval string
41+
42+
interval string
43+
once bool
4044

4145
debug bool
4246
vrsn bool
@@ -65,14 +69,16 @@ func init() {
6569
// parse flags
6670
flag.StringVar(&authorizedKeysFile, "keyfile", filepath.Join(home, defaultSSHAuthorizedKeysFile), "file to update the authorized_keys")
6771
flag.Var(&users, "user", "GitHub usernames for which to fetch keys")
72+
6873
flag.StringVar(&interval, "interval", "30s", "update interval (ex. 5ms, 10s, 1m, 3h)")
74+
flag.BoolVar(&once, "once", false, "run once and exit, do not run as a daemon")
6975

7076
flag.BoolVar(&vrsn, "version", false, "print version and exit")
7177
flag.BoolVar(&vrsn, "v", false, "print version and exit (shorthand)")
7278
flag.BoolVar(&debug, "d", false, "run in debug mode")
7379

7480
flag.Usage = func() {
75-
fmt.Fprint(os.Stderr, fmt.Sprintf(BANNER, version.VERSION))
81+
fmt.Fprint(os.Stderr, fmt.Sprintf(BANNER, version.VERSION, version.GITCOMMIT))
7682
flag.PrintDefaults()
7783
}
7884

@@ -133,38 +139,48 @@ func main() {
133139
}
134140
ticker = time.NewTicker(dur)
135141

142+
// If the user passed the once flag, just do the run once and exit.
143+
if once {
144+
run()
145+
os.Exit(0)
146+
}
147+
136148
logrus.Infof("Starting bot to update %s every %s for users %s", authorizedKeysFile, interval, strings.Join(users, ", "))
137149
for range ticker.C {
138-
// fetch the keys for each user
139-
var keys string
140-
for _, user := range users {
141-
// fetch the url
142-
url := fmt.Sprintf(defaultGitHubKeyURI, user)
143-
logrus.Debugf("Fetching keys for user %s from %s", user, url)
144-
resp, err := http.Get(url)
145-
if err != nil {
146-
logrus.Warnf("Fetching keys for user %s from %s failed: %v", user, url, err)
147-
}
148-
// make sure we got status 200
149-
if http.StatusOK != resp.StatusCode {
150-
logrus.Warnf("Expected status code 200 from %s but got %d for user %s", url, resp.StatusCode, user)
151-
}
152-
// read the body
153-
b, err := ioutil.ReadAll(resp.Body)
154-
if err != nil {
155-
logrus.Fatalf("Reading response body from %s for user %s failed: %v", url, user, err)
156-
}
157-
// append to keys variable with a new line
158-
keys += string(b) + "\n"
159-
}
150+
run()
151+
}
152+
}
160153

161-
// update the authorized key file
162-
logrus.Infof("Updating authorized key file %s with keys from %s", authorizedKeysFile, strings.Join(users, ", "))
163-
if err := ioutil.WriteFile(authorizedKeysFile, []byte(keys), 0600); err != nil {
164-
logrus.Fatalf("Writing to file %s failed: %v", authorizedKeysFile, err)
154+
func run() {
155+
// fetch the keys for each user
156+
var keys string
157+
for _, user := range users {
158+
// fetch the url
159+
url := fmt.Sprintf(defaultGitHubKeyURI, user)
160+
logrus.Debugf("Fetching keys for user %s from %s", user, url)
161+
resp, err := http.Get(url)
162+
if err != nil {
163+
logrus.Warnf("Fetching keys for user %s from %s failed: %v", user, url, err)
164+
}
165+
// make sure we got status 200
166+
if http.StatusOK != resp.StatusCode {
167+
logrus.Warnf("Expected status code 200 from %s but got %d for user %s", url, resp.StatusCode, user)
165168
}
166-
logrus.Info("Successfully updated keys")
169+
// read the body
170+
b, err := ioutil.ReadAll(resp.Body)
171+
if err != nil {
172+
logrus.Fatalf("Reading response body from %s for user %s failed: %v", url, user, err)
173+
}
174+
// append to keys variable with a new line
175+
keys += string(b) + "\n"
176+
}
177+
178+
// update the authorized key file
179+
logrus.Infof("Updating authorized key file %s with keys from %s", authorizedKeysFile, strings.Join(users, ", "))
180+
if err := ioutil.WriteFile(authorizedKeysFile, []byte(keys), 0600); err != nil {
181+
logrus.Fatalf("Writing to file %s failed: %v", authorizedKeysFile, err)
167182
}
183+
logrus.Info("Successfully updated keys")
168184
}
169185

170186
func usageAndExit(message string, exitCode int) {

0 commit comments

Comments
 (0)