-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
144 lines (124 loc) · 3.72 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"strconv"
"time"
"github.com/BurntSushi/toml"
"github.com/robfig/cron"
"google.golang.org/appengine/v2"
appenginelog "google.golang.org/appengine/v2/log"
)
const configFileName = "watchDustConfig.toml"
var fineDustMsg = ""
var conf serverConfig
func loadConfig() {
// 파일로 부터 파싱해서 conf 로 저장하기
_, err := toml.DecodeFile(configFileName, &conf)
if err != nil {
log.Println(err)
os.Exit(1)
}
log.Printf("%v was loaded\n%v\n", configFileName, conf)
}
func main() {
loadConfig()
// 20190406 google compute engine 무료 기간 만료
// App Engine에서 애플리케이션이 배포되어 있는 로컬 파일 시스템은 쓸 수 없습니다.
// google.golang.org/appengine/v2/log 으로 로깅 가능하다.
// f, err := os.OpenFile("wd.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
// if err != nil {
// log.Fatal("can't open log file")
// }
// defer f.Close()
// log.SetOutput(f)
// log.Println("start Watch-Dust")
serverType := flag.String("servertype", "gae", "test|noraml|gae(google app engin)")
flag.Parse()
log.Println("servertype :", *serverType)
if *serverType == "test" {
// 연결 확인만 하고 종료
airReuslt := openapiAirKorea()
analDustInfo(airReuslt)
} else if *serverType == "normal" {
// 일반 서버 환경으로 운영시
watchingDust()
} else if *serverType == "gae" {
// GAE(google app engine) 환경으로 운영시
http.HandleFunc("/", handlerIndex)
http.HandleFunc("/watchDust", handlerWatchingDust)
appengine.Main()
}
}
func SetCommonResponseHeader(w http.ResponseWriter) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "get")
}
func handlerIndex(w http.ResponseWriter, r *http.Request) {
ctx := appengine.NewContext(r)
appenginelog.Infof(ctx, "/ 요청 처리")
out := `
디폴트 미세먼지 정보
https://watchdust.appspot.com/watchDust
dustinfo 슬랙 채널에 미세먼지 정보 발송
https://watchdust.appspot.com/watchDust?slack=dustinfo
github
https://github.com/ysoftman/watchDust
`
SetCommonResponseHeader(w)
fmt.Fprintln(w, out)
}
func handlerWatchingDust(w http.ResponseWriter, r *http.Request) {
ctx := appengine.NewContext(r)
appenginelog.Infof(ctx, "/watchDust 요청 처리")
query := r.URL.Query()
log.Println("---------- openapiAirKoreaGAE")
airResult := openapiAirKoreaGAE(r)
dustinfomsg := analDustInfo(airResult)
out := dustinfomsg
log.Println("----------", query.Get("slack"))
if len(query.Get("slack")) > 0 {
sendToSlackGAE(r, query.Get("slack"), dustinfomsg)
out += "slack channel = " + query.Get("slack")
}
SetCommonResponseHeader(w)
fmt.Fprintln(w, out)
}
func watchingDust() {
// var wg sync.WaitGroup
// wg.Add(1)
// go func() {
// defer wg.Done()
// for {
// select {
// case <-time.After(time.Duration(conf.WatchIntervalHour) * time.Hour):
// // fineDustMsg = fineDustSearch())
// analDustInfo(openapiAirKorea())
// }
// }
// }()
// wg.Wait()
// analDustInfo(openapiAirKorea())
c := cron.New()
// c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
// every second
// c.AddFunc("* * * * * *", func() { analDustInfo(openapiAirKorea()) })
// every minute
// c.AddFunc("0 */1 * * * *", func() { analDustInfo(openapiAirKorea()) })
// c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
// 9-21/3 : 9~21시 사이 3시간 간격으로 => 9 12 15 18 21시
c.AddFunc("0 0 9-21/"+strconv.Itoa(conf.WatchIntervalHour)+" * * *", func() {
airReuslt := openapiAirKorea()
dustinfomsg := analDustInfo(airReuslt)
sendToSlack(conf.SlackAPI.Channel, dustinfomsg)
})
c.Start()
for {
select {
case <-time.After(10 * time.Second):
}
}
}