mirror of https://github.com/curusarn/resh
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.3 KiB
152 lines
4.3 KiB
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
|
|
"github.com/curusarn/resh/pkg/histanal"
|
|
"github.com/curusarn/resh/pkg/records"
|
|
"github.com/curusarn/resh/pkg/strat"
|
|
)
|
|
|
|
// Version from git set during build
|
|
var Version string
|
|
|
|
// Revision from git set during build
|
|
var Revision string
|
|
|
|
func main() {
|
|
const maxCandidates = 50
|
|
|
|
usr, _ := user.Current()
|
|
dir := usr.HomeDir
|
|
historyPath := filepath.Join(dir, ".resh_history.json")
|
|
historyPathBatchMode := filepath.Join(dir, "resh_history.json")
|
|
sanitizedHistoryPath := filepath.Join(dir, "resh_history_sanitized.json")
|
|
// tmpPath := "/tmp/resh-evaluate-tmp.json"
|
|
|
|
showVersion := flag.Bool("version", false, "Show version and exit")
|
|
showRevision := flag.Bool("revision", false, "Show git revision and exit")
|
|
input := flag.String("input", "",
|
|
"Input file (default: "+historyPath+"OR"+sanitizedHistoryPath+
|
|
" depending on --sanitized-input option)")
|
|
// outputDir := flag.String("output", "/tmp/resh-evaluate", "Output directory")
|
|
sanitizedInput := flag.Bool("sanitized-input", false,
|
|
"Handle input as sanitized (also changes default value for input argument)")
|
|
plottingScript := flag.String("plotting-script", "resh-evaluate-plot.py", "Script to use for plotting")
|
|
inputDataRoot := flag.String("input-data-root", "",
|
|
"Input data root, enables batch mode, looks for files matching --input option")
|
|
slow := flag.Bool("slow", false,
|
|
"Enables strategies that takes a long time (e.g. markov chain strategies).")
|
|
skipFailedCmds := flag.Bool("skip-failed-cmds", false,
|
|
"Skips records with non-zero exit status.")
|
|
debugRecords := flag.Float64("debug", 0, "Debug records - percentage of records that should be debugged.")
|
|
|
|
flag.Parse()
|
|
|
|
// handle show{Version,Revision} options
|
|
if *showVersion == true {
|
|
fmt.Println(Version)
|
|
os.Exit(0)
|
|
}
|
|
if *showRevision == true {
|
|
fmt.Println(Revision)
|
|
os.Exit(0)
|
|
}
|
|
|
|
// handle batch mode
|
|
batchMode := false
|
|
if *inputDataRoot != "" {
|
|
batchMode = true
|
|
}
|
|
// set default input
|
|
if *input == "" {
|
|
if *sanitizedInput {
|
|
*input = sanitizedHistoryPath
|
|
} else if batchMode {
|
|
*input = historyPathBatchMode
|
|
} else {
|
|
*input = historyPath
|
|
}
|
|
}
|
|
|
|
var evaluator histanal.HistEval
|
|
if batchMode {
|
|
evaluator = histanal.NewHistEvalBatchMode(*input, *inputDataRoot, maxCandidates, *skipFailedCmds, *debugRecords, *sanitizedInput)
|
|
} else {
|
|
evaluator = histanal.NewHistEval(*input, maxCandidates, *skipFailedCmds, *debugRecords, *sanitizedInput)
|
|
}
|
|
|
|
var simpleStrategies []strat.ISimpleStrategy
|
|
var strategies []strat.IStrategy
|
|
|
|
// dummy := strategyDummy{}
|
|
// simpleStrategies = append(simpleStrategies, &dummy)
|
|
|
|
simpleStrategies = append(simpleStrategies, &strat.Recent{})
|
|
|
|
// frequent := strategyFrequent{}
|
|
// frequent.init()
|
|
// simpleStrategies = append(simpleStrategies, &frequent)
|
|
|
|
// random := strategyRandom{candidatesSize: maxCandidates}
|
|
// random.init()
|
|
// simpleStrategies = append(simpleStrategies, &random)
|
|
|
|
directory := strat.DirectorySensitive{}
|
|
directory.Init()
|
|
simpleStrategies = append(simpleStrategies, &directory)
|
|
|
|
dynamicDistG := strat.DynamicRecordDistance{
|
|
MaxDepth: 3000,
|
|
DistParams: records.DistParams{Pwd: 10, RealPwd: 10, SessionID: 1, Time: 1, Git: 10},
|
|
Label: "10*pwd,10*realpwd,session,time,10*git",
|
|
}
|
|
dynamicDistG.Init()
|
|
strategies = append(strategies, &dynamicDistG)
|
|
|
|
distanceStaticBest := strat.RecordDistance{
|
|
MaxDepth: 3000,
|
|
DistParams: records.DistParams{Pwd: 10, RealPwd: 10, SessionID: 1, Time: 1},
|
|
Label: "10*pwd,10*realpwd,session,time",
|
|
}
|
|
strategies = append(strategies, &distanceStaticBest)
|
|
|
|
recentBash := strat.RecentBash{}
|
|
recentBash.Init()
|
|
strategies = append(strategies, &recentBash)
|
|
|
|
if *slow {
|
|
|
|
markovCmd := strat.MarkovChainCmd{Order: 1}
|
|
markovCmd.Init()
|
|
|
|
markovCmd2 := strat.MarkovChainCmd{Order: 2}
|
|
markovCmd2.Init()
|
|
|
|
markov := strat.MarkovChain{Order: 1}
|
|
markov.Init()
|
|
|
|
markov2 := strat.MarkovChain{Order: 2}
|
|
markov2.Init()
|
|
|
|
simpleStrategies = append(simpleStrategies, &markovCmd2, &markovCmd, &markov2, &markov)
|
|
}
|
|
|
|
for _, strategy := range simpleStrategies {
|
|
strategies = append(strategies, strat.NewSimpleStrategyWrapper(strategy))
|
|
}
|
|
|
|
for _, strat := range strategies {
|
|
err := evaluator.Evaluate(strat)
|
|
if err != nil {
|
|
log.Println("Evaluator evaluate() error:", err)
|
|
}
|
|
}
|
|
|
|
evaluator.CalculateStatsAndPlot(*plottingScript)
|
|
}
|
|
|