main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. "strings"
  10. "github.com/spf13/pflag"
  11. "github.com/spf13/viper"
  12. )
  13. const (
  14. apiPath = "%s://%s:%s/api/url/%s"
  15. )
  16. type config struct {
  17. proto string
  18. host string
  19. port string
  20. dumpFile string
  21. }
  22. type RoutesDump struct {
  23. OK bool `json:"ok"`
  24. Routes []Route `json:"routes"`
  25. Next string `json:"next"`
  26. }
  27. type Route struct {
  28. Name string `json:"name"`
  29. URL string `json:"url"`
  30. }
  31. func main() {
  32. c := config{}
  33. pflag.StringVar(&c.proto, "protocol", "https", "protocol to use. Only HTTP or HTTPS supported")
  34. pflag.StringVar(&c.host, "host", "localhost", "host to post data to")
  35. pflag.StringVar(&c.port, "port", "8067", "port on host to talk to")
  36. pflag.StringVar(&c.dumpFile, "file", "", "dump file to load from")
  37. pflag.Parse()
  38. if err := viper.BindPFlags(pflag.CommandLine); err != nil {
  39. log.Panic(err)
  40. }
  41. // allow env vars to set pflags
  42. viper.AutomaticEnv()
  43. viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
  44. if c.dumpFile == "" {
  45. log.Fatal("dump file must be specified with --file argument")
  46. }
  47. var d RoutesDump
  48. f, err := ioutil.ReadFile(c.dumpFile)
  49. if err != nil {
  50. log.Printf("error reading dump file : %s\n", c.dumpFile)
  51. log.Fatal(err)
  52. }
  53. err = json.Unmarshal(f, &d)
  54. if err != nil {
  55. log.Printf("error parsing dump file : %s\n", c.dumpFile)
  56. log.Fatal(err)
  57. }
  58. for _, v := range d.Routes {
  59. req := fmt.Sprintf(apiPath, c.proto, c.host, c.port, v.Name)
  60. p, err := json.Marshal(&v)
  61. if err != nil {
  62. log.Printf("error marshalling data for link : %s\n", v.Name)
  63. log.Println(err)
  64. continue
  65. }
  66. resp, err := http.Post(req, "application/json", bytes.NewReader(p))
  67. if err != nil {
  68. log.Printf("error POSTing link : %s %s\n", v.Name, err.Error())
  69. } else {
  70. log.Printf("POSTed short link (%s) : %s\n", resp.Status, v.Name)
  71. resp.Body.Close()
  72. }
  73. }
  74. }