-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscan.go
More file actions
96 lines (80 loc) · 2.09 KB
/
scan.go
File metadata and controls
96 lines (80 loc) · 2.09 KB
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
package main
import (
"context"
"encoding/binary"
"fmt"
"net"
"strconv"
"strings"
"time"
"github.com/urfave/cli/v3"
)
func ScanForPrinters(con context.Context, cmd *cli.Command) error {
interfaces, err := net.Interfaces()
if err != nil {
return err
}
masks := []net.IP{}
ips := []net.IP{}
ifaces := []string{}
for _, i := range interfaces {
if i.Flags&net.FlagLoopback != 0 {
continue
}
a, err := i.Addrs()
if err != nil {
continue
}
for _, addr := range a {
if ipNet, ok := addr.(*net.IPNet); ok {
if ipNet.IP.To4() == nil {
continue
}
masks = append(masks, net.IP(ipNet.Mask))
ips = append(ips, ipNet.IP.To4())
ifaces = append(ifaces, i.Name)
}
}
}
printers := []string{}
startTime := time.Now()
for i, rawIp := range ips {
ipInt := binary.BigEndian.Uint32(rawIp)
maskInt := binary.BigEndian.Uint32(masks[i])
start := (ipInt & maskInt) + 1
end := (start | ^maskInt) - 1
for rip := start; rip < end; rip++ {
ip := make(net.IP, 4)
binary.BigEndian.PutUint32(ip, rip)
go func() {
socket, err := NewPrinterWebsocket(ip.String())
if err != nil {
return
}
model, ok := Models[socket.InitalFrame.Model]
if !ok {
model = "\u001b[0;31mUnknown model! ID:" + socket.InitalFrame.Model + "\u001b[0m"
}
modelColor, ok := ModelColors[socket.InitalFrame.Model]
if !ok {
modelColor = "\u001b[0"
}
printers = append(printers, "Found "+modelColor+model+"\u001b[0m: \u001b[0;32m"+socket.InitalFrame.Hostname+"\u001b[0m (\u001b[0;32m"+ip.String()+"\u001b[0m)")
socket.Close()
}()
}
}
scanTime := 30
if cmd.Bool("long") {
scanTime = 150
}
for i := range scanTime {
fmt.Print("\u001b[2K\r")
fmt.Print("Scanning ", len(ifaces), " interface(s) for printers ("+strconv.FormatFloat(float64(scanTime-i)/10, 'g', -1, 64)+"sec left)")
time.Sleep(100 * time.Millisecond)
}
fmt.Print("\u001b[2K\r")
fmt.Println("Found", len(printers), "printers in", time.Since(startTime).Round(10*time.Millisecond).Seconds(), "seconds:")
fmt.Println(strings.Join(printers, "\n"))
return nil
}