commit eb9f7b8031b1f07a7c255a7eeb5530b482766eb7 Author: 兔子 Date: Wed Sep 4 16:06:52 2019 +0800 init diff --git a/main.go b/main.go new file mode 100644 index 0000000..d3103f9 --- /dev/null +++ b/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + +} \ No newline at end of file diff --git a/vtqe/cmd.go b/vtqe/cmd.go new file mode 100644 index 0000000..5e50199 --- /dev/null +++ b/vtqe/cmd.go @@ -0,0 +1,9 @@ +package main + +import ( + "Victorique/vtqe/tools" +) + +func main() { + tools.Maincmd.Execute() +} diff --git a/vtqe/tools/attach.go b/vtqe/tools/attach.go new file mode 100644 index 0000000..4a23174 --- /dev/null +++ b/vtqe/tools/attach.go @@ -0,0 +1,46 @@ +package tools + +import ( + "fmt" + + "b612.me/starainrt" + "b612.me/starlog" + "github.com/spf13/cobra" +) + +var attachcmd = &cobra.Command{ + Use: "attach", + Short: "合并两个文件", + Long: "合并两个文件", + Run: func(this *cobra.Command, args []string) { + var src, dst, out string + if len(args) == 3 { + src = args[0] + dst = args[1] + out = args[2] + } else { + src, _ = this.Flags().GetString("src") + dst, _ = this.Flags().GetString("dst") + out, _ = this.Flags().GetString("out") + } + if src == "" || dst == "" { + starlog.Println("ERROR PATH", "red", "b") + this.Help() + return + } + cryp := new(starainrt.StarCrypto) + err := cryp.Attach(src, dst, out) + if err != nil { + starlog.Println(err.Error, "red", "b") + } else { + fmt.Println("完成") + } + }, +} + +func init() { + attachcmd.Flags().StringP("src", "s", "", "源文件路径") + attachcmd.Flags().StringP("dst", "d", "", "目标文件路径") + attachcmd.Flags().StringP("out", "o", "", "输出文件路径") + Maincmd.AddCommand(attachcmd) +} diff --git a/vtqe/tools/base64.go b/vtqe/tools/base64.go new file mode 100644 index 0000000..c9f54c7 --- /dev/null +++ b/vtqe/tools/base64.go @@ -0,0 +1,61 @@ +package tools + +import ( + "fmt" + + "b612.me/starainrt" + "b612.me/starlog" + "github.com/spf13/cobra" +) + +var b64cmd = &cobra.Command{ + Use: "base64", + Short: "使用base64处理文件或字符串", + Long: "使用base64处理文件或字符串", + Run: func(this *cobra.Command, args []string) { + var err error + ok, _ := this.Flags().GetBool("file") + de, _ := this.Flags().GetBool("decode") + if len(args) != 1 { + starlog.Println("参数不足,请输入文件地址或字符串", "red", "b") + this.Help() + return + } + shell := func(pect float64) { + if pect == 100 { + fmt.Println("已处理:100.000000%") + } else { + fmt.Printf("已处理:%f%%\r", pect) + } + } + cry := new(starainrt.StarCrypto) + if ok { + path, _ := this.Flags().GetString("path") + if !de { + err = cry.Base64EncodeFile(args[0], path, shell) + } else { + err = cry.Base64DecodeFile(args[0], path, shell) + } + } else { + if !de { + data := cry.Base64Encode([]byte(args[0])) + fmt.Println(data) + } else { + var data []byte + data, err = cry.Base64Decode(args[0]) + fmt.Println(string(data)) + } + } + if err != nil { + starlog.Println(err, "red", "b") + return + } + }, +} + +func init() { + b64cmd.Flags().BoolP("file", "f", false, "base64处理文件") + b64cmd.Flags().StringP("path", "p", "./b64.encode", "指定处理地址,默认为./b64.encode") + b64cmd.Flags().BoolP("decode", "d", false, "base64解码") + Maincmd.AddCommand(b64cmd) +} diff --git a/vtqe/tools/cmd.go b/vtqe/tools/cmd.go new file mode 100644 index 0000000..32a7b4e --- /dev/null +++ b/vtqe/tools/cmd.go @@ -0,0 +1,18 @@ +package tools + +import ( + "github.com/spf13/cobra" +) + +var Version string = "0.1.12" + +var Maincmd = &cobra.Command{ + Use: "", + Short: "Victorique's Small Smart Toolkit", + Long: "Victorique's Small Smart Toolkit", +} + +func init() { + cobra.MousetrapHelpText = "" + Maincmd.Version = Version +} diff --git a/vtqe/tools/curl.go b/vtqe/tools/curl.go new file mode 100644 index 0000000..5901d04 --- /dev/null +++ b/vtqe/tools/curl.go @@ -0,0 +1,210 @@ +package tools + +import ( + "fmt" + "io/ioutil" + "net/http" + "strings" + + "b612.me/starainrt" + + "github.com/spf13/cobra" +) + +var curlcmd = &cobra.Command{ + Use: "curl", + Short: "Curl工具", + Long: "Curl小工具", + Run: func(this *cobra.Command, args []string) { + var method string + var err error + var data []byte + o, _ := this.Flags().GetString("output") + d, _ := this.Flags().GetString("data") + f, _ := this.Flags().GetString("file") + h, _ := this.Flags().GetString("header") + c, _ := this.Flags().GetString("cookie") + b, _ := this.Flags().GetString("cookie-jar") + i, _ := this.Flags().GetBool("include") + x, _ := this.Flags().GetString("proxy") + m, _ := this.Flags().GetInt("max-time") + ua, _ := this.Flags().GetString("user-agent") + connecttimeout, _ := this.Flags().GetInt("connect-timeout") + if len(args) != 1 { + this.Help() + return + } + url := args[0] + shell := func(pect float64) { + if pect == 100 { + fmt.Println("已完成:100.000000%") + } else { + fmt.Printf("已完成:%f%%\r", pect) + } + } + var postdata map[string]string + if d != "" { + postdata = make(map[string]string) + strip := strings.Split(d, "&") + for _, v := range strip { + tmp := strings.Split(v, "=") + if len(tmp) != 2 { + continue + } + postdata[tmp[0]] = tmp[1] + } + } + if len(d) == 0 { + method = "GET" + } else { + method = "POST" + } + tmp := strings.Split(f, ",") + curl := starainrt.NewStarCurl() + curl.TimeOut = m + curl.DialTimeOut = connecttimeout + curl.ReqHeader.Set("User-Agent", "Victorique - B612.ME") + if ua != "" { + curl.ReqHeader.Set("User-Agent", ua) + } + if x != "" { + curl.Proxy = x + } + if h != "" { + head := strings.Split(h, ",") + for _, v := range head { + hp := strings.Split(v, "=") + if len(hp) != 2 { + continue + } + curl.ReqHeader.Set(hp[0], hp[1]) + } + } + if c != "" { + if starainrt.Exists(c) { + ck, err := ioutil.ReadFile(c) + if err != nil { + fmt.Println(err) + return + } + h = strings.TrimSpace(string(ck)) + } + cook := strings.Split(h, ",") + for _, v := range cook { + hp := strings.Split(v, "=") + if len(hp) != 2 { + continue + } + curl.ReqCookies = append(curl.ReqCookies, &http.Cookie{Name: hp[0], Value: hp[1]}) + } + + } + if len(tmp) != 2 && f != "" { + fmt.Println("对file应使用逗号分隔区分文件名和路径") + return + } + if o != "" { + if f != "" { + _, err = curl.CurlWithFile(url, postdata, tmp[0], tmp[1], o, true, shell) + + } else { + err = curl.CurlDataToFile(url, []byte(d), method, o, shell) + + } + if err != nil { + fmt.Println(err) + } + if i { + for k, v := range curl.RespHeader { + for _, v2 := range v { + fmt.Println(k + ":" + v2) + } + } + fmt.Println("\n") + var cookiewriter string + for _, v := range curl.RespCookies { + fmt.Println(v.Name + ":" + v.Value) + if b != "" { + cookiewriter += v.Name + ":" + v.Value + "," + } + } + fmt.Println("\n\n") + if b != "" { + ioutil.WriteFile(b, []byte(cookiewriter), 0755) + } + } + } else { + if f != "" { + data, err = curl.CurlWithFile(url, postdata, tmp[0], tmp[1], "", false, shell) + + } else { + data, err = curl.Curl(url, []byte(d), method) + } + if i { + for k, v := range curl.RespHeader { + for _, v2 := range v { + fmt.Println(k + ":" + v2) + } + } + fmt.Println("\n") + var cookiewriter string + for _, v := range curl.RespCookies { + fmt.Println(v.Name + ":" + v.Value) + if b != "" { + cookiewriter += v.Name + ":" + v.Value + "," + } + } + fmt.Println("\n\n") + if b != "" { + ioutil.WriteFile(b, []byte(cookiewriter), 0755) + } + } + fmt.Println(string(data)) + if err != nil { + fmt.Println(err) + } + } + }, +} + +func init() { + Maincmd.AddCommand(curlcmd) + curlcmd.Flags().StringP("output", "o", "", "写入文件而不是标准输出") + curlcmd.Flags().StringP("data", "d", "", "http postdata数据") + curlcmd.Flags().StringP("file", "f", "", "上传文件的地址") + curlcmd.Flags().StringP("header", "H", "", "使用的header") + curlcmd.Flags().StringP("cookie", "b", "", "使用的cookie") + curlcmd.Flags().StringP("cookie-jar", "c", "", "写入返回的cookie到文件中") + curlcmd.Flags().BoolP("include", "i", false, "显示返回的header与cookie") + curlcmd.Flags().StringP("proxy", "x", "", "使用代理") + curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间") + curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间") + curlcmd.Flags().StringP("user-agent", "A", "", "UA设置") + curlcmd.AddCommand(curlupcmd) +} + +var curlupcmd = &cobra.Command{ + Use: "upload", + Short: "victorique上传工具", + Long: "victorique上传工具", + Run: func(this *cobra.Command, args []string) { + if len(args) != 2 { + fmt.Println(args, "不合法啊") + return + } + curl := starainrt.NewStarCurl() + curl.TimeOut = 0 + shell := func(pect float64) { + if pect == 100 { + fmt.Println("已完成:100.000000%") + } else { + fmt.Printf("已完成:%f%%\r", pect) + } + } + data, err := curl.CurlWithFile("http://"+args[0]+"/vtqeupload1127", nil, "victorique", args[1], "", false, shell) + fmt.Println(string(data)) + if err != nil { + fmt.Println(err) + } + }, +} diff --git a/vtqe/tools/detach.go b/vtqe/tools/detach.go new file mode 100644 index 0000000..26f0aa2 --- /dev/null +++ b/vtqe/tools/detach.go @@ -0,0 +1,48 @@ +package tools + +import ( + "fmt" + + "b612.me/starainrt" + "b612.me/starlog" + "github.com/spf13/cobra" +) + +var detachcmd = &cobra.Command{ + Use: "detach", + Short: "分离两个文件", + Long: "分离两个文件", + Run: func(this *cobra.Command, args []string) { + var src, dst, out string + if len(args) == 3 { + src = args[0] + dst = args[1] + out = args[2] + } else { + src, _ = this.Flags().GetString("src") + dst, _ = this.Flags().GetString("dst") + out, _ = this.Flags().GetString("out") + } + num, _ := this.Flags().GetInt("num") + if src == "" || dst == "" { + starlog.Println("ERROR PATH", "red", "b") + this.Help() + return + } + cryp := new(starainrt.StarCrypto) + err := cryp.Detach(src, num, dst, out) + if err != nil { + starlog.Println(err.Error, "red", "b") + } else { + fmt.Println("完成") + } + }, +} + +func init() { + detachcmd.Flags().StringP("src", "s", "", "源文件路径") + detachcmd.Flags().StringP("dst", "d", "", "目标文件路径1") + detachcmd.Flags().StringP("out", "o", "", "目标文件路径2") + detachcmd.Flags().IntP("num", "n", 0, "分割开始字节") + Maincmd.AddCommand(detachcmd) +} diff --git a/vtqe/tools/ftp.go b/vtqe/tools/ftp.go new file mode 100644 index 0000000..b571145 --- /dev/null +++ b/vtqe/tools/ftp.go @@ -0,0 +1,50 @@ +package tools + +import ( + "log" + "path/filepath" + + filedriver "github.com/goftp/file-driver" + "github.com/goftp/server" + "github.com/spf13/cobra" +) + +var ports int +var username, pwd string + +// ftpCmd represents the ftp command +var ftpcmd = &cobra.Command{ + Use: "ftp", + Short: `FTP文件服务器`, + Long: `FTP文件服务器`, + Run: func(cmd *cobra.Command, args []string) { + path, _ = filepath.Abs(path) + factory := &filedriver.FileDriverFactory{ + RootPath: path, + Perm: server.NewSimplePerm("user", "group"), + } + opts := &server.ServerOpts{ + Factory: factory, + Port: ports, + Hostname: ip, + Auth: &server.SimpleAuth{Name: username, Password: pwd}, + } + + log.Printf("Starting ftp server on %v:%v", opts.Hostname, opts.Port) + log.Printf("Username %v, Password %v", username, pwd) + server := server.NewServer(opts) + err := server.ListenAndServe() + if err != nil { + log.Fatal("Error starting server:", err) + } + }, +} + +func init() { + Maincmd.AddCommand(ftpcmd) + ftpcmd.Flags().IntVarP(&ports, "port", "p", 21, "监听端口") + ftpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听地址") + ftpcmd.Flags().StringVarP(&username, "user", "u", "1", "用户名,默认为1") + ftpcmd.Flags().StringVarP(&pwd, "pwd", "k", "1", "密码,默认为1") + ftpcmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址") +} diff --git a/vtqe/tools/generate.go b/vtqe/tools/generate.go new file mode 100644 index 0000000..2fd5828 --- /dev/null +++ b/vtqe/tools/generate.go @@ -0,0 +1,39 @@ +package tools + +import ( + "fmt" + + "b612.me/starainrt" + "github.com/spf13/cobra" +) + +var gencmd = &cobra.Command{ + Use: "generate", + Short: "生成随机文件", + Long: "生成指定大小的随机文件", + Run: func(this *cobra.Command, args []string) { + sum, _ := this.Flags().GetInt("sum") + num, _ := this.Flags().GetInt("num") + if len(args) != 1 { + this.Help() + return + } + err := starainrt.FillWithRandom(args[0], num, 1024*1024, sum, func(pect float64) { + if pect == 100 { + fmt.Println("文件已处理:100.000000%") + } else { + fmt.Printf("文件已处理:%f%%\r", pect) + } + }) + if err != nil { + fmt.Println("err:" + err.Error()) + } + }, +} + +func init() { + gencmd.Flags().IntP("sum", "s", 3, "随机的种子组数") + gencmd.Flags().IntP("num", "n", 1024, "生成的文件大小") + gencmd.MarkFlagRequired("num") + Maincmd.AddCommand(gencmd) +} diff --git a/vtqe/tools/hash.go b/vtqe/tools/hash.go new file mode 100644 index 0000000..117bde9 --- /dev/null +++ b/vtqe/tools/hash.go @@ -0,0 +1,71 @@ +package tools + +import ( + "fmt" + "os" + + "b612.me/starainrt" + + "b612.me/starlog" + "github.com/spf13/cobra" +) + +var hashcmd = &cobra.Command{ + Use: "hash", + Short: "多种方法哈希值校验", + Long: "进行多种方法哈希值校验", + Run: func(this *cobra.Command, args []string) { + var cumethod, method []string + var result map[string]string + var err error + crypto := new(starainrt.StarCrypto) + cumethod = []string{"md5", "crc32", "sha512", "sha384", "sha256", "sha224", "sha1"} + if ok, _ := this.Flags().GetBool("all"); ok { + method = cumethod + } else { + if len(args) == 0 { + this.Usage() + os.Exit(1) + } + + for _, v := range cumethod { + if ok, _ := this.Flags().GetBool(v); ok { + method = append(method, v) + } + } + if len(method) == 0 { + method = append(method, "md5") + } + } + if ok, _ := this.Flags().GetBool("file"); ok { + result, err = crypto.FileSumAll(args[0], method, func(pect float64) { + if pect != 100.0 { + fmt.Printf("校验已完成:%f%%\r", pect) + } else { + fmt.Printf("校验已完成:%f%%\n", pect) + } + }) + } else { + result, err = crypto.SumAll([]byte(args[0]), method) + } + if err != nil { + starlog.Println("错误:"+err.Error(), "red", "") + } + for _, v := range method { + fmt.Printf("%s:%s\n", v, result[v]) + } + }, +} + +func init() { + hashcmd.Flags().BoolP("all", "a", false, "使用所有的校验方法") + hashcmd.Flags().BoolP("file", "f", false, "对指定文件进行校验") + hashcmd.Flags().BoolP("md5", "m", false, "进行MD5校验(默认)") + hashcmd.Flags().BoolP("crc32", "c", false, "进行CRC32校验") + hashcmd.Flags().BoolP("sha512", "s", false, "进行SHA512校验") + hashcmd.Flags().Bool("sha384", false, "进行SHA384校验") + hashcmd.Flags().Bool("sha256", false, "进行SHA256校验") + hashcmd.Flags().Bool("sha224", false, "进行SHA224校验") + hashcmd.Flags().Bool("sha1", false, "进行SHA1校验") + Maincmd.AddCommand(hashcmd) +} diff --git a/vtqe/tools/http.go b/vtqe/tools/http.go new file mode 100644 index 0000000..6b586fb --- /dev/null +++ b/vtqe/tools/http.go @@ -0,0 +1,192 @@ +package tools + +import ( + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "strconv" + "strings" + + "b612.me/starainrt" + + "b612.me/starlog" + + "github.com/spf13/cobra" +) + +var port, ip, path string +var up bool + +type TraceHandler struct { + h http.Handler +} + +// httpCmd represents the http command +var httpcmd = &cobra.Command{ + Use: "http", + Short: "HTTP文件服务器", + Long: `HTTP文件服务器`, + Run: func(cmd *cobra.Command, args []string) { + http.HandleFunc("/", httplisten) + path, _ = filepath.Abs(path) + fmt.Println("Listening On Port:" + port) + if up { + fmt.Println("upload is openned,path is /vtqeupload1127") + http.HandleFunc("/vtqeupload1127", uploadfile) + } + err := http.ListenAndServe(ip+":"+port, nil) + if err != nil { + starlog.Println("Error:"+err.Error(), "red", "") + } + }, +} + +func uploadfile(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + w.Write([]byte("USE POST METHOD!")) + return + } + r.ParseMultipartForm(10485760) + file, handler, err := r.FormFile("victorique") + if err != nil { + fmt.Println(err) + w.WriteHeader(502) + w.Write([]byte(err.Error())) + return + } + defer file.Close() + fmt.Printf("Upload %s From %s\n", handler.Filename, r.RemoteAddr) + fmt.Fprintf(w, `

%v

Return To Web Page

`, handler.Header) + os.Mkdir("./vtqeupload1127", 0755) + f, err := os.OpenFile("./vtqeupload1127/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0755) + if err != nil { + fmt.Println(err) + return + } + defer f.Close() + io.Copy(f, file) +} + +func httplisten(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Server", "Vicorique") + p := r.URL.Path + cmd := r.URL.Query()["cmd"] + fmt.Println("Get " + p + " " + r.RemoteAddr) + fullpath, _ := filepath.Abs(path + p) + + if p == "/" { + ReadFolder(w, r, fullpath, true) + return + } + if up { + if p == "/vtqeupload1127/web" { + w.Write([]byte(`
+

Victorique's File Upload Page

+

上传文件:

+ +
+

Copyright@b612.me

`)) + return + } + } + if !starainrt.Exists(fullpath) { + w.WriteHeader(404) + if len(cmd) != 0 { + if cmd[0] == "header" { + for k, v := range r.Header { + for _, v2 := range v { + fmt.Fprintf(w, "%s:%s\n", k, v2) + } + } + } + } + w.Write([]byte("

404 NOT FOUND

")) + return + } + if starainrt.IsFolder(fullpath) { + ReadFolder(w, r, fullpath, false) + return + } + fpdst, err := os.Open(fullpath) + if err != nil { + fmt.Println(err) + w.WriteHeader(502) + w.Write([]byte("

502 ERROR

")) + return + } + fpinfo, _ := os.Stat(fullpath) + name := filepath.Base(fullpath) + tmp := strings.Split(name, ".") + ext := "" + if len(tmp) >= 2 { + ext = strings.ToLower(tmp[len(tmp)-1]) + } + switch ext { + case "jpeg", "jpg", "jpe": + w.Header().Set("Content-Type", "image/jpeg") + case "mpeg", "mpg", "mkv": + w.Header().Set("Content-Type", "video/mpeg") + case "mp4": + w.Header().Set("Content-Type", "video/mp4") + case "pdf": + w.Header().Set("Content-Type", "application/pdf") + default: + w.Header().Set("Content-Type", "application/download") + w.Header().Set("Content-Disposition", "attachment;filename="+name) + } + w.Header().Set("Content-Transfer-Encoding", "binary") + w.Header().Set("Accept-Ranges", "bytes") + w.Header().Set("Content-Length", strconv.Itoa(int(fpinfo.Size()))) + w.WriteHeader(200) + defer fpdst.Close() + for { + buf := make([]byte, 1048576) + n, err := fpdst.Read(buf) + if err != nil { + if err == io.EOF { + break + } + return + } + w.Write(buf[0:n]) + } +} + +func ReadFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot bool) { + dir, err := ioutil.ReadDir(fullpath) + if err != nil { + fmt.Println(err) + w.WriteHeader(403) + w.Write([]byte("

Cannot Access!

")) + return + } + w.Write([]byte("\n\n

Victorique Http Server - " + Version + "

")) + if up { + w.Write([]byte("Upload Web Page Is Openned!

")) + } + w.Write([]byte("
\n"))
+	if !isroot {
+		w.Write([]byte(fmt.Sprintf("

%s %s

\n", "..", "..", "上层文件夹"))) + } + for _, v := range dir { + if v.Name() != "." || v.Name() != ".." { + if !v.IsDir() { + w.Write([]byte(fmt.Sprintf("

%s %d %s

\n", r.URL.Path+"/"+v.Name(), v.Name(), int(v.Size()), v.ModTime().Format("2006-01-02 15:04:05")))) + } else { + w.Write([]byte(fmt.Sprintf("

%s %s %s

\n", v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05")))) + } + } + } + w.Write([]byte("
\n")) + return +} +func init() { + httpcmd.Flags().StringVarP(&port, "port", "p", "80", "监听端口") + httpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听ip") + httpcmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址") + httpcmd.Flags().BoolVarP(&up, "upload", "u", false, "是否开启文件上传") + Maincmd.AddCommand(httpcmd) +} diff --git a/vtqe/tools/merge.go b/vtqe/tools/merge.go new file mode 100644 index 0000000..d783c28 --- /dev/null +++ b/vtqe/tools/merge.go @@ -0,0 +1,48 @@ +package tools + +import ( + "fmt" + + "b612.me/starainrt" + "b612.me/starlog" + + "github.com/spf13/cobra" +) + +var mergecmd = &cobra.Command{ + Use: "merge", + Short: "合并文件", + Long: "按路径自动合并分割的文件", + Run: func(this *cobra.Command, args []string) { + var src, dst string + if len(args) == 2 { + src = args[0] + dst = args[1] + } else { + src, _ = this.Flags().GetString("src") + dst, _ = this.Flags().GetString("dst") + } + if src == "" || dst == "" { + this.Help() + return + } + crypto := new(starainrt.StarCrypto) + err := crypto.MergeFile(src, dst, func(pect float64) { + if pect == 100 { + fmt.Println("文件已处理:100.000000%") + } else { + fmt.Printf("文件已处理:%f%%\r", pect) + } + }) + if err != nil { + starlog.Println(err.Error, "red", "") + } + + }, +} + +func init() { + mergecmd.Flags().StringP("src", "s", "", "源文件地址,用*替换文件数字") + mergecmd.Flags().StringP("dst", "d", "", "目标文件地址") + Maincmd.AddCommand(mergecmd) +} diff --git a/vtqe/tools/ping/fqdn.go b/vtqe/tools/ping/fqdn.go new file mode 100644 index 0000000..5f36b48 --- /dev/null +++ b/vtqe/tools/ping/fqdn.go @@ -0,0 +1,17 @@ +package ping + +import "net" + +// GetIP ... +func GetIP(hostname string) string { + addrs, err := net.LookupIP(hostname) + if err != nil { + return "" + } + for _, addr := range addrs { + if ipv4 := addr.To4(); ipv4 != nil { + return ipv4.String() + } + } + return "" +} diff --git a/vtqe/tools/ping/http.go b/vtqe/tools/ping/http.go new file mode 100644 index 0000000..02825ea --- /dev/null +++ b/vtqe/tools/ping/http.go @@ -0,0 +1,120 @@ +package ping + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptrace" + "time" +) + +// HTTPing ... +type HTTPing struct { + target *Target + done chan struct{} + result *Result + Method string +} + +var _ Pinger = (*HTTPing)(nil) + +// NewHTTPing return new HTTPing +func NewHTTPing(method string) *HTTPing { + return &HTTPing{ + done: make(chan struct{}), + Method: method, + } +} + +// SetTarget ... +func (ping *HTTPing) SetTarget(target *Target) { + ping.target = target + if ping.result == nil { + ping.result = &Result{Target: target} + } +} + +// Start ping +func (ping *HTTPing) Start() <-chan struct{} { + go func() { + t := time.NewTicker(ping.target.Interval) + defer t.Stop() + for { + select { + case <-t.C: + if ping.result.Counter >= ping.target.Counter && ping.target.Counter != 0 { + ping.Stop() + return + } + duration, resp, remoteAddr, err := ping.ping() + ping.result.Counter++ + + if err != nil { + fmt.Printf("Ping %s - failed: %s\n", ping.target, err) + } else { + defer resp.Body.Close() + length, _ := io.Copy(ioutil.Discard, resp.Body) + fmt.Printf("Ping %s(%s) - %s is open - time=%s method=%s status=%d bytes=%d\n", ping.target, remoteAddr, ping.target.Protocol, duration, ping.Method, resp.StatusCode, length) + if ping.result.MinDuration == 0 { + ping.result.MinDuration = duration + } + if ping.result.MaxDuration == 0 { + ping.result.MaxDuration = duration + } + ping.result.SuccessCounter++ + if duration > ping.result.MaxDuration { + ping.result.MaxDuration = duration + } else if duration < ping.result.MinDuration { + ping.result.MinDuration = duration + } + ping.result.TotalDuration += duration + } + case <-ping.done: + return + } + } + }() + return ping.done +} + +// Result return ping result +func (ping *HTTPing) Result() *Result { + return ping.result +} + +// Stop the tcping +func (ping *HTTPing) Stop() { + ping.done <- struct{}{} +} + +func (ping HTTPing) ping() (time.Duration, *http.Response, string, error) { + var resp *http.Response + var body io.Reader + if ping.Method == "POST" { + body = bytes.NewBufferString("{}") + } + req, err := http.NewRequest(ping.Method, ping.target.String(), body) + req.Header.Set(http.CanonicalHeaderKey("User-Agent"), "tcping") + if err != nil { + return 0, nil, "", err + } + var remoteAddr string + trace := &httptrace.ClientTrace{ + ConnectStart: func(network, addr string) { + remoteAddr = addr + }, + } + req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) + duration, errIfce := timeIt(func() interface{} { + client := http.Client{Timeout: ping.target.Timeout} + resp, err = client.Do(req) + return err + }) + if errIfce != nil { + err := errIfce.(error) + return 0, nil, "", err + } + return time.Duration(duration), resp, remoteAddr, nil +} diff --git a/vtqe/tools/ping/ping.go b/vtqe/tools/ping/ping.go new file mode 100644 index 0000000..842514c --- /dev/null +++ b/vtqe/tools/ping/ping.go @@ -0,0 +1,149 @@ +package ping + +import ( + "bytes" + "fmt" + "html/template" + "regexp" + "strconv" + "strings" + "time" +) + +// Protocol ... +type Protocol int + +func (protocol Protocol) String() string { + switch protocol { + case TCP: + return "tcp" + case HTTP: + return "http" + case HTTPS: + return "https" + } + return "unkown" +} + +const ( + // TCP is tcp protocol + TCP Protocol = iota + // HTTP is http protocol + HTTP + // HTTPS is https protocol + HTTPS +) + +// NewProtocol convert protocol stirng to Protocol +func NewProtocol(protocol string) (Protocol, error) { + switch strings.ToLower(protocol) { + case TCP.String(): + return TCP, nil + case HTTP.String(): + return HTTP, nil + case HTTPS.String(): + return HTTPS, nil + } + return 0, fmt.Errorf("protocol %s not support", protocol) +} + +// Target is a ping +type Target struct { + Protocol Protocol + Host string + Port int + + Counter int + Interval time.Duration + Timeout time.Duration +} + +func (target Target) String() string { + return fmt.Sprintf("%s://%s:%d", target.Protocol, target.Host, target.Port) +} + +// Pinger is a ping interface +type Pinger interface { + Start() <-chan struct{} + Stop() + Result() *Result + SetTarget(target *Target) +} + +// Ping is a ping interface +type Ping interface { + Start() <-chan struct{} + + Host() string + Port() int + Protocol() Protocol + Counter() int + + Stop() + + Result() Result +} + +// Result ... +type Result struct { + Counter int + SuccessCounter int + Target *Target + + MinDuration time.Duration + MaxDuration time.Duration + TotalDuration time.Duration +} + +// Avg return the average time of ping +func (result Result) Avg() time.Duration { + if result.SuccessCounter == 0 { + return 0 + } + return result.TotalDuration / time.Duration(result.SuccessCounter) +} + +// Failed return failed counter +func (result Result) Failed() int { + return result.Counter - result.SuccessCounter +} + +func (result Result) String() string { + const resultTpl = ` +Ping statistics {{.Target}} + {{.Counter}} probes sent. + {{.SuccessCounter}} successful, {{.Failed}} failed. +Approximate trip times: + Minimum = {{.MinDuration}}, Maximum = {{.MaxDuration}}, Average = {{.Avg}}` + t := template.Must(template.New("result").Parse(resultTpl)) + res := bytes.NewBufferString("") + t.Execute(res, result) + return res.String() +} + +// CheckURI check uri +func CheckURI(uri string) (schema, host string, port int, matched bool) { + const reExp = `^((?P((ht|f)tp(s?))|tcp)\://)?((([a-zA-Z0-9_\-]+\.)+[a-zA-Z]{2,})|((?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)((\.?\d)\.)){4})|(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9]))(:([0-9]+))?(/[a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~]*)?$` + pattern := regexp.MustCompile(reExp) + res := pattern.FindStringSubmatch(uri) + if len(res) == 0 { + return + } + matched = true + schema = res[2] + if schema == "" { + schema = "tcp" + } + host = res[6] + if res[17] == "" { + if schema == HTTPS.String() { + port = 443 + } else { + port = 80 + } + } else { + port, _ = strconv.Atoi(res[17]) + } + + return +} diff --git a/vtqe/tools/ping/tcp.go b/vtqe/tools/ping/tcp.go new file mode 100644 index 0000000..bf5e5cf --- /dev/null +++ b/vtqe/tools/ping/tcp.go @@ -0,0 +1,102 @@ +package ping + +import ( + "fmt" + "net" + "time" +) + +// TCPing ... +type TCPing struct { + target *Target + done chan struct{} + result *Result +} + +var _ Pinger = (*TCPing)(nil) + +// NewTCPing return a new TCPing +func NewTCPing() *TCPing { + tcping := TCPing{ + done: make(chan struct{}), + } + return &tcping +} + +// SetTarget set target for TCPing +func (tcping *TCPing) SetTarget(target *Target) { + tcping.target = target + if tcping.result == nil { + tcping.result = &Result{Target: target} + } +} + +// Result return the result +func (tcping TCPing) Result() *Result { + return tcping.result +} + +// Start a tcping +func (tcping TCPing) Start() <-chan struct{} { + go func() { + t := time.NewTicker(tcping.target.Interval) + defer t.Stop() + for { + select { + case <-t.C: + if tcping.result.Counter >= tcping.target.Counter && tcping.target.Counter != 0 { + tcping.Stop() + return + } + duration, remoteAddr, err := tcping.ping() + tcping.result.Counter++ + + if err != nil { + fmt.Printf("Ping %s - failed: %s\n", tcping.target, err) + } else { + fmt.Printf("Ping %s(%s) - Connected - time=%s\n", tcping.target, remoteAddr, duration) + + if tcping.result.MinDuration == 0 { + tcping.result.MinDuration = duration + } + if tcping.result.MaxDuration == 0 { + tcping.result.MaxDuration = duration + } + tcping.result.SuccessCounter++ + if duration > tcping.result.MaxDuration { + tcping.result.MaxDuration = duration + } else if duration < tcping.result.MinDuration { + tcping.result.MinDuration = duration + } + tcping.result.TotalDuration += duration + } + case <-tcping.done: + return + } + } + }() + return tcping.done +} + +// Stop the tcping +func (tcping *TCPing) Stop() { + tcping.done <- struct{}{} +} + +func (tcping TCPing) ping() (time.Duration, net.Addr, error) { + var remoteAddr net.Addr + duration, errIfce := timeIt(func() interface{} { + conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", tcping.target.Host, tcping.target.Port), tcping.target.Timeout) + if err != nil { + return err + } + remoteAddr = conn.RemoteAddr() + conn.Close() + return nil + }) + if errIfce != nil { + err := errIfce.(error) + return 0, remoteAddr, err + } + return time.Duration(duration), remoteAddr, nil +} diff --git a/vtqe/tools/ping/utils.go b/vtqe/tools/ping/utils.go new file mode 100644 index 0000000..42c3a85 --- /dev/null +++ b/vtqe/tools/ping/utils.go @@ -0,0 +1,51 @@ +package ping + +import ( + "context" + "fmt" + "net" + "strings" + "time" +) + +func timeIt(f func() interface{}) (int64, interface{}) { + startAt := time.Now() + res := f() + endAt := time.Now() + return endAt.UnixNano() - startAt.UnixNano(), res +} + +// UseCustomeDNS will set the dns to default DNS resolver for global +func UseCustomeDNS(dns []string) { + resolver := net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, address string) (conn net.Conn, err error) { + for _, addr := range dns { + if conn, err = net.Dial("udp", addr+":53"); err != nil { + continue + } else { + return conn, nil + } + } + return + }, + } + net.DefaultResolver = &resolver +} + +// FormatIP - trim spaces and format IP +// +// IP - the provided IP +// +// string - return "" if the input is neither valid IPv4 nor valid IPv6 +// return IPv4 in format like "192.168.9.1" +// return IPv6 in format like "[2002:ac1f:91c5:1::bd59]" +func FormatIP(IP string) string { + + host := strings.Trim(IP, "[ ]") + if parseIP := net.ParseIP(host); parseIP != nil && parseIP.To4() == nil { + host = fmt.Sprintf("[%s]", host) + } + + return host +} diff --git a/vtqe/tools/ping/utils_test.go b/vtqe/tools/ping/utils_test.go new file mode 100644 index 0000000..6b164da --- /dev/null +++ b/vtqe/tools/ping/utils_test.go @@ -0,0 +1,43 @@ +package ping + + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" +) + +func TestFormatIP(t *testing.T) { + + Convey("IP", t, func() { + Convey("for v4 success", func() { + rc := FormatIP("192.168.0.1") + So(rc, ShouldEqual, "192.168.0.1") + }) + + Convey("for v4 failure", func() { + rc := FormatIP("192.0.1") + So(rc, ShouldEqual, "") + }) + + Convey("for v4 format", func() { + rc := FormatIP("[192.0.1.1] ") + So(rc, ShouldEqual, "192.0.1.1") + }) + + Convey("for v6 success", func() { + rc := FormatIP("[2002:ac1f:91c5:1::bd59]") + So(rc, ShouldEqual, "[2002:ac1f:91c5:1::bd59]") + }) + + Convey("for v6 failure", func() { + rc := FormatIP("2002:ac1f:91c5:1:") + So(rc, ShouldEqual, "") + }) + + Convey("for v6 format", func() { + rc := FormatIP("2002:ac1f:91c5:1::bd59 ") + So(rc, ShouldEqual, "[2002:ac1f:91c5:1::bd59]") + }) + }) +} diff --git a/vtqe/tools/sftp.go b/vtqe/tools/sftp.go new file mode 100644 index 0000000..9cf00c9 --- /dev/null +++ b/vtqe/tools/sftp.go @@ -0,0 +1,77 @@ +package tools + +import ( + "fmt" + "strings" + + "b612.me/sshd" + + "github.com/spf13/cobra" +) + +var sftpcmd = &cobra.Command{ + Use: "sftp", + Short: "sftp上传下载", + Long: "sftp上传下载", + Run: func(this *cobra.Command, args []string) { + d, _ := this.Flags().GetBool("download") + i, _ := this.Flags().GetString("identify") + k, _ := this.Flags().GetString("password") + p, _ := this.Flags().GetInt("port") + b, _ := this.Flags().GetInt("buffer") + var user, host string + var err error + if len(args) != 3 { + fmt.Println("sftp <[user@]Host> ") + this.Help() + return + } + hosts := strings.Split(args[0], "@") + if len(hosts) == 1 { + host = hosts[0] + user = "root" + } else { + user = hosts[0] + host = hosts[1] + } + fmt.Println("进行SSH连接……") + client, err := sshd.Connect(user, k, host, i, p, []string{}) + if err != nil { + fmt.Println(err) + return + } + defer client.Close() + fmt.Println("已连接上……") + sftp, err := sshd.CreateSftp(client) + if err != nil { + fmt.Println(err) + return + } + defer sftp.Close() + fmt.Println("已建立SFTP……") + shell := func(pect float64) { + if pect != 100.0 { + fmt.Printf("传输已完成:%f%%\r", pect) + } else { + fmt.Printf("传输已完成:%f%%\n", pect) + } + } + if !d { + err = sshd.FtpTransferOutFunc(args[1], args[2], b, shell, sftp) + } else { + err = sshd.FtpTransferInFunc(args[1], args[2], b, shell, sftp) + } + if err != nil { + fmt.Println(err) + } + }, +} + +func init() { + Maincmd.AddCommand(sftpcmd) + sftpcmd.Flags().BoolP("download", "d", false, "进行下载") + sftpcmd.Flags().StringP("identify", "i", "", "RSA登录密钥") + sftpcmd.Flags().StringP("password", "k", "", "登录密码") + sftpcmd.Flags().IntP("port", "p", 22, "登录端口") + sftpcmd.Flags().IntP("buffer", "b", 10240, "buffer大小") +} diff --git a/vtqe/tools/split.go b/vtqe/tools/split.go new file mode 100644 index 0000000..631b227 --- /dev/null +++ b/vtqe/tools/split.go @@ -0,0 +1,61 @@ +package tools + +import ( + "fmt" + "strconv" + + "b612.me/starainrt" + "b612.me/starlog" + + "github.com/spf13/cobra" +) + +var splitcmd = &cobra.Command{ + Use: "split", + Short: "分割文件", + Long: "按字节或文件数分割文件", + Run: func(this *cobra.Command, args []string) { + var src, dst string + var num int + if len(args) == 3 { + src = args[0] + dst = args[1] + num, _ = strconv.Atoi(args[2]) + } else { + src, _ = this.Flags().GetString("src") + dst, _ = this.Flags().GetString("dst") + num, _ = this.Flags().GetInt("num") + } + if !starainrt.Exists(src) { + starlog.Println("源文件不存在", "red", "b") + this.Help() + return + } + if num == 0 { + starlog.Println("参数num不合法", "red", "b") + this.Help() + return + } + crypto := new(starainrt.StarCrypto) + ok, _ := this.Flags().GetBool("byte") + err := crypto.SplitFile(src, dst, num, !ok, func(pect float64) { + if pect == 100 { + fmt.Println("文件已处理:100.000000%") + } else { + fmt.Printf("文件已处理:%f%%\r", pect) + } + }) + if err != nil { + starlog.Println(err.Error, "red", "") + } + + }, +} + +func init() { + splitcmd.Flags().StringP("src", "s", "", "源文件地址") + splitcmd.Flags().StringP("dst", "d", "./split*.vicque", "目标文件地址,用*替换文件数字") + splitcmd.Flags().BoolP("byte", "b", false, "按byte分割") + splitcmd.Flags().IntP("num", "n", 0, "分割数/byte数") + Maincmd.AddCommand(splitcmd) +} diff --git a/vtqe/tools/tcping.go b/vtqe/tools/tcping.go new file mode 100644 index 0000000..4800334 --- /dev/null +++ b/vtqe/tools/tcping.go @@ -0,0 +1,181 @@ +package tools + +import ( + "fmt" + "os" + "os/signal" + "syscall" + "time" + + "strconv" + + "victorique/vtqe/tools/ping" + + "github.com/spf13/cobra" +) + +var ( + showVersion bool + version string + gitCommit string + counter int + timeout string + interval string + sigs chan os.Signal + + httpMode bool + httpHead bool + httpPost bool + httpUA string + + dnsServer []string +) + +var tcpingcmd = &cobra.Command{ + Use: "tcping", + Short: "tcp ping", + Long: "进行Tcping", + Example: ` + 1. ping over tcp + > tcping google.com + 2. ping over tcp with custom port + > tcping google.com 443 + 3. ping over http + > tcping -H google.com + 4. ping with URI schema + > tcping http://hui.lu + `, + Run: func(cmd *cobra.Command, args []string) { + sigs = make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + if showVersion { + fmt.Printf("version: %s\n", version) + fmt.Printf("git: %s\n", gitCommit) + return + } + if len(args) != 2 && len(args) != 1 { + cmd.Usage() + return + } + host := args[0] + + var ( + err error + port int + schema string + ) + if len(args) == 2 { + port, err = strconv.Atoi(args[1]) + if err != nil { + fmt.Println("端口应当为Int类型") + cmd.Usage() + return + } + schema = ping.TCP.String() + } else { + var matched bool + schema, host, port, matched = ping.CheckURI(host) + if !matched { + fmt.Println("不是一个合法的URI") + cmd.Usage() + return + } + } + var timeoutDuration time.Duration + if res, err := strconv.Atoi(timeout); err == nil { + timeoutDuration = time.Duration(res) * time.Millisecond + } else { + timeoutDuration, err = time.ParseDuration(timeout) + if err != nil { + fmt.Println("parse timeout failed", err) + cmd.Usage() + return + } + } + + var intervalDuration time.Duration + if res, err := strconv.Atoi(interval); err == nil { + intervalDuration = time.Duration(res) * time.Millisecond + } else { + intervalDuration, err = time.ParseDuration(interval) + if err != nil { + fmt.Println("parse interval failed", err) + cmd.Usage() + return + } + } + var protocol ping.Protocol + if httpMode { + protocol = ping.HTTP + } else { + protocol, err = ping.NewProtocol(schema) + if err != nil { + fmt.Println(err) + cmd.Usage() + return + } + } + if len(dnsServer) != 0 { + ping.UseCustomeDNS(dnsServer) + } + + parseHost := ping.FormatIP(host) + target := ping.Target{ + Timeout: timeoutDuration, + Interval: intervalDuration, + Host: parseHost, + Port: port, + Counter: counter, + Protocol: protocol, + } + var pinger ping.Pinger + switch protocol { + case ping.TCP: + pinger = ping.NewTCPing() + case ping.HTTP, ping.HTTPS: + var httpMethod string + switch { + case httpHead: + httpMethod = "HEAD" + case httpPost: + httpMethod = "POST" + default: + httpMethod = "GET" + } + pinger = ping.NewHTTPing(httpMethod) + default: + fmt.Printf("schema: %s not support\n", schema) + cmd.Usage() + return + } + pinger.SetTarget(&target) + pingerDone := pinger.Start() + select { + case <-pingerDone: + break + case <-sigs: + break + } + + fmt.Println(pinger.Result()) + }, +} + +func init() { + tcpingcmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit") + tcpingcmd.Flags().IntVarP(&counter, "counter", "c", 4, "ping的次数") + tcpingcmd.Flags().StringVarP(&timeout, "timeout", "T", "1s", `超时时间, 单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h"`) + tcpingcmd.Flags().StringVarP(&interval, "interval", "I", "1s", `ping间隔时间, 单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h"`) + + tcpingcmd.Flags().BoolVarP(&httpMode, "http", "H", false, `Use "HTTP" mode. will ignore URI Schema, force to http`) + tcpingcmd.Flags().BoolVar(&httpHead, "head", false, `使用http head模式`) + tcpingcmd.Flags().BoolVar(&httpPost, "post", false, `使用http post模式`) + tcpingcmd.Flags().StringVar(&httpUA, "user-agent", "tcping", `自定义UA`) + + tcpingcmd.Flags().StringArrayVarP(&dnsServer, "dns-server", "D", nil, `使用自定义DNS服务器`) + +} + +func init() { + Maincmd.AddCommand(tcpingcmd) +} diff --git a/vtqe/tools/uac.go b/vtqe/tools/uac.go new file mode 100644 index 0000000..07a6ea7 --- /dev/null +++ b/vtqe/tools/uac.go @@ -0,0 +1,33 @@ +// +build windows + +package tools + +import ( + "os" + + "b612.me/wincmd" + "github.com/spf13/cobra" +) + +var uaccmd = &cobra.Command{ + Use: "uac", + Short: "Windows 使用uac权限打开文件", + Long: "Windows 使用uac权限打开文件", + Run: func(this *cobra.Command, args []string) { + if len(args) == 0 { + return + } + cmdLine := "" + if len(args) > 1 { + for _, v := range args[1:] { + cmdLine += v + " " + } + } + pwd, _ := os.Getwd() + wincmd.StartProcess(args[0], cmdLine, pwd, true, 1) + }, +} + +func init() { + Maincmd.AddCommand(uaccmd) +} diff --git a/vtqe/tools/vic.go b/vtqe/tools/vic.go new file mode 100644 index 0000000..f68e145 --- /dev/null +++ b/vtqe/tools/vic.go @@ -0,0 +1,97 @@ +package tools + +import ( + "fmt" + "os" + "regexp" + + "b612.me/starainrt" + "b612.me/starlog" + "github.com/spf13/cobra" +) + +var viccmd = &cobra.Command{ + Use: "vicque", + Short: "嵐を乗り越えて", + Long: "ほら!嵐を乗り越えて", + Run: func(this *cobra.Command, args []string) { + var err error + ok, _ := this.Flags().GetBool("file") + de, _ := this.Flags().GetBool("decode") + pwd, _ := this.Flags().GetString("key") + rep, _ := this.Flags().GetBool("replace") + ext, _ := this.Flags().GetBool("extension") + if len(args) != 2 { + if len(args) < 2 || args[1] != "sakura" { + starlog.Println("ヴィクトリカだけが使えるよ", "red", "b") + return + } + } + shell := func(pect float64) { + if pect == 100 { + fmt.Println("已处理:100.000000%") + } else { + fmt.Printf("已处理:%f%%\r", pect) + } + } + cry := new(starainrt.StarCrypto) + if ok { + path, _ := this.Flags().GetString("path") + if !de { + err = cry.VicqueEncodeV1File(args[0], path, pwd, shell) + if err == nil { + if rep { + os.Remove(args[0]) + os.Rename(path, args[0]) + path = args[0] + } + if ext { + os.Rename(path, path+".victorique") + } + } + } else { + err = cry.VicqueDecodeV1File(args[0], path, pwd, shell) + if err == nil { + if rep { + os.Remove(args[0]) + os.Rename(path, args[0]) + path = args[0] + } + if ext { + reg := regexp.MustCompile(`(.*?)\.victorique$`) + if reg.MatchString(path) { + paths := reg.FindStringSubmatch(path) + os.Rename(path, paths[1]) + } + } + } + } + } else { + if !de { + data := cry.VicqueEncodeV1([]byte(args[0]), pwd) + fmt.Println(data) + fmt.Println(cry.Base64Encode(data)) + } else { + var data []byte + src, _ := cry.Base64Decode(args[0]) + data = cry.VicqueDecodeV1(src, pwd) + fmt.Println(string(data)) + } + } + if err != nil { + starlog.Println(err, "red", "b") + return + } + }, +} + +func init() { + viccmd.Flags().BoolP("file", "f", false, "VICQUE处理文件") + viccmd.Flags().StringP("path", "p", "./v64.encode", "指定处理地址,默认为./v64.encode") + viccmd.Flags().BoolP("decode", "d", false, "VICQUE解码") + viccmd.Flags().StringP("key", "k", "", "密钥") + viccmd.Flags().BoolP("replace", "r", false, "覆盖原文件") + viccmd.Flags().BoolP("extension", "e", false, "添加/取消.victorique后缀") + viccmd.MarkFlagRequired("key") + Maincmd.AddCommand(viccmd) +}