main.go 2.39 KB
Newer Older
1
2
3
package main

import (
liming6's avatar
liming6 committed
4
	"fmt"
5
	"log"
liming6's avatar
liming6 committed
6
	"os"
7
	"sshd-tool/cmd/file-monitor/logic"
liming6's avatar
liming6 committed
8
9
10
	"time"

	"github.com/gofrs/flock"
11
	"github.com/spf13/pflag"
12
13
)

14
15
16
17
18
19
// import (
// 	"fmt"
// 	"log"
// 	"os"
// 	"sshd-tool/cmd/file-monitor/logic"
// 	"time"
20

21
22
23
24
// 	"github.com/elastic/go-libaudit/v2"
// 	"github.com/elastic/go-libaudit/v2/aucoalesce"
// 	"github.com/elastic/go-libaudit/v2/auparse"
// )
25

26
// type EventHandler struct{}
27

28
29
30
31
32
33
34
35
36
37
38
// func (h *EventHandler) ReassemblyComplete(msgs []*auparse.AuditMessage) {
// 	event, err := aucoalesce.CoalesceMessages(msgs)
// 	if err != nil {
// 		fmt.Printf("coalesce messages error: %v", err)
// 	}
// 	logic.EventChan <- event
// }

// func (h *EventHandler) EventsLost(count int) {
// 	fmt.Fprintf(os.Stderr, "=== event lost: %d \n", count)
// }
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
// func main() {
// 	cli, err := libaudit.NewMulticastAuditClient(nil)
// 	if err != nil {
// 		log.Fatalf("failed to create audit client: %v", err)
// 	}
// 	defer cli.Close()

// 	handler := &EventHandler{}
// 	rea, err := libaudit.NewReassembler(1024, time.Second*60, handler)
// 	if err != nil {
// 		log.Printf("%v", err)
// 		return
// 	}
// 	defer rea.Close()

// 	go func() {
// 		ticker := time.NewTicker(time.Second * 15)
// 		defer ticker.Stop()
// 		for range ticker.C {
// 			if rea.Maintain() != nil {
// 				break
// 			}
// 		}
// 	}()

// 	go logic.FiltMsg()

// 	for {
// 		rawMsg, err := cli.Receive(false)
// 		if err != nil {
// 			break
// 		}
// 		_ = rea.Push(rawMsg.Type, rawMsg.Data)
// 	}

// 	close(logic.EventChan)
// }

liming6's avatar
liming6 committed
78
var (
79
80
81
	logfile   *os.File
	flagDebug = pflag.Bool("debug", false, "debug mode, print log to stdout, not file")
	flagHelp  = pflag.BoolP("help", "h", false, "show usage")
liming6's avatar
liming6 committed
82
83
)

84
85
func main() {
	pflag.Parse()
liming6's avatar
liming6 committed
86

87
88
89
90
	if *flagHelp {
		fmt.Println("Monitor sftp and scp file uploads. After a file is uploaded, use clamdscan to scan the file. If the file contains a virus, delete it")
		pflag.Usage()
		return
liming6's avatar
liming6 committed
91
92
93
94
95
96
97
98
99
	}

	fileLock := flock.New("/tmp/file-monitor.lock")
	locked, err := fileLock.TryLock()
	if err != nil || !locked {
		log.Fatal("there is already a file-monitor instance running, stopping")
	}
	defer fileLock.Unlock()
	err = logic.CheckExec()
100
	if err != nil {
101
		log.Fatal(err)
102
	}
103
104
105
106
107
108
109
110
111
112

	if !*flagDebug {
		logFile, err := os.Create(fmt.Sprintf("/var/log/file-monitor.%s.log", time.Now().Format("2006-01-02_15-04-05")))
		if err == nil {
			logfile = logFile
			log.SetOutput(logFile)
			defer logFile.Close()
		}
	}

113
	logic.StartSftpMonitor()
114
}