refact: refactored module SetRunning method (fixes #49)

This commit is contained in:
evilsocket 2018-02-11 01:43:48 +01:00
parent 76d6977967
commit 9c6eb70eb3
15 changed files with 103 additions and 174 deletions

View file

@ -161,24 +161,21 @@ func (api *RestAPI) Start() error {
return err return err
} }
api.SetRunning(true) api.SetRunning(true, func() {
go func() {
log.Info("API server starting on https://%s", api.server.Addr) log.Info("API server starting on https://%s", api.server.Addr)
err := api.server.ListenAndServeTLS(api.certFile, api.keyFile) err := api.server.ListenAndServeTLS(api.certFile, api.keyFile)
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
panic(err) panic(err)
} }
}() })
return nil return nil
} }
func (api *RestAPI) Stop() error { func (api *RestAPI) Stop() error {
if api.Running() == false { return api.SetRunning(false, func() {
return session.ErrAlreadyStopped ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
} defer cancel()
api.SetRunning(false) api.server.Shutdown(ctx)
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) })
defer cancel()
return api.server.Shutdown(ctx)
} }

View file

@ -173,14 +173,11 @@ func (p *ArpSpoofer) Configure() error {
} }
func (p *ArpSpoofer) Start() error { func (p *ArpSpoofer) Start() error {
if p.Running() == true { if err := p.Configure(); err != nil {
return session.ErrAlreadyStarted
} else if err := p.Configure(); err != nil {
return err return err
} }
p.SetRunning(true) return p.SetRunning(true, func() {
go func() {
from := p.Session.Gateway.IP from := p.Session.Gateway.IP
from_hw := p.Session.Interface.HW from_hw := p.Session.Interface.HW
@ -192,24 +189,14 @@ func (p *ArpSpoofer) Start() error {
} }
p.done <- true p.done <- true
}() })
return nil
} }
func (p *ArpSpoofer) Stop() error { func (p *ArpSpoofer) Stop() error {
if p.Running() == false { return p.SetRunning(false, func() {
return session.ErrAlreadyStopped log.Info("Waiting for ARP spoofer to stop ...")
} <-p.done
p.unSpoof()
log.Info("Waiting for ARP spoofer to stop ...") p.ban = false
})
p.SetRunning(false)
<-p.done
p.unSpoof()
p.ban = false
return nil
} }

View file

@ -369,9 +369,7 @@ func (s *DHCP6Spoofer) Start() error {
return err return err
} }
s.SetRunning(true) return s.SetRunning(true, func() {
go func() {
defer s.Handle.Close() defer s.Handle.Close()
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType()) src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
@ -382,16 +380,11 @@ func (s *DHCP6Spoofer) Start() error {
s.onPacket(packet) s.onPacket(packet)
} }
}() })
return nil
} }
func (s *DHCP6Spoofer) Stop() error { func (s *DHCP6Spoofer) Stop() error {
if s.Running() == false { return s.SetRunning(false, func() {
return session.ErrAlreadyStopped s.Handle.Close()
} })
s.SetRunning(false)
s.Handle.Close()
return nil
} }

View file

@ -266,9 +266,7 @@ func (s *DNSSpoofer) Start() error {
return err return err
} }
s.SetRunning(true) return s.SetRunning(true, func() {
go func() {
defer s.Handle.Close() defer s.Handle.Close()
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType()) src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
@ -279,16 +277,11 @@ func (s *DNSSpoofer) Start() error {
s.onPacket(packet) s.onPacket(packet)
} }
}() })
return nil
} }
func (s *DNSSpoofer) Stop() error { func (s *DNSSpoofer) Stop() error {
if s.Running() == false { return s.SetRunning(false, func() {
return session.ErrAlreadyStopped s.Handle.Close()
} })
s.SetRunning(false)
s.Handle.Close()
return nil
} }

View file

@ -79,15 +79,11 @@ func (s *EventsStream) Configure() error {
} }
func (s *EventsStream) Start() error { func (s *EventsStream) Start() error {
if s.Running() == true { if err := s.Configure(); err != nil {
return session.ErrAlreadyStarted
} else if err := s.Configure(); err != nil {
return err return err
} }
s.SetRunning(true) return s.SetRunning(true, func() {
go func() {
for { for {
var e session.Event var e session.Event
select { select {
@ -99,9 +95,7 @@ func (s *EventsStream) Start() error {
return return
} }
} }
}() })
return nil
} }
func (s *EventsStream) Show(limit int) error { func (s *EventsStream) Show(limit int) error {
@ -123,10 +117,7 @@ func (s *EventsStream) Show(limit int) error {
} }
func (s *EventsStream) Stop() error { func (s *EventsStream) Stop() error {
if s.Running() == false { return s.SetRunning(false, func() {
return session.ErrAlreadyStopped s.quit <- true
} })
s.SetRunning(false)
s.quit <- true
return nil
} }

View file

@ -93,17 +93,13 @@ func (p *HttpProxy) Start() error {
return err return err
} }
p.SetRunning(true) return p.SetRunning(true, func() {
p.proxy.Start() p.proxy.Start()
})
return nil
} }
func (p *HttpProxy) Stop() error { func (p *HttpProxy) Stop() error {
if p.Running() == false { return p.SetRunning(false, func() {
return session.ErrAlreadyStopped p.proxy.Stop()
} })
p.SetRunning(false)
return p.proxy.Stop()
} }

View file

@ -103,24 +103,19 @@ func (httpd *HttpServer) Start() error {
return err return err
} }
httpd.SetRunning(true) return httpd.SetRunning(true, func() {
go func() {
log.Info("httpd server starting on http://%s", httpd.server.Addr) log.Info("httpd server starting on http://%s", httpd.server.Addr)
err := httpd.server.ListenAndServe() err := httpd.server.ListenAndServe()
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
panic(err) panic(err)
} }
}() })
return nil
} }
func (httpd *HttpServer) Stop() error { func (httpd *HttpServer) Stop() error {
if httpd.Running() == false { return httpd.SetRunning(false, func() {
return session.ErrAlreadyStopped ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
} defer cancel()
httpd.SetRunning(false) httpd.server.Shutdown(ctx)
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) })
defer cancel()
return httpd.server.Shutdown(ctx)
} }

View file

@ -131,17 +131,13 @@ func (p *HttpsProxy) Start() error {
return err return err
} }
p.SetRunning(true) return p.SetRunning(true, func() {
p.proxy.Start() p.proxy.Start()
})
return nil
} }
func (p *HttpsProxy) Stop() error { func (p *HttpsProxy) Stop() error {
if p.Running() == false { return p.SetRunning(false, func() {
return session.ErrAlreadyStopped p.proxy.Stop()
} })
p.SetRunning(false)
return p.proxy.Stop()
} }

View file

@ -103,28 +103,23 @@ func (mc *MacChanger) setMac(mac net.HardwareAddr) error {
} }
func (mc *MacChanger) Start() error { func (mc *MacChanger) Start() error {
if mc.Running() == true { if err := mc.Configure(); err != nil {
return session.ErrAlreadyStarted
} else if err := mc.Configure(); err != nil {
return err return err
} else if err := mc.setMac(mc.fakeMac); err != nil { } else if err := mc.setMac(mc.fakeMac); err != nil {
return err return err
} }
mc.SetRunning(true) return mc.SetRunning(true, func() {
log.Info("Interface mac address set to %s", core.Bold(mc.fakeMac.String())) log.Info("Interface mac address set to %s", core.Bold(mc.fakeMac.String()))
})
return nil
} }
func (mc *MacChanger) Stop() error { func (mc *MacChanger) Stop() error {
if mc.Running() == false { if err := mc.setMac(mc.originalMac); err != nil {
return session.ErrAlreadyStopped
} else if err := mc.setMac(mc.originalMac); err != nil {
return err return err
} }
mc.SetRunning(false) return mc.SetRunning(false, func() {
log.Info("Interface mac address restored to %s", core.Bold(mc.originalMac.String())) log.Info("Interface mac address restored to %s", core.Bold(mc.originalMac.String()))
return nil })
} }

View file

@ -87,15 +87,11 @@ func (p *Prober) Configure() error {
} }
func (p *Prober) Start() error { func (p *Prober) Start() error {
if p.Running() == true { if err := p.Configure(); err != nil {
return session.ErrAlreadyStarted
} else if err := p.Configure(); err != nil {
return err return err
} }
p.SetRunning(true) return p.SetRunning(true, func() {
go func() {
list, err := iprange.Parse(p.Session.Interface.CIDR()) list, err := iprange.Parse(p.Session.Interface.CIDR())
if err != nil { if err != nil {
log.Fatal("%s", err) log.Fatal("%s", err)
@ -121,15 +117,9 @@ func (p *Prober) Start() error {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
}() })
return nil
} }
func (p *Prober) Stop() error { func (p *Prober) Stop() error {
if p.Running() == false { return p.SetRunning(false, nil)
return session.ErrAlreadyStopped
}
p.SetRunning(false)
return nil
} }

View file

@ -125,15 +125,11 @@ func (d *Discovery) Configure() error {
} }
func (d *Discovery) Start() error { func (d *Discovery) Start() error {
if d.Running() == true { if err := d.Configure(); err != nil {
return session.ErrAlreadyStarted
} else if err := d.Configure(); err != nil {
return err return err
} }
d.SetRunning(true) return d.SetRunning(true, func() {
go func() {
for { for {
select { select {
case <-time.After(time.Duration(d.refresh) * time.Second): case <-time.After(time.Duration(d.refresh) * time.Second):
@ -152,16 +148,11 @@ func (d *Discovery) Start() error {
return return
} }
} }
}() })
return nil
} }
func (d *Discovery) Stop() error { func (d *Discovery) Stop() error {
if d.Running() == false { return d.SetRunning(false, func() {
return session.ErrAlreadyStopped d.quit <- true
} })
d.quit <- true
d.SetRunning(false)
return nil
} }

View file

@ -143,9 +143,7 @@ func (s *Sniffer) Start() error {
return err return err
} }
s.SetRunning(true) return s.SetRunning(true, func() {
go func() {
s.Stats = NewSnifferStats() s.Stats = NewSnifferStats()
src := gopacket.NewPacketSource(s.Ctx.Handle, s.Ctx.Handle.LinkType()) src := gopacket.NewPacketSource(s.Ctx.Handle, s.Ctx.Handle.LinkType())
@ -180,17 +178,11 @@ func (s *Sniffer) Start() error {
} }
} }
} }
}() })
return nil
} }
func (s *Sniffer) Stop() error { func (s *Sniffer) Stop() error {
if s.Running() == false { return s.SetRunning(false, func() {
return session.ErrAlreadyStopped s.Ctx.Close()
} })
s.SetRunning(false)
s.Ctx.Close()
return nil
} }

