Last active
January 2, 2016 00:49
-
-
Save Zemnmez/8226068 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"errors" | |
"flag" | |
"fmt" | |
"os" | |
"os/exec" | |
"strings" | |
"time" | |
) | |
const format = time.Kitchen | |
var ( | |
cmd, atTime string | |
) | |
type status int | |
const ( | |
ok status = 0 | |
fail status = 1 | |
) | |
func main() { | |
var s status | |
defer os.Exit(int(s)) | |
flag.StringVar(&cmd, "cmd", "", "Command to run at date.") | |
flag.StringVar(&atTime, "time", "", "Date or time to run at. Uses time.Parse (http://golang.org/pkg/time/#Parse). Expected format: \""+format+"\".") | |
flag.Parse() | |
for inf := range run() { | |
var err error | |
switch v := inf.(type) { | |
case status: | |
s = v | |
case error: | |
_, err = fmt.Fprintf(os.Stderr, "Error: %s\n", v.Error()) | |
case string: | |
_, err = os.Stdout.Write([]byte(v + "\n")) | |
} | |
if err != nil { | |
panic(fmt.Sprintf("Fatal error: %s\n", err.Error())) | |
} | |
} | |
} | |
func run() (chn <-chan interface{}) { | |
c := make(chan interface{}) | |
chn = c | |
go func() { | |
defer close(c) | |
if cmd == "" || atTime == "" { | |
c <- errors.New("Command or time unspecified") | |
c <- fail | |
return | |
} | |
t, err := time.Parse(format, atTime) | |
if err != nil { | |
c <- err | |
c <- fail | |
return | |
} | |
n := time.Now() | |
future := time.Date(n.Year(), n.Month(), n.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location()) | |
c <- fmt.Sprintf("I'll be back at %+q", future) | |
time.Sleep(future.Sub(n)) | |
c <- fmt.Sprintf("I'm back, running %+q.", cmd) | |
spl := strings.Split(cmd, " ") | |
err = exec.Command(spl[0], spl[1:]...).Start() | |
if err != nil { | |
c <- err | |
c <- fail | |
return | |
} | |
return | |
}() | |
return | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment