-
Notifications
You must be signed in to change notification settings - Fork 7
/
config.go
131 lines (119 loc) · 3.18 KB
/
config.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
package main
import (
"bytes"
"flag"
"fmt"
goahocorasick "github.com/anknown/ahocorasick"
"github.com/sevlyar/go-daemon"
"log"
"net/http"
"os"
"strings"
"syscall"
"time"
)
const resFile = "/tmp/mipns/mibrain/mibrain_txt_RESULT_NLP.log"
const answerFile = "/tmp/mipns/mibrain/mibrain_nlp_answer.log"
var controlMethod = map[string]bool{"ch": true, "prev": true, "next": true, "play": true, "pause": true, "toggle": true, "resume": true}
var (
signal = flag.String("s", "", `向守护程序发送信号:
stop — 终止进程`)
)
var logFile = flag.String("log", "/dev/null", "启用log默认不输出")
var rpcPort = flag.Int("port", 18888, "jsonrpc端口")
var serverUrl = flag.String("url", "", "服务器URL")
var refreshTime = flag.Int("interval", 60, "刷新间隔时间,0为禁用")
var keys = flag.String("key", "", "拦截关键词用|分割")
var token = flag.String("token", "", "rpc认证token")
var ac = new(goahocorasick.Machine)
var netClient = &http.Client{
Timeout: time.Second * 10,
}
var keyWords [][]rune
var (
stop = make(chan struct{})
done = make(chan struct{})
)
func termHandler(sig os.Signal) error {
log.Println("正在终止...")
stop <- struct{}{}
if sig == syscall.SIGQUIT {
<-done
}
return daemon.ErrStop
}
func main() {
flag.Parse()
daemon.AddCommand(daemon.StringFlag(signal, "quit"), syscall.SIGQUIT, termHandler)
daemon.AddCommand(daemon.StringFlag(signal, "stop"), syscall.SIGTERM, termHandler)
worderArgs := append([]string{"[小爱语音响应拦截器]"}, os.Args[1:]...)
context := &daemon.Context{
PidFileName: "/tmp/xiaoai_hook.pid",
PidFilePerm: 0644,
LogFileName: *logFile,
LogFilePerm: 0640,
WorkDir: "/tmp/",
Umask: 027,
Args: worderArgs,
}
if len(daemon.ActiveFlags()) > 0 {
d, err := context.Search()
if err != nil {
log.Fatalf("无法发送信号到守护程序: %s", err.Error())
}
if err = daemon.SendCommands(d); err != nil {
log.Fatalf("守护程序发送命令失败: %s", err.Error())
}
return
}
d, err := context.Reborn()
if err != nil {
log.Fatalln(err)
}
if d != nil {
return
}
defer context.Release()
log.Println("守护程序启动")
go worker()
err = daemon.ServeSignals()
if err != nil {
log.Printf("Error: %s", err.Error())
}
log.Println("守护进程已终止")
}
func worker() {
flag.Parse()
eventUrl := fmt.Sprintf("%s/xiaoai_hook/event", *serverUrl)
keyWordUrl := fmt.Sprintf("%s/xiaoai_hook/keyword", *serverUrl)
if *serverUrl == "" {
log.Printf("缺少关键参数")
os.Exit(-1)
} else {
log.Printf("上游服务器: %s", *serverUrl)
}
log.Printf("正在启动...")
key := *keys
if key != "" {
log.Printf("拦截词列表: %s", key)
for _, key := range strings.Split(key, "|") {
keyWords = append(keyWords, bytes.Runes([]byte(key)))
}
if err := ac.Build(keyWords); err != nil {
log.Fatal(err)
}
}
if *refreshTime != 0 {
log.Printf("启动拦截词刷新器,频率: %d秒", *refreshTime)
go refresh(keyWordUrl)
}
log.Printf("启动jsonrpc服务器,监听端口: %d", *rpcPort)
if *token != "" {
log.Printf("检测到token开启服务器认证")
}
go jsonRpcServer()
log.Printf("启动日志监控器")
for {
monitoring(eventUrl)
}
}