-
Notifications
You must be signed in to change notification settings - Fork 0
/
newsyslog.go
121 lines (111 loc) · 2.88 KB
/
newsyslog.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
package main
import (
"context"
"errors"
"flag"
"fmt"
"os"
"path/filepath"
"sync"
"github.com/spamoc/gonewsyslog/internal/conf"
"github.com/spamoc/gonewsyslog/internal/gonewsyslog"
"github.com/spamoc/gonewsyslog/internal/log"
"github.com/spamoc/gonewsyslog/internal/rotate"
)
type Param struct {
t bool
v bool
c string
}
func readArgs() (Param, error) {
// ignore over arguments
t := flag.Bool("t", false, "test mode(do not execute)")
v := flag.Bool("v", false, "output verbose")
flag.Parse()
if len(flag.Args()) == 0 {
return Param{}, errors.New("usage: this [ -t(test mode) -v(log verbose) ] configPath")
}
c := flag.Args()[0]
if c == "" {
return Param{}, errors.New("usage: this [ -t(test mode) -v(log verbose) ] configPath")
}
params := Param{t: *t, v: *v, c: c}
return params, nil
}
func parse(c conf.Config, ctx context.Context) ([]rotate.RotateJob, error) {
logger := log.Get(ctx)
if c.Common.Include != "" {
paths, err := filepath.Glob(c.Common.Include)
if err != nil {
logger.Error("include file read error. through.", log.Error(err))
} else {
c.Projects = append(c.Projects, walk(paths, ctx)...)
}
}
return createJobs(c.Projects, ctx)
}
func walk(paths []string, ctx context.Context) []conf.ProjectConfig {
logger := log.Get(ctx)
var projects []conf.ProjectConfig = make([]conf.ProjectConfig, 0)
for _, path := range paths {
in, err := conf.New(path)
if err != nil {
logger.Error("include file read error. through.", log.Error(err))
} else if len(in.Projects) > 0 {
projects = append(projects, in.Projects...)
}
}
return projects
}
func createJobs(projects []conf.ProjectConfig, ctx context.Context) ([]rotate.RotateJob, error) {
jobs := make([]rotate.RotateJob, 0)
for _, p := range projects {
job, err := gonewsyslog.New(p.Name, p.From, p.To, string(p.Compress.Type), p.Compress.Ext, p.Success, p.Failed, p.Pid, p.Rotate.Term, p.Rotate.Size, p.Rotate.Count)
if err != nil {
return make([]rotate.RotateJob, 0), err
}
jobs = append(jobs, job)
}
return jobs, nil
}
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
}()
params, err := readArgs()
if err != nil {
panic(err)
}
logger := log.Create(params.v)
ctx := context.Background()
ctx = log.Set(ctx, logger)
c, err := conf.New(params.c)
if err != nil {
logger.Fatal("config parse error.", log.Error(err))
os.Exit(1)
}
jobs, err := parse(c, ctx)
if err != nil {
logger.Fatal("job create error.", log.Error(err))
os.Exit(1)
}
wg := &sync.WaitGroup{}
for _, j := range jobs {
wg.Add(1)
go func(params Param, j rotate.RotateJob) {
logger.Debug("running job info > ", log.Any("job", j))
if params.t {
result := j.Test(ctx)
logger.Info("test result: ", log.Any("result", result))
} else {
result := j.Run(ctx)
logger.Info("result: ", log.Any("result", result))
}
wg.Done()
}(params, j)
}
wg.Wait()
}