mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-07-08 05:17:49 +02:00
f5e6f53d75
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
140 lines
2.6 KiB
Go
140 lines
2.6 KiB
Go
package utils
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
// E if the last arg is error, panic it
|
|
func E(args ...interface{}) []interface{} {
|
|
err, ok := args[len(args)-1].(error)
|
|
if ok {
|
|
panic(err)
|
|
}
|
|
return args
|
|
}
|
|
|
|
// RandBytes generate random bytes with specified byte length
|
|
func RandBytes(len int) []byte {
|
|
b := make([]byte, len)
|
|
_, _ = rand.Read(b)
|
|
return b
|
|
}
|
|
|
|
// MkdirOptions ...
|
|
type MkdirOptions struct {
|
|
Perm os.FileMode
|
|
}
|
|
|
|
// Mkdir makes dir recursively
|
|
func Mkdir(path string, options *MkdirOptions) error {
|
|
if options == nil {
|
|
options = &MkdirOptions{
|
|
Perm: 0775,
|
|
}
|
|
}
|
|
|
|
return os.MkdirAll(path, options.Perm)
|
|
}
|
|
|
|
// OutputFileOptions ...
|
|
type OutputFileOptions struct {
|
|
DirPerm os.FileMode
|
|
FilePerm os.FileMode
|
|
JSONPrefix string
|
|
JSONIndent string
|
|
}
|
|
|
|
// OutputFile auto creates file if not exists, it will try to detect the data type and
|
|
// auto output binary, string or json
|
|
func OutputFile(p string, data interface{}, options *OutputFileOptions) error {
|
|
if options == nil {
|
|
options = &OutputFileOptions{0775, 0664, "", " "}
|
|
}
|
|
|
|
dir := filepath.Dir(p)
|
|
_ = Mkdir(dir, &MkdirOptions{Perm: options.DirPerm})
|
|
|
|
var bin []byte
|
|
|
|
switch t := data.(type) {
|
|
case []byte:
|
|
bin = t
|
|
case string:
|
|
bin = []byte(t)
|
|
default:
|
|
var err error
|
|
bin, err = json.MarshalIndent(data, options.JSONPrefix, options.JSONIndent)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return ioutil.WriteFile(p, bin, options.FilePerm)
|
|
}
|
|
|
|
// FileExists checks if file exists, only for file, not for dir
|
|
func FileExists(path string) bool {
|
|
info, err := os.Stat(path)
|
|
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if info.IsDir() {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// Sleep the goroutine for specified seconds, such as 2.3 seconds
|
|
func Sleep(seconds float64) {
|
|
d := time.Duration(seconds * float64(time.Second))
|
|
time.Sleep(d)
|
|
}
|
|
|
|
// ReadFile reads file as bytes
|
|
func ReadFile(p string) ([]byte, error) {
|
|
return ioutil.ReadFile(p)
|
|
}
|
|
|
|
// ReadJSON reads file as json
|
|
func ReadJSON(p string, data interface{}) error {
|
|
bin, err := ReadFile(p)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return json.Unmarshal(bin, data)
|
|
}
|
|
|
|
// MustToJSONBytes encode data to json bytes
|
|
func MustToJSONBytes(data interface{}) []byte {
|
|
bytes, err := json.Marshal(data)
|
|
E(err)
|
|
return bytes
|
|
}
|
|
|
|
// MustToJSON encode data to json string
|
|
func MustToJSON(data interface{}) string {
|
|
return string(MustToJSONBytes(data))
|
|
}
|
|
|
|
// Exec cmd
|
|
func Exec(cmd, dir string, args ...string) {
|
|
c := exec.Command(cmd, args...)
|
|
c.Dir = dir
|
|
c.Stdout = os.Stdout
|
|
c.Stderr = os.Stderr
|
|
|
|
E(c.Run())
|
|
}
|