github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/realtime/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "net/http" 7 "os" 8 "path/filepath" 9 10 "github.com/unirita/cuto/master/config" 11 "github.com/unirita/cuto/realtime/network" 12 "github.com/unirita/cuto/util" 13 ) 14 15 // Runtime arguments 16 type arguments struct { 17 realtimeName string 18 jsonURL string 19 } 20 21 const usage = `Usage : 22 realtime [-n name] url 23 24 Option : 25 -n name : Use realtime network name. 26 27 Copyright 2015 unirita Inc. 28 ` 29 30 func main() { 31 os.Exit(realMain()) 32 } 33 34 func realMain() int { 35 args := fetchArgs() 36 if args == nil { 37 showUsage() 38 return 1 39 } 40 41 configPath := filepath.Join(util.GetRootPath(), "bin", "master.ini") 42 if err := config.Load(configPath); err != nil { 43 msg := fmt.Sprintf("master.ini not found or cannot read it.") 44 fmt.Println(network.RealtimeErrorResult(msg)) 45 return 1 46 } 47 networkDir := config.Dir.JobnetDir 48 49 if err := network.LoadJobex(args.realtimeName, networkDir); err != nil { 50 msg := fmt.Sprintf("Jobex csv load error: %s", err) 51 fmt.Println(network.RealtimeErrorResult(msg)) 52 return 1 53 } 54 55 res, err := http.Get(args.jsonURL) 56 if err != nil { 57 msg := fmt.Sprintf("HTTP request error: %s", err) 58 fmt.Println(network.RealtimeErrorResult(msg)) 59 return 1 60 } 61 defer res.Body.Close() 62 if res.StatusCode != http.StatusOK { 63 msg := fmt.Sprintf("HTTP response error. Status code[%d]", res.StatusCode) 64 fmt.Println(network.RealtimeErrorResult(msg)) 65 return 1 66 } 67 68 nwk, err := network.Parse(res.Body) 69 if err != nil { 70 msg := fmt.Sprintf("Parse error: %s", err) 71 fmt.Println(network.RealtimeErrorResult(msg)) 72 return 1 73 } 74 75 cmd := network.NewCommand(args.realtimeName) 76 if err := nwk.Export(cmd.GetNetworkName(), networkDir); err != nil { 77 msg := fmt.Sprintf("Network temporary file create error: %s", err) 78 fmt.Println(network.RealtimeErrorResult(msg)) 79 return 1 80 } 81 defer nwk.Clean(cmd.GetNetworkName(), networkDir) 82 83 id, err := cmd.Run() 84 if err != nil { 85 fmt.Println(network.MasterErrorResult(err.Error(), cmd.GetPID())) 86 return 1 87 } 88 89 result := network.SuccessResult(cmd.GetPID(), id, cmd.GetNetworkName()) 90 fmt.Println(result) 91 cmd.Release() 92 93 return 0 94 } 95 96 func fetchArgs() *arguments { 97 args := new(arguments) 98 flag.Usage = showUsage 99 flag.StringVar(&args.realtimeName, "n", "", "realtime network name.") 100 flag.Parse() 101 if flag.NArg() != 1 { 102 return nil 103 } 104 args.jsonURL = flag.Arg(0) 105 return args 106 } 107 108 func showUsage() { 109 fmt.Fprintln(os.Stderr, usage) 110 }