new: net.show now accepts a comma separated list of ip, macs or aliases to filter for

This commit is contained in:
evilsocket 2018-10-06 14:57:40 +02:00
commit a2b3ee79fb
4 changed files with 52 additions and 32 deletions

View file

@ -57,8 +57,8 @@ func NewDiscovery(s *session.Session) *Discovery {
return d.Show("rcvd", "")
}))
d.AddHandler(session.NewModuleHandler("net.show ADDRESS", `net.show ([\d\.]+)`,
"Show information about a specific address.",
d.AddHandler(session.NewModuleHandler("net.show ADDRESS1, ADDRESS2", `net.show (.+)`,
"Show information about a specific list of addresses (by IP or MAC).",
func(args []string) error {
return d.Show("address", args[0])
}))

View file

@ -109,13 +109,16 @@ func (d *Discovery) getRow(e *network.Endpoint, withMeta bool) [][]string {
return rows
}
func (d *Discovery) Show(by string, addr string) error {
err, showMeta := d.BoolParam("net.show.meta")
if err != nil {
return err
func (d *Discovery) Show(by string, expr string) (err error) {
var targets []*network.Endpoint
if expr != "" {
if targets, err = network.ParseEndpoints(expr, d.Session.Lan); err != nil {
return err
}
} else {
targets = d.Session.Lan.List()
}
targets := d.Session.Lan.List()
if by == "seen" {
sort.Sort(BySeenSorter(targets))
} else if by == "sent" {
@ -134,19 +137,10 @@ func (d *Discovery) Show(by string, addr string) error {
targets = append([]*network.Endpoint{d.Session.Interface, d.Session.Gateway}, targets...)
}
if addr != "" {
tmp := make([]*network.Endpoint, 0)
pad = 0
for _, t := range targets {
if t.IP.String() == addr {
tmp = append(tmp, t)
}
}
targets = tmp
}
hasMeta := false
if showMeta {
if err, showMeta := d.BoolParam("net.show.meta"); err != nil {
return err
} else if showMeta {
for _, t := range targets {
if !t.Meta.Empty() {
hasMeta = true

View file

@ -81,6 +81,19 @@ func (lan *LAN) Get(mac string) (*Endpoint, bool) {
return nil, false
}
func (lan *LAN) GetByIp(ip string) *Endpoint {
lan.Lock()
defer lan.Unlock()
for _, e := range lan.hosts {
if e.IpAddress == ip {
return e
}
}
return nil
}
func (lan *LAN) List() (list []*Endpoint) {
lan.Lock()
defer lan.Unlock()
@ -169,19 +182,6 @@ func (lan *LAN) EachHost(cb func(mac string, e *Endpoint)) {
}
}
func (lan *LAN) GetByIp(ip string) *Endpoint {
lan.Lock()
defer lan.Unlock()
for _, e := range lan.hosts {
if e.IpAddress == ip {
return e
}
}
return nil
}
func (lan *LAN) AddIfNew(ip, mac string) *Endpoint {
lan.Lock()
defer lan.Unlock()

View file

@ -118,6 +118,32 @@ func ParseTargets(targets string, aliasMap *Aliases) (ips []net.IP, macs []net.H
return
}
func ParseEndpoints(targets string, lan *LAN) ([]*Endpoint, error) {
ips, macs, err := ParseTargets(targets, lan.Aliases())
if err != nil {
return nil, err
}
tmp := make(map[string]*Endpoint)
for _, ip := range ips {
if e := lan.GetByIp(ip.String()); e != nil {
tmp[e.HW.String()] = e
}
}
for _, mac := range macs {
if e, found := lan.Get(mac.String()); found {
tmp[e.HW.String()] = e
}
}
ret := make([]*Endpoint, 0)
for _, e := range tmp {
ret = append(ret, e)
}
return ret, nil
}
func buildEndpointFromInterface(iface net.Interface) (*Endpoint, error) {
addrs, err := iface.Addrs()
if err != nil {