forked from pdunnavant/modem-scraper
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmodem-scraper.go
146 lines (125 loc) · 3.42 KB
/
modem-scraper.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
145
146
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"github.com/pdunnavant/modem-scraper/boltdb"
"github.com/pdunnavant/modem-scraper/config"
"github.com/pdunnavant/modem-scraper/influxdb"
"github.com/pdunnavant/modem-scraper/mqtt"
"github.com/pdunnavant/modem-scraper/scrape"
"github.com/robfig/cron"
"github.com/spf13/viper"
"go.uber.org/zap"
)
// BuildVersion is the version of the binary, and is set with ldflags at build time.
var BuildVersion = "UNKNOWN"
// CliInputs holds the data passed in via CLI parameters
type CliInputs struct {
BuildVersion string
Config string
ShowVersion bool
}
func main() {
logger, err := zap.NewProduction()
if err != nil {
fmt.Println("{\"op\": \"main\", \"level\": \"fatal\", \"msg\": \"failed to initiate logger\"}")
panic(err)
}
defer logger.Sync()
cliInputs := CliInputs{
BuildVersion: BuildVersion,
}
flags := flag.NewFlagSet("modem-scraper", 0)
flags.StringVar(&cliInputs.Config, "config", "config.yaml", "Set the location for the YAML config file")
flags.BoolVar(&cliInputs.ShowVersion, "version", false, "Print the version of modem-script")
flags.Parse(os.Args[1:])
if cliInputs.ShowVersion {
fmt.Println(cliInputs.BuildVersion)
os.Exit(0)
}
configuration, err := parseConfiguration(cliInputs.Config)
if err != nil {
logger.Fatal("failed to parse configuration",
zap.String("op", "main"),
zap.Error(err),
)
panic(err)
}
c := cron.New()
c.AddFunc(configuration.Polling.Schedule, func() {
logger.Debug("waking up",
zap.String("op", "main"),
)
modemInformation, err := scrape.Scrape(logger, *configuration)
if err != nil {
logger.Error("failed to scrape modem information",
zap.String("op", "main"),
zap.Error(err),
)
return
}
modemInformation, err = boltdb.PruneEventLogs(configuration.BoltDB, *modemInformation)
if err != nil {
logger.Error("failed to prune event logs from BoltDB",
zap.String("op", "main"),
zap.Error(err),
)
return
}
if configuration.InfluxDB.Enabled {
err = influxdb.Publish(logger, configuration.InfluxDB, *modemInformation)
if err != nil {
logger.Error("failed to write data to InfluxDB",
zap.String("op", "main"),
zap.Error(err),
)
return
}
}
if configuration.MQTT.Enabled {
err = mqtt.Publish(logger, configuration.MQTT, *modemInformation)
if err != nil {
logger.Error("failed to write data to MQTT",
zap.String("op", "main"),
zap.Error(err),
)
return
}
}
err = boltdb.UpdateEventLogs(logger, configuration.BoltDB, *modemInformation)
if err != nil {
logger.Error("failed to update event logs in BoltDB",
zap.String("op", "main"),
zap.Error(err),
)
return
}
logger.Debug("going back to sleep",
zap.String("op", "main"),
)
})
go c.Start()
// Wait forever, but just for an OS interrupt/kill.
logger.Debug("started",
zap.String("op", "main"),
)
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt, os.Kill)
<-sig
}
func parseConfiguration(configPath string) (*config.Configuration, error) {
viper.SetConfigFile(configPath)
viper.AutomaticEnv()
viper.SetConfigType("yml")
if err := viper.ReadInConfig(); err != nil {
return nil, fmt.Errorf("Error reading config file, %s", err)
}
var configuration config.Configuration
err := viper.Unmarshal(&configuration)
if err != nil {
return nil, fmt.Errorf("unable to decode into struct, %s", err)
}
return &configuration, nil
}