View file

@ -80,8 +80,7 @@ func (t *Ticker) Start() error {
return err return err
} }
t.SetRunning(true) return t.SetRunning(true, func() {
go func() {
log.Info("Ticker running with period %.fs.", t.Period.Seconds()) log.Info("Ticker running with period %.fs.", t.Period.Seconds())
tick := time.Tick(t.Period) tick := time.Tick(t.Period)
for _ = range tick { for _ = range tick {
@ -95,15 +94,9 @@ func (t *Ticker) Start() error {
} }
} }
} }
}() })
return nil
} }
func (t *Ticker) Stop() error { func (t *Ticker) Stop() error {
if t.Running() == false { return t.SetRunning(false, nil)
return session.ErrAlreadyStopped
}
t.SetRunning(false)
return nil
} }

View file

@ -101,11 +101,11 @@ func buildPayload(mac string) []byte {
} }
func (w *WOL) wolETH(mac string) error { func (w *WOL) wolETH(mac string) error {
w.SetRunning(true, nil)
defer w.SetRunning(false, nil)
payload := buildPayload(mac) payload := buildPayload(mac)
log.Info("Sending %d bytes of ethernet WOL packet to %s", len(payload), core.Bold(mac)) log.Info("Sending %d bytes of ethernet WOL packet to %s", len(payload), core.Bold(mac))
w.SetRunning(true)
defer w.SetRunning(false)
eth := layers.Ethernet{ eth := layers.Ethernet{
SrcMAC: w.Session.Interface.HW, SrcMAC: w.Session.Interface.HW,
DstMAC: layers.EthernetBroadcast, DstMAC: layers.EthernetBroadcast,
@ -126,10 +126,11 @@ func (w *WOL) wolETH(mac string) error {
} }
func (w *WOL) wolUDP(mac string) error { func (w *WOL) wolUDP(mac string) error {
w.SetRunning(true, nil)
defer w.SetRunning(false, nil)
payload := buildPayload(mac) payload := buildPayload(mac)
log.Info("Sending %d bytes of UDP WOL packet to %s", len(payload), core.Bold(mac)) log.Info("Sending %d bytes of UDP WOL packet to %s", len(payload), core.Bold(mac))
w.SetRunning(true)
defer w.SetRunning(false)
eth := layers.Ethernet{ eth := layers.Ethernet{
SrcMAC: w.Session.Interface.HW, SrcMAC: w.Session.Interface.HW,

View file

@ -122,9 +122,16 @@ func (m *SessionModule) Running() bool {
return m.Started return m.Started
} }
func (m *SessionModule) SetRunning(running bool) { func (m *SessionModule) SetRunning(running bool, cb func()) error {
m.StatusLock.Lock() m.StatusLock.Lock()
defer m.StatusLock.Unlock() defer m.StatusLock.Unlock()
if running && m.Started == true {
return ErrAlreadyStarted
} else if running == false && m.Started == false {
return ErrAlreadyStopped
}
m.Started = running m.Started = running
if *m.Session.Options.Debug == true { if *m.Session.Options.Debug == true {
@ -134,4 +141,16 @@ func (m *SessionModule) SetRunning(running bool) {
m.Session.Events.Add("mod.stopped", m.Name) m.Session.Events.Add("mod.stopped", m.Name)
} }
} }
if cb != nil {
if running == true {
// this is the worker, start async
go cb()
} else {
// stop callback, this is sync
cb()
}
}
return nil
} }