-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
102 lines (85 loc) · 2.29 KB
/
main.go
File metadata and controls
102 lines (85 loc) · 2.29 KB
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
package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/signal"
"path/filepath"
"syscall"
)
var version = "dev"
func main() {
log.SetFlags(log.Ltime)
if len(os.Args) < 2 {
printUsage()
os.Exit(1)
}
switch os.Args[1] {
case "serve":
runServeCmd(os.Args[2:])
case "test":
runTestCmd(os.Args[2:])
case "version":
fmt.Printf("pollhook %s\n", version)
default:
fmt.Fprintf(os.Stderr, "unknown command: %s\n\n", os.Args[1])
printUsage()
os.Exit(1)
}
}
func printUsage() {
fmt.Fprintln(os.Stderr, "Usage: pollhook <command> [flags]")
fmt.Fprintln(os.Stderr, "")
fmt.Fprintln(os.Stderr, "Commands:")
fmt.Fprintln(os.Stderr, " serve Run pollers and deliver webhooks")
fmt.Fprintln(os.Stderr, " test Validate config, run commands, show extracted items (dry run)")
fmt.Fprintln(os.Stderr, " version Print version")
}
func runServeCmd(args []string) {
fs := flag.NewFlagSet("serve", flag.ExitOnError)
configPath := fs.String("config", "pollhook.yaml", "Path to config file")
stateDir := fs.String("state-dir", defaultStateDir(), "Directory for state persistence")
fs.Parse(args)
cfg, err := LoadConfig(*configPath)
if err != nil {
log.Fatalf("config error: %v", err)
}
state := NewState(*stateDir)
if err := state.Load(); err != nil {
log.Fatalf("state load error: %v", err)
}
log.Printf("pollhook %s starting with %d source(s)", version, len(cfg.Sources))
ctx, cancel := context.WithCancel(context.Background())
// Handle SIGINT/SIGTERM for graceful shutdown
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sigCh
log.Printf("received %s, shutting down...", sig)
cancel()
}()
runServe(ctx, cfg, state)
log.Println("pollhook stopped")
}
func runTestCmd(args []string) {
fs := flag.NewFlagSet("test", flag.ExitOnError)
configPath := fs.String("config", "pollhook.yaml", "Path to config file")
fs.Parse(args)
cfg, err := LoadConfig(*configPath)
if err != nil {
log.Fatalf("config error: %v", err)
}
fmt.Printf("Config loaded: %d source(s)\n\n", len(cfg.Sources))
if err := runTest(cfg); err != nil {
log.Fatalf("test error: %v", err)
}
}
func defaultStateDir() string {
home, err := os.UserHomeDir()
if err != nil {
return ".pollhook"
}
return filepath.Join(home, ".pollhook")
}