/
main.go
79 lines (69 loc) · 1.76 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
package main
import (
"encoding/json"
"fmt"
"github.com/Issei0804-ie/who-is-in-a-lab/api"
"github.com/Issei0804-ie/who-is-in-a-lab/domain"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"io/ioutil"
"log"
"os"
"time"
)
var (
device string
snapshot_len int32 = 1024
promiscuous bool = false
err error
timeout time.Duration = 1 * time.Second
handle *pcap.Handle
)
func initMembers() []domain.Member {
var members []domain.Member
file, err := ioutil.ReadFile("./address.json")
if err != nil {
log.Fatal(err)
}
if err = json.Unmarshal(file, &members); err != nil {
log.Fatal(err)
}
for i, _ := range members {
members[i].LastLogin = time.Time{}
}
return members
}
func main() {
members := initMembers()
if len(os.Args) == 1 {
log.Fatal("usage: ./who-is-in-a-lab [network interface] \n example: ./who-is-in-a-lab wlan0")
}
device = os.Args[1]
log.Println(fmt.Sprintf("network interface is " + device))
handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
if err != nil {
log.Fatal(err)
}
defer handle.Close()
log.Println("listen now ...")
go api.InitAPI(&members)
log.Println("finish listen")
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
printPacketInfo(packet, members)
}
}
func printPacketInfo(packet gopacket.Packet, members []domain.Member) {
ethernetLayer := packet.Layer(layers.LayerTypeEthernet)
if ethernetLayer != nil {
ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)
for i, member := range members {
for _, address := range member.Addresses {
if ethernetPacket.SrcMAC.String() == address {
members[i].LastLogin = time.Now()
}
}
}
}
}