mirror of
https://github.com/bettercap/bettercap.git
synced 2024-11-07 22:20:11 -08:00
87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
package api_rest
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/bettercap/recording"
|
|
|
|
"github.com/evilsocket/islazy/fs"
|
|
)
|
|
|
|
var (
|
|
errNotReplaying = errors.New("not replaying")
|
|
)
|
|
|
|
func (mod *RestAPI) errAlreadyReplaying() error {
|
|
return fmt.Errorf("the module is already replaying a session from %s", mod.recordFileName)
|
|
}
|
|
|
|
func (mod *RestAPI) startReplay(filename string) (err error) {
|
|
if mod.replaying {
|
|
return mod.errAlreadyReplaying()
|
|
} else if mod.recording {
|
|
return mod.errAlreadyRecording()
|
|
} else if mod.recordFileName, err = fs.Expand(filename); err != nil {
|
|
return err
|
|
}
|
|
|
|
mod.State.Store("load_progress", 0)
|
|
defer func() {
|
|
mod.State.Store("load_progress", 100.0)
|
|
}()
|
|
|
|
mod.loading = true
|
|
defer func() {
|
|
mod.loading = false
|
|
}()
|
|
|
|
mod.Info("loading %s ...", mod.recordFileName)
|
|
|
|
start := time.Now()
|
|
mod.record, err = recording.Load(mod.recordFileName, func(progress float64, done int, total int) {
|
|
mod.State.Store("load_progress", progress)
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
loadedIn := time.Since(start)
|
|
|
|
// we need the api itself up and running
|
|
if !mod.Running() {
|
|
if err := mod.Start(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
mod.recStarted = mod.record.Session.StartedAt()
|
|
mod.recStopped = mod.record.Session.StoppedAt()
|
|
duration := mod.recStopped.Sub(mod.recStarted)
|
|
mod.recTime = int(duration.Seconds())
|
|
mod.replaying = true
|
|
mod.recording = false
|
|
|
|
mod.Info("loaded %s of recording (%d frames) started at %s in %s, started replaying ...",
|
|
duration,
|
|
mod.record.Session.Frames(),
|
|
mod.recStarted,
|
|
loadedIn)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (mod *RestAPI) stopReplay() error {
|
|
if !mod.replaying {
|
|
return errNotReplaying
|
|
}
|
|
|
|
mod.replaying = false
|
|
|
|
mod.Info("stopped replaying from %s ...", mod.recordFileName)
|
|
|
|
mod.recordFileName = ""
|
|
|
|
return nil
|
|
}
|