Skip to content

Commit 830b796

Browse files
author
Roman Sarvarov
committed
cli done
1 parent 51b3322 commit 830b796

File tree

7 files changed

+292
-21
lines changed

7 files changed

+292
-21
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/.idea
22
/.env
3-
/data/db.sqlite
3+
/data/*
4+
!/data/.keep

Makefile

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
go_build_flags=-tags=sqlite_unlock_notify
2+
13
run:
2-
go run -tags=sqlite_unlock_notify ./cmd/antibrut run
4+
go run ${go_build_flags} ./cmd/antibrut run
35

46
generate:
57
go generate ./...

cmd/antibrut/root.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import (
77
"github.com/spf13/cobra"
88
)
99

10-
var rootCmd = &cobra.Command{
11-
Use: "antibrut",
12-
Short: "Инструмент командной строки и сервер для успокоения запросов.",
13-
}
10+
var (
11+
rootCmd = &cobra.Command{
12+
Use: "antibrut",
13+
Short: "Инструмент командной строки и сервер для успокоения запросов.",
14+
}
15+
)
1416

1517
func main() {
1618
if err := rootCmd.Execute(); err != nil {

cmd/antibrut/tool.go

+251-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,261 @@
11
package main
22

33
import (
4+
"github.com/pkg/errors"
45
"github.com/spf13/cobra"
6+
"google.golang.org/grpc"
7+
"google.golang.org/grpc/credentials/insecure"
8+
9+
"github.com/romsar/antibrut/config"
10+
proto "github.com/romsar/antibrut/proto/antibrut/v1"
511
)
612

7-
var toolCmd = &cobra.Command{
8-
Use: "tool",
9-
Short: "Полезные команды для работы с приложением.",
10-
}
13+
var (
14+
toolCmd = &cobra.Command{
15+
Use: "tool",
16+
Short: "Полезные команды для работы с приложением.",
17+
}
18+
19+
resetCmd = &cobra.Command{
20+
Use: "reset",
21+
Short: "Выполнить сброс данных о попытках сделать запрос.",
22+
RunE: reset,
23+
}
24+
25+
whiteListCmd = &cobra.Command{
26+
Use: "wl",
27+
Short: "Управление белым списком.",
28+
}
29+
30+
whiteListAddIPCmd = &cobra.Command{
31+
Use: "add",
32+
Short: "Добавить подсеть в белый список.",
33+
RunE: addIPToWhiteList,
34+
}
35+
36+
whiteListDeleteIPCmd = &cobra.Command{
37+
Use: "delete",
38+
Short: "Удалить подсеть из белого списка.",
39+
RunE: deleteIPFromWhiteList,
40+
}
41+
42+
blackListCmd = &cobra.Command{
43+
Use: "bl",
44+
Short: "Управление черным списком.",
45+
}
46+
47+
blackListAddIPCmd = &cobra.Command{
48+
Use: "add",
49+
Short: "Добавить подсеть в черным список.",
50+
RunE: addIPToBlackList,
51+
}
52+
53+
blackListDeleteIPCmd = &cobra.Command{
54+
Use: "delete",
55+
Short: "Удалить подсеть из черного списка.",
56+
RunE: deleteIPFromBlackList,
57+
}
58+
)
1159

1260
func init() {
1361
rootCmd.AddCommand(toolCmd)
62+
63+
toolCmd.AddCommand(resetCmd)
64+
resetCmd.Flags().String("login", "", "Логин.")
65+
resetCmd.Flags().String("ip", "", "IP-адрес.")
66+
67+
toolCmd.AddCommand(whiteListCmd)
68+
whiteListCmd.AddCommand(whiteListAddIPCmd)
69+
whiteListCmd.AddCommand(whiteListDeleteIPCmd)
70+
71+
toolCmd.AddCommand(blackListCmd)
72+
blackListCmd.AddCommand(blackListAddIPCmd)
73+
blackListCmd.AddCommand(blackListDeleteIPCmd)
74+
}
75+
76+
func reset(cmd *cobra.Command, args []string) error {
77+
// flags
78+
login, err := cmd.Flags().GetString("login")
79+
if err != nil {
80+
return err
81+
}
82+
83+
ip, err := cmd.Flags().GetString("ip")
84+
if err != nil {
85+
return err
86+
}
87+
88+
// validation
89+
if login == "" && ip == "" {
90+
return errors.New("укажите логин или IP")
91+
}
92+
93+
// config
94+
cfg, err := config.Load()
95+
if err != nil {
96+
return err
97+
}
98+
99+
// grpc
100+
conn, err := grpc.Dial(cfg.GRPC.Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
101+
if err != nil {
102+
return errors.Wrap(err, "ошибка подключения к серверу")
103+
}
104+
defer conn.Close()
105+
106+
// client
107+
service := proto.NewAntiBrutServiceClient(conn)
108+
109+
// do request
110+
_, err = service.Reset(cmd.Context(), &proto.ResetRequest{
111+
Login: login,
112+
Ip: ip,
113+
})
114+
if err != nil {
115+
return errors.Wrap(err, "произошла ошибка в процессе работы")
116+
}
117+
118+
cmd.Println("успешно!")
119+
120+
return nil
121+
}
122+
123+
func addIPToWhiteList(cmd *cobra.Command, args []string) error {
124+
// validation
125+
if len(args) < 1 {
126+
return errors.New("укажите подсеть")
127+
}
128+
129+
// config
130+
cfg, err := config.Load()
131+
if err != nil {
132+
return err
133+
}
134+
135+
// grpc
136+
conn, err := grpc.Dial(cfg.GRPC.Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
137+
if err != nil {
138+
return errors.Wrap(err, "ошибка подключения к серверу")
139+
}
140+
defer conn.Close()
141+
142+
// client
143+
service := proto.NewAntiBrutServiceClient(conn)
144+
145+
// do request
146+
_, err = service.AddIPToWhiteList(cmd.Context(), &proto.AddIPToWhiteListRequest{
147+
Subnet: args[0],
148+
})
149+
if err != nil {
150+
return errors.Wrap(err, "произошла ошибка в процессе работы")
151+
}
152+
153+
cmd.Println("успешно!")
154+
155+
return nil
156+
}
157+
158+
func deleteIPFromWhiteList(cmd *cobra.Command, args []string) error {
159+
// validation
160+
if len(args) < 1 {
161+
return errors.New("укажите подсеть")
162+
}
163+
164+
// config
165+
cfg, err := config.Load()
166+
if err != nil {
167+
return err
168+
}
169+
170+
// grpc
171+
conn, err := grpc.Dial(cfg.GRPC.Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
172+
if err != nil {
173+
return errors.Wrap(err, "ошибка подключения к серверу")
174+
}
175+
defer conn.Close()
176+
177+
// client
178+
service := proto.NewAntiBrutServiceClient(conn)
179+
180+
// do request
181+
_, err = service.DeleteIPFromWhiteList(cmd.Context(), &proto.DeleteIPFromWhiteListRequest{
182+
Subnet: args[0],
183+
})
184+
if err != nil {
185+
return errors.Wrap(err, "произошла ошибка в процессе работы")
186+
}
187+
188+
cmd.Println("успешно!")
189+
190+
return nil
191+
}
192+
193+
func addIPToBlackList(cmd *cobra.Command, args []string) error {
194+
// validation
195+
if len(args) < 1 {
196+
return errors.New("укажите подсеть")
197+
}
198+
199+
// config
200+
cfg, err := config.Load()
201+
if err != nil {
202+
return err
203+
}
204+
205+
// grpc
206+
conn, err := grpc.Dial(cfg.GRPC.Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
207+
if err != nil {
208+
return errors.Wrap(err, "ошибка подключения к серверу")
209+
}
210+
defer conn.Close()
211+
212+
// client
213+
service := proto.NewAntiBrutServiceClient(conn)
214+
215+
// do request
216+
_, err = service.AddIPToBlackList(cmd.Context(), &proto.AddIPToBlackListRequest{
217+
Subnet: args[0],
218+
})
219+
if err != nil {
220+
return errors.Wrap(err, "произошла ошибка в процессе работы")
221+
}
222+
223+
cmd.Println("успешно!")
224+
225+
return nil
226+
}
227+
228+
func deleteIPFromBlackList(cmd *cobra.Command, args []string) error {
229+
// validation
230+
if len(args) < 1 {
231+
return errors.New("укажите подсеть")
232+
}
233+
234+
// config
235+
cfg, err := config.Load()
236+
if err != nil {
237+
return err
238+
}
239+
240+
// grpc
241+
conn, err := grpc.Dial(cfg.GRPC.Address, grpc.WithTransportCredentials(insecure.NewCredentials()))
242+
if err != nil {
243+
return errors.Wrap(err, "ошибка подключения к серверу")
244+
}
245+
defer conn.Close()
246+
247+
// client
248+
service := proto.NewAntiBrutServiceClient(conn)
249+
250+
// do request
251+
_, err = service.DeleteIPFromBlackList(cmd.Context(), &proto.DeleteIPFromBlackListRequest{
252+
Subnet: args[0],
253+
})
254+
if err != nil {
255+
return errors.Wrap(err, "произошла ошибка в процессе работы")
256+
}
257+
258+
cmd.Println("успешно!")
259+
260+
return nil
14261
}

ip_rule.go

+5
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@ func (r IPRule) IsWhiteList() bool {
2222
func (r IPRule) IsBlackList() bool {
2323
return r.Type == BlackList
2424
}
25+
26+
type IPRuleFilter struct {
27+
Type IPRuleType
28+
Subnet Subnet
29+
}

service.go

+10-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type repository interface {
3535
FindIPRuleBySubnet(ctx context.Context, subnet Subnet) (*IPRule, error)
3636
CreateIPRule(ctx context.Context, ipRule *IPRule) (*IPRule, error)
3737
UpdateIPRule(ctx context.Context, id IPRuleID, ipRule *IPRule) (*IPRule, error)
38-
DeleteIPRuleBySubnet(ctx context.Context, subnet Subnet) (int64, error)
38+
DeleteIPRules(ctx context.Context, filter IPRuleFilter) (int64, error)
3939
}
4040

4141
type Config struct {
@@ -132,7 +132,10 @@ func (s *Service) AddIPToWhiteList(ctx context.Context, subnet Subnet) error {
132132
}
133133

134134
func (s *Service) DeleteIPFromWhiteList(ctx context.Context, subnet Subnet) error {
135-
_, err := s.repo.DeleteIPRuleBySubnet(ctx, subnet)
135+
_, err := s.repo.DeleteIPRules(ctx, IPRuleFilter{
136+
Type: WhiteList,
137+
Subnet: subnet,
138+
})
136139
return err
137140
}
138141

@@ -141,7 +144,10 @@ func (s *Service) AddIPToBlackList(ctx context.Context, subnet Subnet) error {
141144
}
142145

143146
func (s *Service) DeleteIPFromBlackList(ctx context.Context, subnet Subnet) error {
144-
_, err := s.repo.DeleteIPRuleBySubnet(ctx, subnet)
147+
_, err := s.repo.DeleteIPRules(ctx, IPRuleFilter{
148+
Type: BlackList,
149+
Subnet: subnet,
150+
})
145151
return err
146152
}
147153

@@ -182,7 +188,7 @@ func (s *Service) createOrUpdateIPRule(ctx context.Context, t IPRuleType, subnet
182188
return err
183189
}
184190

185-
rule, err = s.repo.CreateIPRule(ctx, &IPRule{
191+
_, err := s.repo.CreateIPRule(ctx, &IPRule{
186192
Type: t,
187193
Subnet: subnet,
188194
})

sqlite/sqlite.go

+15-7
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,23 @@ func (r *Repository) UpdateIPRule(
276276
return ipRule, nil
277277
}
278278

279-
func (r *Repository) DeleteIPRuleBySubnet(ctx context.Context, subnet antibrut.Subnet) (int64, error) {
279+
func (r *Repository) DeleteIPRules(ctx context.Context, filter antibrut.IPRuleFilter) (int64, error) {
280+
where, args := []string{"1 = 1"}, []any{}
281+
282+
if filter.Type != 0 {
283+
where, args = append(where, "type = ?"), append(args, filter.Type)
284+
}
285+
286+
if filter.Subnet != "" {
287+
where, args = append(where, "subnet = ?"), append(args, filter.Subnet)
288+
}
289+
280290
result, err := r.db.ExecContext(ctx, `
281-
DELETE
291+
DELETE
282292
FROM ip_rules
283-
WHERE subnet = ?
284-
`,
285-
subnet,
293+
WHERE `+strings.Join(where, " AND ")+`
294+
`,
295+
args...,
286296
)
287297
if err != nil {
288298
return 0, errors.Wrap(err, "delete ip rules by subnet error")
@@ -294,8 +304,6 @@ func (r *Repository) DeleteIPRuleBySubnet(ctx context.Context, subnet antibrut.S
294304
}
295305

296306
return deletedCnt, nil
297-
298-
return result.RowsAffected()
299307
}
300308

301309
func (r *Repository) FindIPRulesByIP(ctx context.Context, ip antibrut.IP) ([]*antibrut.IPRule, error) {

0 commit comments

Comments
 (0)