@@ -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
3537var (
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
170186func usageAndExit (message string , exitCode int ) {
0 commit comments