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  }