agent
This commit is contained in:
parent
88b971fdc6
commit
6e858f180d
50
agent.go
50
agent.go
|
@ -9,8 +9,9 @@ import (
|
||||||
dat "loafle.com/overflow/data_sender_go"
|
dat "loafle.com/overflow/data_sender_go"
|
||||||
evt "loafle.com/overflow/event_sender_go"
|
evt "loafle.com/overflow/event_sender_go"
|
||||||
pol "loafle.com/overflow/long_poller_go"
|
pol "loafle.com/overflow/long_poller_go"
|
||||||
"log"
|
log "github.com/cihub/seelog"
|
||||||
"sync"
|
"sync"
|
||||||
|
"loafle.com/overflow/agent/bootstrap"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -21,7 +22,6 @@ const (
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetPrefix("Agent : ")
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go StartAgent()
|
go StartAgent()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
@ -33,15 +33,21 @@ type Agent struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartAgent() {
|
func StartAgent() {
|
||||||
|
stopch := make(chan bool, 1)
|
||||||
|
bootstrap.HandleShell(stopch)
|
||||||
|
bootstrap.HandleSignal(stopch)
|
||||||
|
|
||||||
agt := Agent{}
|
agt := Agent{}
|
||||||
agt.startAgent()
|
agt.startAgent()
|
||||||
|
|
||||||
|
agt.handleAgentStop(stopch)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (agt *Agent) startAgent() {
|
func (agt *Agent) startAgent() {
|
||||||
//1. cfg start()
|
//1. cfg start()
|
||||||
cfgStarted := make(chan *config_manager.GlobalConfig, 1)
|
cfgStarted := make(chan *config_manager.GlobalConfig, 1)
|
||||||
if err := cfg.Start(cfgStarted, PATH); err != nil {
|
if err := cfg.Start(cfgStarted, PATH); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
globalConf := <-cfgStarted
|
globalConf := <-cfgStarted
|
||||||
|
@ -49,7 +55,7 @@ func (agt *Agent) startAgent() {
|
||||||
//2. evt start()
|
//2. evt start()
|
||||||
evtStarted := make(chan bool, 1)
|
evtStarted := make(chan bool, 1)
|
||||||
if err := evt.Start(evtStarted); err != nil {
|
if err := evt.Start(evtStarted); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
<-evtStarted
|
<-evtStarted
|
||||||
|
@ -62,7 +68,7 @@ func (agt *Agent) startAgent() {
|
||||||
//4. pol start()
|
//4. pol start()
|
||||||
polStarted := make(chan bool, 1)
|
polStarted := make(chan bool, 1)
|
||||||
if err := pol.Start(polStarted, globalConf); err != nil {
|
if err := pol.Start(polStarted, globalConf); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
<-polStarted
|
<-polStarted
|
||||||
|
@ -75,7 +81,7 @@ func (agt *Agent) startAgent() {
|
||||||
//5. scm start()
|
//5. scm start()
|
||||||
scmStarted := make(chan config_manager.ConfigManager, 1)
|
scmStarted := make(chan config_manager.ConfigManager, 1)
|
||||||
if err := cfg.StartSensorConfig(scmStarted, "temp"); err != nil {
|
if err := cfg.StartSensorConfig(scmStarted, "temp"); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
agt.cm = <-scmStarted
|
agt.cm = <-scmStarted
|
||||||
|
@ -99,6 +105,18 @@ func (agt *Agent) startAgent() {
|
||||||
go agt.waitAgentTask()
|
go agt.waitAgentTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (agt *Agent) handleAgentStop(ch chan bool) {
|
||||||
|
go func() {
|
||||||
|
if <-ch {
|
||||||
|
agt.stopAgent()
|
||||||
|
log.Info("Agent has stopped.")
|
||||||
|
log.Flush()
|
||||||
|
close(ch)
|
||||||
|
wg.Done()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
func (agt *Agent) waitAgentTask() {
|
func (agt *Agent) waitAgentTask() {
|
||||||
for {
|
for {
|
||||||
d := <-agt.taskCh
|
d := <-agt.taskCh
|
||||||
|
@ -175,18 +193,24 @@ func (agt *Agent) stopAgent() {
|
||||||
evt.AddEventData(msg.Event{msg.EVT_TYPE_NONE, msg.AGT_STOP, nil})
|
evt.AddEventData(msg.Event{msg.EVT_TYPE_NONE, msg.AGT_STOP, nil})
|
||||||
evt.Stop()
|
evt.Stop()
|
||||||
|
|
||||||
wg.Done()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (agt *Agent) processStartSensor(task msg.AgentTask) {
|
func (agt *Agent) processStartSensor(task msg.AgentTask) {
|
||||||
id := task.Params["sensorId"]
|
id := task.Params["sensorId"]
|
||||||
col.StartSensor(id)
|
if err := col.StartSensor(id); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (agt *Agent) processStopSensor(task msg.AgentTask) {
|
func (agt *Agent) processStopSensor(task msg.AgentTask) {
|
||||||
id := task.Params["sensorId"]
|
id := task.Params["sensorId"]
|
||||||
col.StopSensor(id)
|
if err := col.StopSensor(id); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +230,7 @@ func (agt *Agent) processRemoveSensor(task msg.AgentTask) {
|
||||||
id := task.Params["sensorId"]
|
id := task.Params["sensorId"]
|
||||||
err := col.RemSensor(id)
|
err := col.RemSensor(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
crm.RemoveSensor(id)
|
crm.RemoveSensor(id)
|
||||||
|
@ -218,13 +242,13 @@ func (agt *Agent) processUpdateSensor(task msg.AgentTask) {
|
||||||
path := task.Params["path"]
|
path := task.Params["path"]
|
||||||
id := task.Params["id"]
|
id := task.Params["id"]
|
||||||
if err := col.StopSensor(id); err != nil {
|
if err := col.StopSensor(id); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cfg.UpdateSensor(path)
|
cfg.UpdateSensor(path)
|
||||||
crm.UpdateSensor(id)
|
crm.UpdateSensor(id)
|
||||||
if err := col.UpdateSensor(id); err != nil {
|
if err := col.UpdateSensor(id); err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
||||||
|
@ -251,7 +275,7 @@ func (agt *Agent) processUpdatePolInterval(task msg.AgentTask) {
|
||||||
interval := task.Params["interval"]
|
interval := task.Params["interval"]
|
||||||
err := pol.UpdateInterval(interval)
|
err := pol.UpdateInterval(interval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
evt.AddEventData(msg.Event{msg.EVT_TYPE_TASK, task.Params["id"], nil})
|
||||||
|
|
77
bootstrap/shell.go
Normal file
77
bootstrap/shell.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
package bootstrap
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/cihub/seelog"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const FILE_SERVER string = "/var/run/of_server"
|
||||||
|
|
||||||
|
var fd net.Conn
|
||||||
|
|
||||||
|
func HandleShell(stop chan bool) {
|
||||||
|
go func() {
|
||||||
|
//os.Stdout.Close()
|
||||||
|
//os.Stderr.Close()
|
||||||
|
//os.Stdin.Close()
|
||||||
|
|
||||||
|
if fi, _ := os.Stat(FILE_SERVER); fi != nil {
|
||||||
|
os.Remove(FILE_SERVER)
|
||||||
|
}
|
||||||
|
|
||||||
|
l, err := net.ListenUnix("unix", &net.UnixAddr{Name: FILE_SERVER, Net: "unix"})
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
l.Close()
|
||||||
|
os.Remove(FILE_SERVER)
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
fd, err = l.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := make([]byte, 1024)
|
||||||
|
nr, err := fd.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data := string(buf[0:nr])
|
||||||
|
switch strings.ToUpper(data) {
|
||||||
|
case "STOP":
|
||||||
|
if fi, _ := os.Stat(FILE_SERVER); fi != nil {
|
||||||
|
os.Remove(FILE_SERVER)
|
||||||
|
}
|
||||||
|
stop <- true
|
||||||
|
case "STATUS":
|
||||||
|
fd.Write(status())
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
fd.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func StopHandleShell() {
|
||||||
|
log.Info("Shell Handler stopped.")
|
||||||
|
|
||||||
|
if fi, _ := os.Stat(FILE_SERVER); fi != nil {
|
||||||
|
os.Remove(FILE_SERVER)
|
||||||
|
}
|
||||||
|
if fd != nil {
|
||||||
|
fd.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func status() []byte {
|
||||||
|
return []byte("STATUS OK\n")
|
||||||
|
}
|
53
bootstrap/signal.go
Normal file
53
bootstrap/signal.go
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
package bootstrap
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/cihub/seelog"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HandleSignal(stop chan bool) {
|
||||||
|
sigs := make(chan os.Signal, 1)
|
||||||
|
|
||||||
|
signal.Notify(sigs,
|
||||||
|
os.Kill,
|
||||||
|
os.Interrupt,
|
||||||
|
syscall.SIGKILL,
|
||||||
|
syscall.SIGSTOP,
|
||||||
|
syscall.SIGHUP,
|
||||||
|
syscall.SIGINT,
|
||||||
|
syscall.SIGTERM,
|
||||||
|
syscall.SIGQUIT,
|
||||||
|
)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
s := <-sigs
|
||||||
|
switch s {
|
||||||
|
case os.Kill, os.Interrupt, syscall.SIGSTOP, syscall.SIGKILL, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
|
||||||
|
log.Infof("Signal received. [%s]", s)
|
||||||
|
stop <- true
|
||||||
|
default:
|
||||||
|
log.Infof("Signal received. [%s]", s)
|
||||||
|
stop <- true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
|
||||||
|
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
|
||||||
|
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
|
||||||
|
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
|
||||||
|
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
|
||||||
|
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
|
||||||
|
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
|
||||||
|
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
|
||||||
|
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
|
||||||
|
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
|
||||||
|
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
|
||||||
|
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
|
||||||
|
63) SIGRTMAX-1 64) SIGRTMAX
|
||||||
|
*/
|
71
script/ubuntu/of_agent
Normal file
71
script/ubuntu/of_agent
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: overFlow
|
||||||
|
# Required-Start: $network
|
||||||
|
# Required-Stop: $network
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: overFlow agent
|
||||||
|
# Description: overFlow Agent
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
PROG="ofcollector"
|
||||||
|
PROG_PATH="/home/insanity/develop/overflow/overflow.collector/bin/"
|
||||||
|
PID_PATH="/var/run/"
|
||||||
|
FILE_SERVER=/var/run/of_server
|
||||||
|
|
||||||
|
start() {
|
||||||
|
if [ -e "$PID_PATH/$PROG.pid" ]; then
|
||||||
|
## Program is running, exit with error.
|
||||||
|
echo "$PROG is currently running!" 1>&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
$PROG_PATH/$PROG 2>&1 > /dev/null &
|
||||||
|
echo "$PROG started"
|
||||||
|
touch "$PID_PATH/$PROG.pid"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
sudo echo -n 'STOP' | netcat -U $FILE_SERVER
|
||||||
|
|
||||||
|
if [ -e "$PID_PATH/$PROG.pid" ]; then
|
||||||
|
## Program is running, so stop it
|
||||||
|
#killall $PROG
|
||||||
|
rm "$PID_PATH/$PROG.pid"
|
||||||
|
echo "$PROG stopped"
|
||||||
|
else
|
||||||
|
## Program is not running, exit with error.
|
||||||
|
echo "Error! $PROG not started!" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
status() {
|
||||||
|
sudo echo -n $1 | netcat -U $FILE_SERVER
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$(id -u)" != "0" ]; then
|
||||||
|
echo "This script must be run as root" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
start
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
stop
|
||||||
|
;;
|
||||||
|
reload|restart|force-reload)
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status 'STATUS'
|
||||||
|
;;
|
||||||
|
**)
|
||||||
|
echo "Usage: $0 {start|stop|restart|status}" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
Loading…
Reference in New Issue
Block a user