Skip to content

Commit

Permalink
Read IP file from stdin (#60)
Browse files Browse the repository at this point in the history
  • Loading branch information
v-byte-cpu committed Apr 29, 2021
1 parent c6ff7b9 commit b428a0b
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 8 deletions.
3 changes: 3 additions & 0 deletions command/icmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ var icmpCmd = &cobra.Command{
if cliDstSubnet, err = parseDstSubnet(args); err != nil {
return
}
if err = validatePacketScanStdin(); err != nil {
return
}
var icmpType uint64
if len(cliICMPTypeFlag) > 0 {
if icmpType, err = strconv.ParseUint(cliICMPTypeFlag, 10, 8); err != nil {
Expand Down
31 changes: 23 additions & 8 deletions command/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"context"
"errors"
"io"
"io/ioutil"
"net"
"os"
"strconv"
Expand Down Expand Up @@ -179,6 +180,13 @@ func addPacketScanOptions(cmd *cobra.Command, opts ...cliPacketScanOption) {
"any expression accepted by time.ParseDuration is valid (300ms by default)"}, "\n"))
}

func validatePacketScanStdin() (err error) {
if isARPCacheFromStdin() && cliIPPortFileFlag == "-" {
return errors.New("ARP cache and IP file can not be read from stdin at the same time")
}
return
}

func Main() {
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
Expand Down Expand Up @@ -232,16 +240,13 @@ func parseDstSubnet(args []string) (ipnet *net.IPNet, err error) {
return ip.ParseIPNet(args[0])
}

func isARPCacheFromStdin() bool {
return len(cliARPCacheFileFlag) == 0 || cliARPCacheFileFlag == "-"
}

func parseARPCache() (cache *arp.Cache, err error) {
var r io.Reader
if len(cliARPCacheFileFlag) > 0 {
var f *os.File
if f, err = os.Open(cliARPCacheFileFlag); err != nil {
return
}
defer f.Close()
r = bufio.NewReader(f)
} else {
if isARPCacheFromStdin() {
var info os.FileInfo
if info, err = os.Stdin.Stat(); err != nil {
return
Expand All @@ -252,6 +257,13 @@ func parseARPCache() (cache *arp.Cache, err error) {
return nil, errStdin
}
r = os.Stdin
} else {
var f *os.File
if f, err = os.Open(cliARPCacheFileFlag); err != nil {
return
}
defer f.Close()
r = bufio.NewReader(f)
}
cache = arp.NewCache()
err = arp.FillCache(cache, r)
Expand Down Expand Up @@ -429,6 +441,9 @@ func newIPPortGenerator() (reqgen scan.RequestGenerator) {
})
}
ipgen := scan.NewFileIPGenerator(func() (io.ReadCloser, error) {
if cliIPPortFileFlag == "-" {
return ioutil.NopCloser(os.Stdin), nil
}
return os.Open(cliIPPortFileFlag)
})
return scan.NewIPPortGenerator(ipgen, scan.NewPortGenerator())
Expand Down
3 changes: 3 additions & 0 deletions command/tcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ var tcpCmd = &cobra.Command{
if err = rootCmd.PersistentPreRunE(cmd, args); err != nil {
return
}
if err = validatePacketScanStdin(); err != nil {
return
}
cliDstSubnet, err = parseDstSubnet(args)
return
},
Expand Down
3 changes: 3 additions & 0 deletions command/udp.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ var udpCmd = &cobra.Command{
if cliDstSubnet, err = parseDstSubnet(args); err != nil {
return
}
if err = validatePacketScanStdin(); err != nil {
return
}
if len(cliUDPPayloadFlag) > 0 {
cliUDPPayload, err = parsePacketPayload(cliUDPPayloadFlag)
}
Expand Down

0 comments on commit b428a0b

Please sign in to comment.