func main() { versionPrinted := flag.Bool("v", false, "gaurun version") confPath := flag.String("c", "", "configuration file path for gaurun") logPath := flag.String("l", "", "log file path for gaurun") flag.Parse() if *versionPrinted { gaurun.PrintVersion() os.Exit(0) } // set default parameters gaurun.ConfGaurun = gaurun.BuildDefaultConf() // load configuration conf, err := gaurun.LoadConf(gaurun.ConfGaurun, *confPath) if err != nil { log.Fatal(err) } gaurun.ConfGaurun = conf f, err := os.Open(*logPath) if err != nil { panic(err) } defer f.Close() scanner := bufio.NewScanner(f) accepts := make(map[uint64]gaurun.LogPushEntry) successes := make(map[uint64]gaurun.LogPushEntry) for scanner.Scan() { var logPush gaurun.LogPushEntry line := scanner.Text() idx := strings.Index(line, " ") JSONStr := line[idx+1:] err := json.Unmarshal([]byte(JSONStr), &logPush) if err != nil { log.Printf("JSON parse error(%s)", JSONStr) continue } if logPush.Type == "accepted-request" { continue } switch logPush.Type { case "accepted-push": accepts[logPush.ID] = logPush case "succeeded-push": successes[logPush.ID] = logPush } } losts := make(map[uint64]gaurun.LogPushEntry) for id, logPush := range accepts { if _, ok := successes[id]; !ok { losts[id] = logPush } } APNSClient, err = gaurun.NewApnsClientHttp2( gaurun.ConfGaurun.Ios.PemCertPath, gaurun.ConfGaurun.Ios.PemKeyPath, ) if err != nil { log.Fatal(err) } APNSClient.Timeout = time.Duration(gaurun.ConfGaurun.Ios.Timeout) * time.Second TransportGCM := &http.Transport{ MaxIdleConnsPerHost: gaurun.ConfGaurun.Android.KeepAliveConns, Dial: (&net.Dialer{ Timeout: time.Duration(gaurun.ConfGaurun.Android.Timeout) * time.Second, KeepAlive: time.Duration(gaurun.ConfGaurun.Android.KeepAliveTimeout) * time.Second, }).Dial, } GCMClient = &gcm.Sender{ ApiKey: gaurun.ConfGaurun.Android.ApiKey, Http: &http.Client{ Transport: TransportGCM, Timeout: time.Duration(gaurun.ConfGaurun.Android.Timeout) * time.Second, }, } wg := new(sync.WaitGroup) for _, logPush := range losts { tokens := make([]string, 1) var platform int tokens[0] = logPush.Token switch logPush.Platform { case "ios": platform = 1 case "android": platform = 2 } req := gaurun.RequestGaurunNotification{ Tokens: tokens, Platform: platform, Message: logPush.Message, CollapseKey: logPush.CollapseKey, DelayWhileIdle: logPush.DelayWhileIdle, TimeToLive: logPush.TimeToLive, Badge: logPush.Badge, Sound: logPush.Sound, ContentAvailable: logPush.ContentAvailable, Expiry: logPush.Expiry, } wg.Add(1) go pushNotification(wg, req, logPush) } wg.Wait() }
func main() { versionPrinted := flag.Bool("v", false, "gaurun version") confPath := flag.String("c", "", "configuration file path for gaurun") listenPort := flag.String("p", "", "port number or unix socket path") workerNum := flag.Int("w", 0, "number of workers for push notification") queueNum := flag.Int("q", 0, "size of internal queue for push notification") flag.Parse() if *versionPrinted { gaurun.PrintVersion() return } // set default parameters gaurun.ConfGaurun = gaurun.BuildDefaultConf() // init logger gaurun.LogAccess = logrus.New() gaurun.LogError = logrus.New() gaurun.LogAccess.Formatter = new(gaurun.GaurunFormatter) gaurun.LogError.Formatter = new(gaurun.GaurunFormatter) // load configuration conf, err := gaurun.LoadConf(gaurun.ConfGaurun, *confPath) if err != nil { gaurun.LogError.Fatal(err) } gaurun.ConfGaurun = conf // overwrite if port is specified by flags if *listenPort != "" { gaurun.ConfGaurun.Core.Port = *listenPort } // overwrite if workerNum is specified by flags if *workerNum > 0 { gaurun.ConfGaurun.Core.WorkerNum = *workerNum } // overwrite if queueNum is specified by flags if *queueNum > 0 { gaurun.ConfGaurun.Core.QueueNum = *queueNum } // set logger err = gaurun.SetLogLevel(gaurun.LogAccess, "info") if err != nil { log.Fatal(err) } err = gaurun.SetLogLevel(gaurun.LogError, gaurun.ConfGaurun.Log.Level) if err != nil { log.Fatal(err) } err = gaurun.SetLogOut(gaurun.LogAccess, gaurun.ConfGaurun.Log.AccessLog) if err != nil { log.Fatal(err) } err = gaurun.SetLogOut(gaurun.LogError, gaurun.ConfGaurun.Log.ErrorLog) if err != nil { log.Fatal(err) } if !gaurun.ConfGaurun.Ios.Enabled && !gaurun.ConfGaurun.Android.Enabled { gaurun.LogError.Fatal("What do you want to do?") } if gaurun.ConfGaurun.Ios.Enabled { gaurun.CertificatePemIos.Cert, err = ioutil.ReadFile(gaurun.ConfGaurun.Ios.PemCertPath) if err != nil { gaurun.LogError.Fatal("A certification file for iOS is not found.") } gaurun.CertificatePemIos.Key, err = ioutil.ReadFile(gaurun.ConfGaurun.Ios.PemKeyPath) if err != nil { gaurun.LogError.Fatal("A key file for iOS is not found.") } } if gaurun.ConfGaurun.Android.Enabled { if gaurun.ConfGaurun.Android.ApiKey == "" { gaurun.LogError.Fatal("APIKey for Android is empty.") } } if err := gaurun.InitHttpClient(); err != nil { gaurun.LogError.Fatal("failed to init http client") } gaurun.InitStat() gaurun.StartPushWorkers(gaurun.ConfGaurun.Core.WorkerNum, gaurun.ConfGaurun.Core.QueueNum) gaurun.RegisterHTTPHandlers() gaurun.RunHTTPServer() }