-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
148 lines (118 loc) · 4.24 KB
/
main.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
package main
import (
"fmt"
"os"
"strings"
"github.com/alecthomas/kong"
"github.com/ales999/cisaccs"
)
var cli struct {
// Команда для поиска ARP данных
Arp struct {
CheckHosts []string `arg:"" name:"hosts" help:"Name of cisco hosts for finded ARP"`
FindIpOrMac string `name:"find" help:"Поиск по MAC или IP"`
} `cmd:"" help:"Get or find ARP"`
// Команда для поиска MAC данных
Mac struct {
CheckHosts []string `arg:"" name:"hosts" help:"Name of cisco hosts for finded MAC"`
FindedMac string `name:"find" help:"Поиск по MAC"`
} `cmd:"" help:"Get or find MAC"`
// Больше информации при подключении
DebugInfo bool `name:"debug" help:"More connect debug info" short:"d"`
// Номер порта для ssh
PortSsh int `help:"SSH порт для доступа к cisco" short:"p" default:"22"`
// Путь к файлу конфигурации имя_cisco/группа/ip - env: CISFILE
CisFileName string `help:"Путь к файлу конфигурации имя_cisco/группа/ip" default:"/etc/cisco/cis.yaml" env:"CISFILE"`
// Путь к файлу конфигурации имя_группы/имя/пароль - env: CISPWDS
PwdFileName string `help:"Путь к файлу конфигурации имя_группы/имя/пароль" default:"/etc/cisco/passw.json" env:"CISPWDS"`
}
func main() {
ctx := kong.Parse(&cli,
kong.Name("fip"),
kong.Description("Find IP with ARP and MAC table"),
kong.UsageOnError(),
)
cisaccs.CisDebug = cli.DebugInfo
switch ctx.Command() {
case "arp <hosts>":
err := FipFindArpCommand()
ctx.FatalIfErrorf(err)
case "mac <hosts>":
err := FipFindMacCommand()
ctx.FatalIfErrorf(err)
default:
panic(ctx.Command())
}
os.Exit(0)
}
// Поиск ARP-данных
func FipFindArpCommand() error {
// Что будем выполнять на cisco
cmds := []string{"sh arp"}
// Подготовка к подключению.
acc := cisaccs.NewCisAccount(cli.CisFileName, cli.PwdFileName)
// Если мы хотим найти конкретный IP или MAC в ARP то нужно парсить вывод
if len(cli.Arp.FindIpOrMac) > 0 {
for _, hst := range cli.Arp.CheckHosts {
// Получаем данные с каждого хоста
out, err := acc.OneCisExecuteSsh(hst, cli.PortSsh, cmds)
if err != nil {
fmt.Println(err.Error())
continue
}
found, arpsm := cisaccs.CisFindArp(out, cli.Arp.FindIpOrMac)
if found {
// Печать результата поиска
fmt.Printf("ARP %s found, Host: %s, Port %s, IP: %s\n", arpsm.GetMac(), hst, arpsm.GetIface(), arpsm.GetIp())
// ARP ищем до первого совпадения, на оствшиеся хосты можно не ходить.
break
}
}
} else {
out, err := acc.MultiCisExecuteSsh(cli.Arp.CheckHosts, cli.PortSsh, cmds)
if err != nil {
return err
}
for _, line := range out {
if !strings.Contains(line, "Incomplete") {
// Выводим всю arp-таблицу на экран
fmt.Println(line)
}
}
}
return nil
}
// Поиск MAC-данных
func FipFindMacCommand() error {
cmds := []string{"sh mac address-table | e CPU"}
// Prepare cisco account
acc := cisaccs.NewCisAccount(cli.CisFileName, cli.PwdFileName)
if len(cli.Mac.FindedMac) > 0 {
// Бежим по указанным хостам
for _, hst := range cli.Mac.CheckHosts {
cisout, err := acc.OneCisExecuteSsh(hst, cli.PortSsh, cmds)
if err != nil {
fmt.Println("Host", hst, ":", err.Error())
continue
}
macfound, macstrs := cisaccs.CisFindMac(cisout, cli.Mac.FindedMac)
// Если что-то нашли то перебираем
if macfound {
for _, macstr := range macstrs {
// Печать результата поиска
fmt.Printf("Mac %s found, Host: %s, Port: %s, Vlan: %s\n", macstr.GetMac(), hst, macstr.GetIface(), macstr.GetVlan())
}
}
}
} else {
out, err := acc.MultiCisExecuteSsh(cli.Mac.CheckHosts, cli.PortSsh, cmds)
if err != nil {
fmt.Println(err.Error())
}
for _, line := range out {
// Выводим всю mac-таблицу на экран
fmt.Println(line)
}
}
return nil
}