1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
package util
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"runtime"
"github.com/inconshreveable/log15"
"github.com/jinzhu/gorm"
"github.com/k0kubun/pp"
"github.com/parnurzeal/gorequest"
"github.com/spf13/viper"
)
// GenWorkers :
func GenWorkers(num int) chan<- func() {
tasks := make(chan func())
for i := 0; i < num; i++ {
go func() {
for f := range tasks {
f()
}
}()
}
return tasks
}
// GetDefaultLogDir :
func GetDefaultLogDir() string {
defaultLogDir := "/var/log/go-exploitdb"
if runtime.GOOS == "windows" {
defaultLogDir = filepath.Join(os.Getenv("APPDATA"), "go-exploitdb")
}
return defaultLogDir
}
// SetLogger :
func SetLogger(logDir string, quiet, debug, logJSON bool) {
stderrHundler := log15.StderrHandler
logFormat := log15.LogfmtFormat()
if logJSON {
logFormat = log15.JsonFormatEx(false, true)
stderrHundler = log15.StreamHandler(os.Stderr, logFormat)
}
lvlHundler := log15.LvlFilterHandler(log15.LvlInfo, stderrHundler)
if debug {
lvlHundler = log15.LvlFilterHandler(log15.LvlDebug, stderrHundler)
}
if quiet {
lvlHundler = log15.LvlFilterHandler(log15.LvlDebug, log15.DiscardHandler())
pp.SetDefaultOutput(ioutil.Discard)
}
if _, err := os.Stat(logDir); os.IsNotExist(err) {
if err := os.Mkdir(logDir, 0700); err != nil {
log15.Error("Failed to create log directory", "err", err)
}
}
var hundler log15.Handler
if _, err := os.Stat(logDir); err == nil {
logPath := filepath.Join(logDir, "go-exploitdb.log")
hundler = log15.MultiHandler(
log15.Must.FileHandler(logPath, logFormat),
lvlHundler,
)
} else {
hundler = lvlHundler
}
log15.Root().SetHandler(hundler)
}
// FetchURL returns HTTP response body
func FetchURL(url string, apiKey ...string) ([]byte, error) {
var errs []error
httpProxy := viper.GetString("http-proxy")
resp, body, err := gorequest.New().Proxy(httpProxy).Get(url).Type("text").EndBytes()
if len(errs) > 0 || resp == nil {
return nil, fmt.Errorf("HTTP error. errs: %v, url: %s", err, url)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("HTTP error. errs: %v, status code: %d, url: %s", err, resp.StatusCode, url)
}
return body, nil
}
// DeleteRecordNotFound deletes gorm.ErrRecordNotFound in errs
func DeleteRecordNotFound(errs []error) (new []error) {
for _, err := range errs {
if err != nil && err != gorm.ErrRecordNotFound {
new = append(new, err)
}
}
return new
}
// DeleteNil deletes nil in errs
func DeleteNil(errs []error) (new []error) {
for _, err := range errs {
if err != nil {
new = append(new, err)
}
}
return new
}
|