/* Serve is a very simple static file server in go Usage: -p="8100": port to serve on -d=".": the directory of static files to host Navigating to http://localhost:8100 will display the index.html or directory listing file. */ package main import ( "context" "io/ioutil" "local/args" "log" "net/http" "os" "path" "strings" "time" ) func main() { fs := args.NewArgSet() fs.Append(args.STRING, "p", "port to serve", "8100") fs.Append(args.STRING, "d", "static path to serve", "./public") if err := fs.Parse(); err != nil { panic(err) } d := fs.Get("d").GetString() p := fs.Get("p").GetString() go serve(d, p) go poll(path.Join(d, "csv"), time.Minute) <-context.Background().Done() } func serve(directory, port string) { port = strings.TrimPrefix(port, ":") http.Handle("/", http.FileServer(http.Dir(directory))) log.Printf("Serving %s on HTTP port: %s\n", directory, port) log.Fatal(http.ListenAndServe(":"+port, nil)) } func poll(path string, interval time.Duration) { for { select { case <-context.Background().Done(): case <-time.After(interval): if err := refresh(path); err != nil { log.Println(err) } } } } func refresh(path string) error { url := "https://docs.google.com/spreadsheets/d/14F7zRrwGT6JkCeZqZLPM2r2GScrm9FLFxlPtDINbNWg/gviz/tq?tqx=out:csv" resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { return err } if err := ioutil.WriteFile(path, b, os.ModePerm); err != nil { return err } return nil }