-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdilog.go
executable file
·220 lines (206 loc) · 6.39 KB
/
dilog.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
package dilog
import (
"strconv"
"strings"
"time"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
var (
// DBNAME 은 데이터베이스 이름이다.
DBNAME = "dilog"
// COLLECTION 은 MongoDB Collection 이름이다.
COLLECTION = "log"
)
// Log 자료구조 이다.
type Log struct {
Cip string // Client IP
ID string // log ID
Keep int // 보관일수
Log string // 로그내용
Project string // 프로젝트
Slug string // 로그에 입력되는 Slug 예) 프로젝트 매니징툴에서 사용되는 에셋명 또는 샷명
Time string // 로그가 기입된 시간
Tool string // 로그가 보내진 툴
User string // 유저이름
}
// Add 함수는 log 를 추가합니다.
func Add(dbip, ip, logstr, project, slug, tool, user, addtime string, keep int) error {
session, err := mgo.Dial(dbip)
if err != nil {
return err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB(DBNAME).C(COLLECTION)
now := time.Now()
id := strconv.Itoa(int(now.UnixNano() / int64(time.Millisecond)))
doc := Log{Cip: ip,
ID: id,
Keep: keep,
Log: logstr,
Project: project,
Slug: slug,
Time: addtime,
Tool: tool,
User: user,
}
err = c.Insert(doc)
if err != nil {
return err
}
return nil
}
// All 는 DB의 모든 로그를 가지고 옵니다.
func All(dbip string) ([]Log, error) {
session, err := mgo.Dial(dbip)
if err != nil {
return nil, err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
var results []Log
c := session.DB(DBNAME).C(COLLECTION)
err = c.Find(bson.M{}).All(&results)
if err != nil {
return nil, err
}
return results, nil
}
// FindTool 함수는 툴이름을 이용해서 log를 검색합니다.
func FindTool(dbip, toolname string, page, pageMaxItemNum int) ([]Log, int, error) {
session, err := mgo.Dial(dbip)
if err != nil {
return nil, 0, err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
var results []Log
c := session.DB(DBNAME).C(COLLECTION)
query := bson.M{"tool": &bson.RegEx{Pattern: toolname, Options: "i"}}
err = c.Find(query).Sort("-time").Skip((page - 1) * pageMaxItemNum).Limit(pageMaxItemNum).All(&results)
if err != nil {
return nil, 0, err
}
itemNum, err := c.Find(query).Count()
if err != nil {
return nil, 0, err
}
return results, totalPage(itemNum, pageMaxItemNum), nil
}
// TotalPage 함수는 아이템의 갯수를 이용해서 총 페이지수를 반환한다.
func totalPage(itemNum, pageMaxItemNum int) int {
page := itemNum / pageMaxItemNum
if itemNum%pageMaxItemNum != 0 {
page++
}
return page
}
// FindToolProject 함수는 툴이름, 프로젝트 이름을 이용해서 log를 검색합니다.
func FindToolProject(dbip, toolname, project string, page, pageMaxItemNum int) ([]Log, int, error) {
session, err := mgo.Dial(dbip)
if err != nil {
return nil, 0, err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
var results []Log
c := session.DB(DBNAME).C(COLLECTION)
query := bson.M{"$and": []bson.M{
bson.M{"tool": &bson.RegEx{Pattern: toolname, Options: "i"}},
bson.M{"project": &bson.RegEx{Pattern: project, Options: "i"}},
}}
err = c.Find(query).Sort("-time").Skip(page - 1).Limit(pageMaxItemNum).All(&results)
if err != nil {
return nil, 0, err
}
itemNum, err := c.Find(query).Count()
if err != nil {
return nil, 0, err
}
return results, totalPage(itemNum, pageMaxItemNum), nil
}
// FindToolProjectSlug 함수는 툴이름, 프로젝트, Slug를 입력받아서 로그를 검색한다.
func FindToolProjectSlug(dbip, toolname, project, slug string, page, pageMaxItemNum int) ([]Log, int, error) {
session, err := mgo.Dial(dbip)
if err != nil {
return nil, 0, err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
var results []Log
c := session.DB(DBNAME).C(COLLECTION)
query := bson.M{"$and": []bson.M{
bson.M{"tool": &bson.RegEx{Pattern: toolname, Options: "i"}},
bson.M{"project": &bson.RegEx{Pattern: project, Options: "i"}},
bson.M{"slug": &bson.RegEx{Pattern: slug, Options: "i"}},
}}
err = c.Find(query).Sort("-time").Skip((page - 1) * pageMaxItemNum).Limit(pageMaxItemNum).All(&results)
if err != nil {
return nil, 0, err
}
itemNum, err := c.Find(query).Count()
if err != nil {
return nil, 0, err
}
return results, totalPage(itemNum, pageMaxItemNum), nil
}
// Search 함수는 검색어를 이용해서 log를 검색합니다.
func Search(dbip, words string, page, pageMaxItemNum int) ([]Log, int, error) {
session, err := mgo.Dial(dbip)
if err != nil {
return nil, 0, err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
var results []Log
c := session.DB(DBNAME).C(COLLECTION)
wordQueries := []bson.M{}
for _, word := range strings.Split(words, " ") {
wordQueries = append(wordQueries, bson.M{"$or": []bson.M{
bson.M{"cip": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"id": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"log": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"os": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"project": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"slug": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"time": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"time": word},
bson.M{"tool": &bson.RegEx{Pattern: word, Options: "i"}},
bson.M{"user": &bson.RegEx{Pattern: word, Options: "i"}},
}})
}
err = c.Find(bson.M{"$and": wordQueries}).Sort("-time").Skip((page - 1) * pageMaxItemNum).Limit(pageMaxItemNum).All(&results)
if err != nil {
return nil, 0, err
}
itemNum, err := c.Find(bson.M{"$and": wordQueries}).Count()
if err != nil {
return nil, 0, err
}
return results, totalPage(itemNum, pageMaxItemNum), nil
}
// Remove 함수는 log id를 이용해서 로그를 삭제합니다.
func Remove(dbip, id string) error {
session, err := mgo.Dial(dbip)
if err != nil {
return err
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
err = session.DB(DBNAME).C(COLLECTION).Remove(bson.M{"id": id})
if err != nil {
return err
}
return nil
}
// Timecheck 함수는 RFC3339 시간문자열과 보관일을 받아서 보관일이 지난지 체크한다.
func Timecheck(timestr string, keepdate int) (bool, error) {
t, err := time.Parse(time.RFC3339, timestr)
if err != nil {
return false, err
}
addtime := t.AddDate(0, 0, keepdate)
now := time.Now()
return now.After(addtime), nil //추후 이 결과를 이용해서 참이면 리무브 대상이다.
}