@@ -22,7 +22,9 @@ import (
22
22
// SshdParser Holds a struct that corresponds to a sshd log line
23
23
// and the redis connection
24
24
type SshdParser struct {
25
+ // Write
25
26
r1 * redis.Conn
27
+ // Read
26
28
r2 * redis.Conn
27
29
}
28
30
@@ -32,6 +34,66 @@ func (s *SshdParser) Set(rconn1 *redis.Conn, rconn2 *redis.Conn) {
32
34
s .r2 = rconn2
33
35
}
34
36
37
+ // Flush recomputes statistics and recompile HTML output
38
+ func (s * SshdParser ) Flush () error {
39
+ log .Println ("Flushing" )
40
+ r1 := * s .r1
41
+ r0 := * s .r2
42
+ // writing in database 1
43
+ if _ , err := r1 .Do ("SELECT" , 1 ); err != nil {
44
+ r0 .Close ()
45
+ r1 .Close ()
46
+ return err
47
+ }
48
+ // flush stats DB
49
+ if _ , err := r1 .Do ("FLUSHDB" ); err != nil {
50
+ r0 .Close ()
51
+ r1 .Close ()
52
+ return err
53
+ }
54
+ log .Println ("Statistics Database Flushed" )
55
+
56
+ // reading from database 0
57
+ if _ , err := r0 .Do ("SELECT" , 0 ); err != nil {
58
+ r0 .Close ()
59
+ r1 .Close ()
60
+ return err
61
+ }
62
+
63
+ // Compile statistics / html output for each line
64
+ keys , err := redis .Strings (r0 .Do ("KEYS" , "*" ))
65
+ if err != nil {
66
+ r0 .Close ()
67
+ r1 .Close ()
68
+ return err
69
+ }
70
+ for _ , v := range keys {
71
+ dateHost := strings .Split (v , ":" )
72
+ kkeys , err := redis .StringMap (r0 .Do ("HGETALL" , v ))
73
+ if err != nil {
74
+ r0 .Close ()
75
+ r1 .Close ()
76
+ return err
77
+ }
78
+
79
+ dateInt , err := strconv .ParseInt (dateHost [0 ], 10 , 64 )
80
+ if err != nil {
81
+ r0 .Close ()
82
+ r1 .Close ()
83
+ return err
84
+ }
85
+ parsedTime := time .Unix (dateInt , 0 )
86
+ err = compileStats (s , parsedTime , kkeys ["src" ], kkeys ["username" ], dateHost [1 ])
87
+ if err != nil {
88
+ r0 .Close ()
89
+ r1 .Close ()
90
+ return err
91
+ }
92
+ }
93
+
94
+ return nil
95
+ }
96
+
35
97
// Parse parses a line of sshd log
36
98
func (s * SshdParser ) Parse (logline string ) error {
37
99
r := * s .r1
@@ -58,12 +120,26 @@ func (s *SshdParser) Parse(logline string) error {
58
120
r .Close ()
59
121
return err
60
122
}
123
+
124
+ // Writing logs
61
125
_ , err := redis .Bool (r .Do ("HSET" , fmt .Sprintf ("%v:%v" , md ["date" ], md ["host" ]), "username" , md ["username" ], "src" , md ["src" ]))
62
126
if err != nil {
63
127
r .Close ()
64
128
return err
65
129
}
66
130
131
+ err = compileStats (s , parsedTime , md ["src" ], md ["username" ], md ["host" ])
132
+ if err != nil {
133
+ r .Close ()
134
+ return err
135
+ }
136
+
137
+ return nil
138
+ }
139
+
140
+ func compileStats (s * SshdParser , parsedTime time.Time , src string , username string , host string ) error {
141
+ r := * s .r1
142
+
67
143
// Pushing statistics in database 1
68
144
if _ , err := r .Do ("SELECT" , 1 ); err != nil {
69
145
r .Close ()
@@ -74,8 +150,7 @@ func (s *SshdParser) Parse(logline string) error {
74
150
dstr := fmt .Sprintf ("%v%v%v" , parsedTime .Year (), fmt .Sprintf ("%02d" , int (parsedTime .Month ())), fmt .Sprintf ("%02d" , int (parsedTime .Day ())))
75
151
76
152
// Check current entry date as oldest if older than the current
77
- var oldest string
78
- if oldest , err = redis .String (r .Do ("GET" , "oldest" )); err == redis .ErrNil {
153
+ if oldest , err := redis .String (r .Do ("GET" , "oldest" )); err == redis .ErrNil {
79
154
r .Do ("SET" , "oldest" , dstr )
80
155
} else if err != nil {
81
156
r .Close ()
@@ -92,8 +167,7 @@ func (s *SshdParser) Parse(logline string) error {
92
167
}
93
168
94
169
// Check current entry date as oldest if older than the current
95
- var newest string
96
- if newest , err = redis .String (r .Do ("GET" , "newest" )); err == redis .ErrNil {
170
+ if newest , err := redis .String (r .Do ("GET" , "newest" )); err == redis .ErrNil {
97
171
r .Do ("SET" , "newest" , dstr )
98
172
} else if err != nil {
99
173
r .Close ()
@@ -109,23 +183,23 @@ func (s *SshdParser) Parse(logline string) error {
109
183
}
110
184
}
111
185
112
- err = compileStats (s , dstr , "daily" , md [ " src" ], md [ " username" ], md [ " host" ] )
186
+ err := compileStat (s , dstr , "daily" , src , username , host )
113
187
if err != nil {
114
188
r .Close ()
115
189
return err
116
190
}
117
191
118
192
// Monthly
119
193
mstr := fmt .Sprintf ("%v%v" , parsedTime .Year (), fmt .Sprintf ("%02d" , int (parsedTime .Month ())))
120
- err = compileStats (s , mstr , "daily" , md [ " src" ], md [ " username" ], md [ " host" ] )
194
+ err = compileStat (s , mstr , "daily" , src , username , host )
121
195
if err != nil {
122
196
r .Close ()
123
197
return err
124
198
}
125
199
126
200
// Yearly
127
201
ystr := fmt .Sprintf ("%v" , parsedTime .Year ())
128
- err = compileStats (s , ystr , "daily" , md [ " src" ], md [ " username" ], md [ " host" ] )
202
+ err = compileStat (s , ystr , "daily" , src , username , host )
129
203
if err != nil {
130
204
r .Close ()
131
205
return err
@@ -134,7 +208,7 @@ func (s *SshdParser) Parse(logline string) error {
134
208
return nil
135
209
}
136
210
137
- func compileStats (s * SshdParser , datestr string , mode string , src string , username string , host string ) error {
211
+ func compileStat (s * SshdParser , datestr string , mode string , src string , username string , host string ) error {
138
212
r := * s .r1
139
213
_ , err := redis .String (r .Do ("ZINCRBY" , fmt .Sprintf ("%v:%v" , datestr , "statssrc" ), 1 , src ))
140
214
if err != nil {
@@ -247,13 +321,9 @@ func (s *SshdParser) Compile() error {
247
321
}
248
322
#imageholder {
249
323
background: black;
250
- color: white;
251
- padding: 1em;
252
- position: absolute;
253
- top: 50%;
254
- left: 50%;
255
- margin-right: -50%;
256
- transform: translate(-50%, -40%)
324
+ margin: auto;
325
+ width: 50%;
326
+ padding: 10px;
257
327
}
258
328
span {
259
329
float: left;
@@ -274,7 +344,7 @@ func (s *SshdParser) Compile() error {
274
344
<option value="statshost">Hosts</option>
275
345
</select>
276
346
</span>
277
- <span id="imageholder"></span >
347
+ <div id="imageholder"></div >
278
348
</body>
279
349
</html>`
280
350
0 commit comments