17 Commits

Author SHA1 Message Date
b612 382badb0cc fix mime bug which will make server not recognize filename without dot 2020-08-21 14:16:32 +08:00
b612 9e7ad45f06 v1.0.0rc1 update 2020-08-21 10:48:02 +08:00
b612 4a8458fab6 save 2020-08-13 17:40:54 +08:00
b612 7835d1fae7 save 2020-08-13 14:33:05 +08:00
b612 f89188761d new gen 2020-08-13 14:02:33 +08:00
b612 f8bcc2c171 version 0.1.25 2020-08-13 13:45:27 +08:00
b612 4b69d2b8bf 支持断点续传 2020-03-07 13:12:45 +08:00
b612 874012fe56 bug fix 2019-09-13 14:54:07 +08:00
b612 7c2dab6aa6 Add TCP/UDP Forward/Nat 2019-09-12 17:29:49 +08:00
b612 6c66e84a86 修正curl上传标识不清 2019-09-07 13:37:22 +08:00
b612 eec673f640 修复windows向Linux传输发生文件夹错误 2019-09-06 10:26:03 +08:00
b612 196a469c34 tcp传输不再丢包 2019-09-05 22:21:39 +08:00
b612 7d30c2ddc9 修复tcp传输分界问题 2019-09-05 20:25:12 +08:00
b612 dc32f808cf add tcp/udp mode 2019-09-05 17:23:50 +08:00
b612 e27f6d4006 fix path error at http 2019-09-04 17:17:41 +08:00
b612 cb997cc49c fix path error at http2 2019-09-04 16:37:03 +08:00
b612 d3e6058862 fix path error at http 2019-09-04 16:26:39 +08:00
36 changed files with 4547 additions and 417 deletions
+1
View File
@@ -0,0 +1 @@
package main
+90
View File
@@ -0,0 +1,90 @@
package aeschiper
import (
"errors"
"fmt"
"io"
"os"
"b612.me/starcrypto"
"b612.me/staros"
)
func EncodeStr(str, key string) string {
ensdata := starcrypto.AesEncryptCFBNoBlock([]byte(str), starcrypto.Md5([]byte(key)))
return starcrypto.Base91EncodeToString(ensdata)
}
func DecodeStr(str, key string) string {
strtmp := starcrypto.Base91DecodeString(str)
str = string(strtmp)
return string(starcrypto.AesDecryptCFBNoBlock([]byte(str), starcrypto.Md5([]byte(key))))
}
func EncodeFile(fpath, out, key string) error {
if !staros.Exists(fpath) {
return errors.New("SrcFile Not Exists")
}
fpsrc, err := os.Open(fpath)
if err != nil {
return err
}
defer fpsrc.Close()
fpdst, err := os.Create(out)
if err != nil {
return err
}
defer fpdst.Close()
bufsize := 1024 * 1024 //1MB
stat, _ := fpsrc.Stat()
buf := make([]byte, bufsize)
sumAll := 0
for {
n, err := fpsrc.Read(buf)
if err != nil && err != io.EOF {
return err
}
fmt.Print("已完成:%.2f%%\r", float64(sumAll)/float64(stat.Size())*100)
encodeBytes := starcrypto.AesEncryptCFBNoBlock(buf[:n], starcrypto.Md5([]byte(key)))
fpdst.Write(encodeBytes)
if err == io.EOF {
fmt.Print("已完成:100%% \n")
break
}
}
return nil
}
func DecodeFile(fpath, out, key string) error {
if !staros.Exists(fpath) {
return errors.New("SrcFile Not Exists")
}
fpsrc, err := os.Open(fpath)
if err != nil {
return err
}
defer fpsrc.Close()
fpdst, err := os.Create(out)
if err != nil {
return err
}
defer fpdst.Close()
bufsize := 1024 * 1024 //1MB
stat, _ := fpsrc.Stat()
buf := make([]byte, bufsize)
sumAll := 0
for {
n, err := fpsrc.Read(buf)
if err != nil && err != io.EOF {
return err
}
fmt.Print("已完成:%.2f%%\r", float64(sumAll)/float64(stat.Size())*100)
encodeBytes := starcrypto.AesDecryptCFBNoBlock(buf[:n], starcrypto.Md5([]byte(key)))
fpdst.Write(encodeBytes)
if err == io.EOF {
fmt.Print("已完成:100%% \n")
break
}
}
return nil
}
+14
View File
@@ -0,0 +1,14 @@
package aeschiper
import (
"fmt"
"testing"
)
func Test_EncodeStr(t *testing.T) {
fmt.Println(EncodeStr("我喜欢你", "sakurasaiteruyogugugug"))
}
func Test_DecodeStr(t *testing.T) {
fmt.Println(DecodeStr("Z_8aILbog@Kjm$P", "sakurasaiteruyogugugug"))
}
+78
View File
@@ -0,0 +1,78 @@
package main
import (
"io"
"os"
"b612.me/starlog"
"github.com/spf13/cobra"
)
var attachcmd = &cobra.Command{
Use: "attach",
Short: "合并多个文件",
Long: "合并多个文件",
Run: func(this *cobra.Command, args []string) {
src, _ := this.Flags().GetStringArray("src")
out, _ := this.Flags().GetString("out")
if len(src) < 2 || out == "" {
starlog.Criticalln("请输入至少2个输入路径,一个输出路径")
os.Exit(1)
}
os.Exit(runAttach(src, out))
},
}
func runAttach(src []string, out string) int {
fpOut, err := os.Create(out)
if err != nil {
starlog.Errorln("Err:无法创建输出文件!", err)
return 2
}
defer fpOut.Close()
for _, file := range src {
fpFile, err := os.OpenFile(file, os.O_RDONLY, 0644)
if err != nil {
starlog.Errorln("Err:Cannot Openfile:", err)
return 3
}
stats, err := fpFile.Stat()
if err != nil {
starlog.Errorln("Err:Cannot Get File Stats:", err)
return 4
}
if stats.Size() == 0 {
starlog.Warningf("文件:%s为空文件,跳过!\n", stats.Name())
continue
}
buf := make([]byte, 65535)
sumAll := 0
for {
n, err := fpFile.Read(buf)
if err != nil && err != io.EOF {
starlog.Errorln("Err:Error Occured While ReadFile:", err)
fpFile.Close()
return 5
}
sumAll += n
_, errW := fpOut.Write(buf[:n])
if errW != nil {
starlog.Errorln("Error While Write Data to OutFile", errW)
return 6
}
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "文件%s,已完成:%.2f%%\r", stats.Name(), (float64(sumAll) / float64(stats.Size()) * 100.0000))
if err == io.EOF {
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "文件:%v,已完成:100.00%% \n", stats.Name())
fpFile.Close()
break
}
}
}
starlog.StdPrintln([]starlog.Attr{starlog.FgGreen}, "Ok!文件合并完成")
return 0
}
func init() {
attachcmd.Flags().StringArrayP("src", "s", []string{}, "源文件路径")
attachcmd.Flags().StringP("out", "o", "", "输出文件路径")
}
+8 -10
View File
@@ -1,9 +1,9 @@
package tools package main
import ( import (
"fmt" "fmt"
"b612.me/starainrt" "b612.me/starcrypto"
"b612.me/starlog" "b612.me/starlog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@@ -17,7 +17,7 @@ var b64cmd = &cobra.Command{
ok, _ := this.Flags().GetBool("file") ok, _ := this.Flags().GetBool("file")
de, _ := this.Flags().GetBool("decode") de, _ := this.Flags().GetBool("decode")
if len(args) != 1 { if len(args) != 1 {
starlog.Println("参数不足,请输入文件地址或字符串", "red", "b") starlog.Criticalln("参数不足,请输入文件地址或字符串")
this.Help() this.Help()
return return
} }
@@ -28,26 +28,25 @@ var b64cmd = &cobra.Command{
fmt.Printf("已处理:%f%%\r", pect) fmt.Printf("已处理:%f%%\r", pect)
} }
} }
cry := new(starainrt.StarCrypto)
if ok { if ok {
path, _ := this.Flags().GetString("path") path, _ := this.Flags().GetString("path")
if !de { if !de {
err = cry.Base64EncodeFile(args[0], path, shell) err = starcrypto.Base64EncodeFile(args[0], path, shell)
} else { } else {
err = cry.Base64DecodeFile(args[0], path, shell) err = starcrypto.Base64DecodeFile(args[0], path, shell)
} }
} else { } else {
if !de { if !de {
data := cry.Base64Encode([]byte(args[0])) data := starcrypto.Base64Encode([]byte(args[0]))
fmt.Println(data) fmt.Println(data)
} else { } else {
var data []byte var data []byte
data, err = cry.Base64Decode(args[0]) data, err = starcrypto.Base64Decode(args[0])
fmt.Println(string(data)) fmt.Println(string(data))
} }
} }
if err != nil { if err != nil {
starlog.Println(err, "red", "b") starlog.Criticalln(err)
return return
} }
}, },
@@ -57,5 +56,4 @@ func init() {
b64cmd.Flags().BoolP("file", "f", false, "base64处理文件") b64cmd.Flags().BoolP("file", "f", false, "base64处理文件")
b64cmd.Flags().StringP("path", "p", "./b64.encode", "指定处理地址,默认为./b64.encode") b64cmd.Flags().StringP("path", "p", "./b64.encode", "指定处理地址,默认为./b64.encode")
b64cmd.Flags().BoolP("decode", "d", false, "base64解码") b64cmd.Flags().BoolP("decode", "d", false, "base64解码")
Maincmd.AddCommand(b64cmd)
} }
-9
View File
@@ -1,9 +0,0 @@
package main
import (
"Victorique/vtqe/tools"
)
func main() {
tools.Maincmd.Execute()
}
+6 -5
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -73,7 +73,7 @@ var curlcmd = &cobra.Command{
if h != "" { if h != "" {
head := strings.Split(h, ",") head := strings.Split(h, ",")
for _, v := range head { for _, v := range head {
hp := strings.Split(v, "=") hp := strings.Split(v, ":")
if len(hp) != 2 { if len(hp) != 2 {
continue continue
} }
@@ -168,7 +168,6 @@ var curlcmd = &cobra.Command{
} }
func init() { func init() {
Maincmd.AddCommand(curlcmd)
curlcmd.Flags().StringP("output", "o", "", "写入文件而不是标准输出") curlcmd.Flags().StringP("output", "o", "", "写入文件而不是标准输出")
curlcmd.Flags().StringP("data", "d", "", "http postdata数据") curlcmd.Flags().StringP("data", "d", "", "http postdata数据")
curlcmd.Flags().StringP("file", "f", "", "上传文件的地址") curlcmd.Flags().StringP("file", "f", "", "上传文件的地址")
@@ -180,6 +179,7 @@ func init() {
curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间") curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间")
curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间") curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间")
curlcmd.Flags().StringP("user-agent", "A", "", "UA设置") curlcmd.Flags().StringP("user-agent", "A", "", "UA设置")
curlupcmd.Flags().StringP("address", "a", "", "远端ip:端口号")
curlcmd.AddCommand(curlupcmd) curlcmd.AddCommand(curlupcmd)
} }
@@ -188,10 +188,11 @@ var curlupcmd = &cobra.Command{
Short: "victorique上传工具", Short: "victorique上传工具",
Long: "victorique上传工具", Long: "victorique上传工具",
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
if len(args) != 2 { if len(args) != 1 {
fmt.Println(args, "不合法啊") fmt.Println(args, "不合法啊")
return return
} }
a, _ := this.Flags().GetString("address")
curl := starainrt.NewStarCurl() curl := starainrt.NewStarCurl()
curl.TimeOut = 0 curl.TimeOut = 0
shell := func(pect float64) { shell := func(pect float64) {
@@ -201,7 +202,7 @@ var curlupcmd = &cobra.Command{
fmt.Printf("已完成:%f%%\r", pect) fmt.Printf("已完成:%f%%\r", pect)
} }
} }
data, err := curl.CurlWithFile("http://"+args[0]+"/vtqeupload1127", nil, "victorique", args[1], "", false, shell) data, err := curl.CurlWithFile("http://"+a+"/vtqeupload1127", nil, "victorique", args[0], "", false, shell)
fmt.Println(string(data)) fmt.Println(string(data))
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
+3 -4
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -25,14 +25,14 @@ var detachcmd = &cobra.Command{
} }
num, _ := this.Flags().GetInt("num") num, _ := this.Flags().GetInt("num")
if src == "" || dst == "" { if src == "" || dst == "" {
starlog.Println("ERROR PATH", "red", "b") starlog.Criticalln("ERROR PATH")
this.Help() this.Help()
return return
} }
cryp := new(starainrt.StarCrypto) cryp := new(starainrt.StarCrypto)
err := cryp.Detach(src, num, dst, out) err := cryp.Detach(src, num, dst, out)
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "b") starlog.Criticalln(err.Error)
} else { } else {
fmt.Println("完成") fmt.Println("完成")
} }
@@ -44,5 +44,4 @@ func init() {
detachcmd.Flags().StringP("dst", "d", "", "目标文件路径1") detachcmd.Flags().StringP("dst", "d", "", "目标文件路径1")
detachcmd.Flags().StringP("out", "o", "", "目标文件路径2") detachcmd.Flags().StringP("out", "o", "", "目标文件路径2")
detachcmd.Flags().IntP("num", "n", 0, "分割开始字节") detachcmd.Flags().IntP("num", "n", 0, "分割开始字节")
Maincmd.AddCommand(detachcmd)
} }
+2 -2
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"log" "log"
@@ -11,6 +11,7 @@ import (
var ports int var ports int
var username, pwd string var username, pwd string
var path, ip string
// ftpCmd represents the ftp command // ftpCmd represents the ftp command
var ftpcmd = &cobra.Command{ var ftpcmd = &cobra.Command{
@@ -41,7 +42,6 @@ var ftpcmd = &cobra.Command{
} }
func init() { func init() {
Maincmd.AddCommand(ftpcmd)
ftpcmd.Flags().IntVarP(&ports, "port", "p", 21, "监听端口") ftpcmd.Flags().IntVarP(&ports, "port", "p", 21, "监听端口")
ftpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听地址") ftpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听地址")
ftpcmd.Flags().StringVarP(&username, "user", "u", "1", "用户名,默认为1") ftpcmd.Flags().StringVarP(&username, "user", "u", "1", "用户名,默认为1")
+21 -8
View File
@@ -1,7 +1,9 @@
package tools package main
import ( import (
"fmt" "fmt"
"os"
"time"
"b612.me/starainrt" "b612.me/starainrt"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -14,26 +16,37 @@ var gencmd = &cobra.Command{
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
sum, _ := this.Flags().GetInt("sum") sum, _ := this.Flags().GetInt("sum")
num, _ := this.Flags().GetInt("num") num, _ := this.Flags().GetInt("num")
cap, _ := this.Flags().GetInt("cap")
if len(args) != 1 { if len(args) != 1 {
this.Help() this.Help()
return return
} }
err := starainrt.FillWithRandom(args[0], num, 1024*1024, sum, func(pect float64) { if num <= 0 {
if pect == 100 { fmt.Println("num不合法,不应该小于1")
fmt.Println("文件已处理:100.000000%") os.Exit(2)
} else { }
fmt.Printf("文件已处理:%f%%\r", pect) if sum <= 0 {
} fmt.Println("sum不合法,不应该小于1")
os.Exit(2)
}
if cap <= 0 {
fmt.Println("cap不合法,不应该小于1")
os.Exit(2)
}
err := starainrt.FillWithRandom(args[0], num, cap, sum, func(pect float64) {
fmt.Printf("文件已处理:%f%%\r", pect)
}) })
if err != nil { if err != nil {
fmt.Println("err:" + err.Error()) fmt.Println("err:" + err.Error())
} }
fmt.Println("文件已处理:100.0000000%")
time.Sleep(time.Millisecond * 10)
}, },
} }
func init() { func init() {
gencmd.Flags().IntP("sum", "s", 3, "随机的种子组数") gencmd.Flags().IntP("sum", "s", 3, "随机的种子组数")
gencmd.Flags().IntP("num", "n", 1024, "生成的文件大小") gencmd.Flags().IntP("num", "n", 1024, "生成的文件大小")
gencmd.Flags().IntP("cap", "c", 1048576, "bufcap大小")
gencmd.MarkFlagRequired("num") gencmd.MarkFlagRequired("num")
Maincmd.AddCommand(gencmd)
} }
+2 -3
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -49,7 +49,7 @@ var hashcmd = &cobra.Command{
result, err = crypto.SumAll([]byte(args[0]), method) result, err = crypto.SumAll([]byte(args[0]), method)
} }
if err != nil { if err != nil {
starlog.Println("错误:"+err.Error(), "red", "") starlog.Criticalln("错误:" + err.Error())
} }
for _, v := range method { for _, v := range method {
fmt.Printf("%s%s\n", v, result[v]) fmt.Printf("%s%s\n", v, result[v])
@@ -67,5 +67,4 @@ func init() {
hashcmd.Flags().Bool("sha256", false, "进行SHA256校验") hashcmd.Flags().Bool("sha256", false, "进行SHA256校验")
hashcmd.Flags().Bool("sha224", false, "进行SHA224校验") hashcmd.Flags().Bool("sha224", false, "进行SHA224校验")
hashcmd.Flags().Bool("sha1", false, "进行SHA1校验") hashcmd.Flags().Bool("sha1", false, "进行SHA1校验")
Maincmd.AddCommand(hashcmd)
} }
+93
View File
@@ -0,0 +1,93 @@
package main
import (
"Victorique/vtqe/httpserver"
"os"
"os/signal"
"syscall"
"b612.me/starlog"
"b612.me/staros"
"github.com/spf13/cobra"
)
var httpPort, httpIP, httpPath, httpBasicAuth, httpCertKey, logPath, httpIndexFile string
var doUpload, daemon, httpStopMime bool
func init() {
httpcmd.Flags().StringVarP(&httpPort, "port", "p", "80", "监听端口")
httpcmd.Flags().StringVarP(&httpIP, "ip", "i", "0.0.0.0", "监听ip")
httpcmd.Flags().StringVarP(&httpPath, "folder", "f", "./", "本地文件地址")
httpcmd.Flags().BoolVarP(&doUpload, "upload", "u", false, "是否开启文件上传")
httpcmd.Flags().BoolVarP(&daemon, "daemon", "d", false, "以后台进程运行")
httpcmd.Flags().StringVarP(&httpBasicAuth, "auth", "a", "", "HTTP BASIC AUTH认证(用户名:密码)")
httpcmd.Flags().StringVarP(&httpIndexFile, "index", "n", "", "Index文件名,如index.html")
httpcmd.Flags().StringVarP(&logPath, "log", "l", "", "log地址")
httpcmd.Flags().StringVarP(&httpCertKey, "cert", "c", "", "TLS证书路径,用:分割证书与密钥")
httpcmd.Flags().BoolVarP(&httpStopMime, "disablemime", "m", false, "停止解析MIME,全部按下载文件处理")
httpcmd.Flags().Bool("daeapplied", false, "")
httpcmd.Flags().MarkHidden("daeapplied")
}
// httpCmd represents the http command
var httpcmd = &cobra.Command{
Use: "http",
Short: "HTTP文件服务器",
Long: `HTTP文件服务器`,
Run: func(cmd *cobra.Command, args []string) {
apply, _ := cmd.Flags().GetBool("daeapplied")
if daemon && !apply {
nArgs := append(os.Args[1:], "--daeapplied")
pid, err := staros.Daemon(os.Args[0], nArgs...)
if err != nil {
starlog.Criticalln("Daemon Error:", err)
os.Exit(1)
}
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "Success,PID=%v\n", pid)
return
}
err := run()
if err != nil {
starlog.Errorln("Http Server Closed by Errors")
os.Exit(4)
}
starlog.Infoln("Http Server Closed Normally")
return
},
}
func run() error {
if logPath != "" {
if !staros.Exists(logPath) {
err := starlog.SetLogFile(logPath)
if err != nil {
starlog.Errorln("Create LogFile Failed:", err)
os.Exit(2)
}
defer starlog.Close()
} else {
logFp, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND, 0755)
if err != nil {
starlog.Errorln("Create LogFile Failed:", err)
os.Exit(2)
}
defer logFp.Close()
starlog.Std.SwitchOut(logFp)
}
}
stopChan := make(chan os.Signal, 1)
overChan := make(chan error)
signal.Notify(stopChan, syscall.SIGINT, syscall.SIGKILL)
go func(stop chan<- error) {
err := httpserver.RunHttpServer(httpIP, httpPort, httpBasicAuth, httpPath, httpCertKey, vtqe_version, httpIndexFile, doUpload, httpStopMime)
stop <- err
}(overChan)
select {
case <-stopChan:
return nil
case err := <-overChan:
return err
}
}
+314
View File
@@ -0,0 +1,314 @@
package httpserver
import (
"encoding/base64"
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"b612.me/starcrypto"
"b612.me/starlog"
"b612.me/staros"
)
type VtqeHttpServer struct {
basicAuth string
path string
upload bool
version string
indexFile string
stopMime bool
}
func RunHttpServer(listenIp, port, auth, folderPath, certKey, version, indexFile string, doUpload, stopMime bool) error {
var err error
var vtqe VtqeHttpServer = VtqeHttpServer{auth, folderPath, doUpload, version, indexFile, stopMime}
http.HandleFunc("/", vtqe.httpListen)
starlog.Noticeln("Listening On " + listenIp + ":" + port)
if doUpload {
starlog.Noticeln("upload is openned,path is /vtqeupload1127")
http.HandleFunc("/vtqeupload1127", vtqe.uploadFile)
}
if certKey == "" {
err = http.ListenAndServe(listenIp+":"+port, nil)
} else {
certs := strings.Split(certKey, ":")
if len(certs) != 2 {
starlog.Criticalln("证书不正确!")
return errors.New("ZSBZQ")
}
err = http.ListenAndServeTLS(listenIp+":"+port, certs[0], certs[1], nil)
}
if err != nil {
starlog.Criticalln("Error:" + err.Error())
return err
}
return nil
}
func (v VtqeHttpServer) httpListen(w http.ResponseWriter, r *http.Request) {
log := starlog.Std.NewFlag()
w.Header().Set("Server", "Victorique")
w.Header().Set("Powered", "B612.ME")
write401 := func() {
w.Header().Set("WWW-Authenticate", ` Basic realm="Please Enter Passwd"`)
w.WriteHeader(401)
w.Write([]byte(`
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>B612 HTTP SERVER</center>
</body>
</html>`))
}
if v.basicAuth != "" {
authHeader := strings.TrimSpace(r.Header.Get("Authorization"))
if len(authHeader) == 0 {
log.Noticeln("No Authed! Get Path is", r.URL.Path, r.RemoteAddr)
write401()
return
} else {
userAuth := base64.StdEncoding.EncodeToString([]byte(v.basicAuth))
authStr := strings.Split(authHeader, " ")
if strings.TrimSpace(authStr[1]) != userAuth {
log.Noticeln("Auth Failed! Get Path is", r.URL.Path, r.RemoteAddr, "pwd enter is", authHeader)
write401()
return
}
}
}
p := r.URL.Path
cmd := r.URL.Query()["cmd"]
fullpath, _ := filepath.Abs(v.path + p)
if p == "/" && v.indexFile != "" {
tmppath, _ := filepath.Abs(v.path + "/" + v.indexFile)
if staros.Exists(tmppath) {
fullpath = tmppath
p = "/" + v.indexFile
}
}
log.Noticeln("Get " + p + " " + r.RemoteAddr)
if p == "/" {
v.readFolder(w, r, fullpath, true)
return
}
if v.upload {
if p == "/vtqeupload1127/web" {
w.Write([]byte(`<html><body><form id= "uploadForm" action= "../vtqeupload1127" method= "post" enctype ="multipart/form-data">
<h1 >B612 File Upload Page </h1>
<p >上传文件: <input type ="file" name="victorique" /></p>
<input type ="submit" value="上传"/>
</form>
<h2>Copyright@b612.me </h2></body></html>`))
return
}
}
if !staros.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("<h1>404 NOT FOUND</h1>"))
return
}
if staros.IsFolder(fullpath) {
v.readFolder(w, r, fullpath, false)
return
}
fpdst, err := os.Open(fullpath)
if err != nil {
log.Errorln(err)
w.WriteHeader(403)
w.Write([]byte("<h1>403 NO ACCESS</h1>"))
return
}
fpinfo, _ := os.Stat(fullpath)
name := filepath.Base(fullpath)
ext := filepath.Ext(name)
mime := GetMIME(ext)
if mime == "" || v.stopMime {
w.Header().Set("Content-Type", "application/download")
w.Header().Set("Content-Disposition", "attachment;filename="+name)
w.Header().Set("Content-Transfer-Encoding", "binary")
} else {
w.Header().Set("Content-Type", mime)
}
etag := starcrypto.Md5Str([]byte(fpinfo.ModTime().String()))
w.Header().Set("Accept-Ranges", "bytes")
w.Header().Set("ETag", etag)
w.Header().Set("Last-Modified", strings.ReplaceAll(fpinfo.ModTime().UTC().Format("Mon, 2 Jan 2006 15:04:05 MST"), "UTC", "GMT"))
isRange := false
var rangeStart, rangeEnd int64
rangeEnd = -1
for k, v := range r.Header {
if strings.ToLower(k) == "range" {
if strings.Index(v[0], "bytes=") < 0 {
break
}
v[0] = strings.Replace(v[0], "bytes=", "", -1)
data := strings.Split(v[0], "-")
if len(data) == 0 {
break
}
rangeStart, _ = strconv.ParseInt(data[0], 10, 64)
if len(data) == 2 {
rangeEnd, _ = strconv.ParseInt(data[1], 10, 64)
}
//w.WriteHeader(206) //206 支持断点续传
isRange = true
break
}
}
defer fpdst.Close()
var transferData int
if !isRange {
w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size(), 10))
w.WriteHeader(200)
for {
buf := make([]byte, 1048576)
n, err := fpdst.Read(buf)
if n != 0 {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
}
if err != nil {
if err == io.EOF {
break
}
break
}
}
} else {
w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size(), 10))
if rangeEnd == -1 {
w.Header().Set("Content-Range", `bytes `+strconv.FormatInt(rangeStart, 10)+"-"+strconv.FormatInt(fpinfo.Size(), 10)+"/"+strconv.FormatInt(fpinfo.Size(), 10))
//w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size()-rangeStart, 10))
} else {
w.Header().Set("Content-Range", `bytes `+strconv.FormatInt(rangeStart, 10)+"-"+strconv.FormatInt(rangeEnd, 10)+"/"+strconv.FormatInt(fpinfo.Size(), 10))
//w.Header().Set("Content-Length", strconv.FormatInt(1+rangeEnd-rangeStart, 10))
}
w.WriteHeader(206)
fpdst.Seek(int64(rangeStart), 0)
count := rangeStart
for {
buf := make([]byte, 1048576)
n, err := fpdst.Read(buf)
if err != nil {
if err == io.EOF {
break
}
return
}
if rangeEnd == -1 {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
} else {
if count > rangeEnd {
break
}
if count+int64(n) > rangeEnd {
w.Write(buf[0 : rangeEnd-count+1])
break
} else {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
count += int64(n)
}
}
}
}
var tani string
tani = fmt.Sprintf("%v Byte", transferData)
if f64 := float64(transferData) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v KB", f64)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v MB", f64)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v GB", f64)
}
}
}
log.Infoln(fpinfo.Name(), "客户端下载已结束,共传输大小:"+tani)
}
func (v VtqeHttpServer) readFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot bool) {
dir, err := ioutil.ReadDir(fullpath)
if err != nil {
starlog.Errorln(err)
w.WriteHeader(403)
w.Write([]byte("<h1>May Cannot Access!</h1>"))
}
w.Write([]byte("<html>\n<style>\np{margin: 2px auto}\n</style>\n<h1>B612 Http Server - " + v.version + "</h1>"))
if v.upload {
w.Write([]byte("<a href=/vtqeupload1127/web>Upload Web Page Is Openned!</a><br /><br />"))
}
w.Write([]byte("<hr /><pre>\n"))
if r.URL.Path == "/" {
r.URL.Path = ""
} else if r.URL.Path[len(r.URL.Path)-1:] == "/" {
r.URL.Path = r.URL.Path[0 : len(r.URL.Path)-1]
}
if !isroot {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", r.URL.Path+"/..", "..", "上层文件夹")))
}
for _, v := range dir {
if v.Name() != "." || v.Name() != ".." {
if !v.IsDir() {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %d %s</p>\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("<p><a href='%s'>%s</a> %s %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05"))))
}
}
}
w.Write([]byte("</pre>\n</html>"))
return
}
func (v VtqeHttpServer) 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 {
starlog.Errorln(err)
w.WriteHeader(502)
w.Write([]byte(err.Error()))
return
}
defer file.Close()
starlog.Noticef("Upload %s From %s\n", handler.Filename, r.RemoteAddr)
fmt.Fprintf(w, `<html><body><p>%v</p><h2><a href="./vtqeupload1127/web">Return To Web Page</a></h2></body></html>`, handler.Header)
os.Mkdir("./vtqeupload1127", 0755)
f, err := os.OpenFile("./vtqeupload1127/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
starlog.Errorln(err)
return
}
defer f.Close()
io.Copy(f, file)
}
File diff suppressed because it is too large Load Diff
+194
View File
@@ -0,0 +1,194 @@
package main
import (
"errors"
"image"
"io/ioutil"
"os"
"github.com/golang/freetype"
"github.com/nfnt/resize"
"image/color"
"image/draw"
_ "image/gif"
_ "image/jpeg"
"image/png"
_ "image/png"
"b612.me/starainrt"
)
func OpenImage(name string) (image.Image, error) {
if !starainrt.Exists(name) {
return nil, errors.New("File Not Exists")
}
fso, err := os.Open(name)
if err != nil {
return nil, err
}
img, _, err := image.Decode(fso)
if err != nil {
return nil, err
}
return img, nil
}
func MergePhoto(big, small image.Image, bigsize, smallsize uint, x, y int) image.Image {
big = resize.Resize(bigsize, bigsize, big, resize.Lanczos3)
small = resize.Resize(smallsize, smallsize, small, resize.Lanczos3)
offset := image.Pt(x, y)
b := big.Bounds()
nimg := image.NewRGBA(b)
draw.Draw(nimg, b, big, image.ZP, draw.Src)
draw.Draw(nimg, small.Bounds(), small, offset, draw.Over)
return nimg
}
func SavePhoto(path string, img image.Image) error {
imgf, err := os.Create(path)
if err != nil {
return err
}
defer imgf.Close()
return png.Encode(imgf, img)
}
func SetAlpha(img image.Image, alpha uint8) image.Image {
size := img.Bounds()
nimg := image.NewRGBA(size)
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
r = r >> 8
g = g >> 8
b = b >> 8
a = a >> 8
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), alpha})
//nimg.Set(x, y, color.Alpha{alpha})
//nimg.Set(x, y, img.At(x, y))
}
}
return nimg
}
func AddText(text string, img image.Image, x, y int, dpi, size float64, colors color.RGBA, ttf string) (image.Image, error) {
if !starainrt.Exists(ttf) {
return nil, errors.New("File Not Exists")
}
fontbyte, err := ioutil.ReadFile(ttf)
if err != nil {
return nil, err
}
font, err := freetype.ParseFont(fontbyte)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
f := freetype.NewContext()
f.SetDPI(dpi)
f.SetFontSize(size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(colors))
_, err = f.DrawString(text, freetype.Pt(x, y))
if err != nil {
return nil, err
}
return nimg, nil
}
type TextImg struct {
Text string
X int
Y int
Dpi float64
Size float64
Color color.NRGBA
}
type TextList struct {
List []TextImg
TTF []byte
}
func AddListTests(list TextList, img image.Image) (image.Image, error) {
font, err := freetype.ParseFont(list.TTF)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
for _, v := range list.List {
f := freetype.NewContext()
f.SetDPI(v.Dpi)
f.SetFontSize(v.Size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(v.Color))
_, err = f.DrawString(v.Text, freetype.Pt(v.X, v.Y))
if err != nil {
return nil, err
}
}
return nimg, nil
}
func AddTexts(text string, img image.Image, x, y int, dpi, size float64, colors color.NRGBA, ttf string) (image.Image, error) {
if !starainrt.Exists(ttf) {
return nil, errors.New("File Not Exists")
}
fontbyte, err := ioutil.ReadFile(ttf)
if err != nil {
return nil, err
}
font, err := freetype.ParseFont(fontbyte)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
f := freetype.NewContext()
f.SetDPI(dpi)
f.SetFontSize(size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(colors))
_, err = f.DrawString(text, freetype.Pt(x, y))
if err != nil {
return nil, err
}
return nimg, nil
}
+82
View File
@@ -0,0 +1,82 @@
package main
import (
"fmt"
"image"
"b612.me/starlog"
"github.com/spf13/cobra"
)
func init() {
imageCmd.AddCommand(imgMirrorCmd)
}
var imageCmd = &cobra.Command{
Use: "image",
Short: "图像处理",
Long: "简单的图像处理工具",
Run: func(this *cobra.Command, args []string) {
this.Help()
},
}
var imgMirrorCmd = &cobra.Command{
Use: "mirror",
Short: "图像镜像翻转",
Long: "图像镜像翻转<水平>",
Run: func(this *cobra.Command, args []string) {
if len(args) == 0 {
starlog.Errorln("请指定需要转换的图像!")
return
}
for _, v := range args {
img, err := OpenImage(v)
if err != nil {
starlog.Errorln(err, v)
continue
}
size := img.Bounds()
nimg := image.NewRGBA(size)
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
nimg.Set(size.Dx()-x, y, img.At(x, y))
}
}
if err := SavePhoto(v, nimg); err != nil {
starlog.Errorln(err, v)
continue
} else {
fmt.Println(v, "转换已完成!")
}
}
fmt.Println("任务完成!")
},
}
var imgAlpha = &cobra.Command{
Use: "alpha",
Short: "设置透明度",
Long: "设置alpha通道透明度",
Run: func(this *cobra.Command, args []string) {
if len(args) == 0 {
starlog.Errorln("请指定需要转换的图像!")
return
}
for _, v := range args {
img, err := OpenImage(v)
if err != nil {
starlog.Errorln(err, v)
continue
}
img = SetAlpha(img, 4)
if err := SavePhoto(v, img); err != nil {
starlog.Errorln(err, v)
continue
} else {
fmt.Println(v, "转换已完成!")
}
}
fmt.Println("任务完成!")
},
}
+26
View File
@@ -0,0 +1,26 @@
package main
import (
"fmt"
"github.com/spf13/cobra"
)
// Vtqe is my own toolbox
func init() {
cmdMain.AddCommand(tcpingcmd, httpcmd, attachcmd, detachcmd, b64cmd, ftpcmd, gencmd, hashcmd, imageCmd, mergecmd, netcmd, sftpcmd, splitcmd, tcpcmd, udpcmd, viccmd, curlcmd)
}
const vtqe_version string = "v1.0.0rc1"
var cmdMain = &cobra.Command{
Short: "Victorique's Wisdom ToolBox",
Long: fmt.Sprintf(`Victorique's Wisdom ToolBox @%v
这是一个可爱且充满智慧的工具箱@B612.ME`, vtqe_version),
Version: vtqe_version,
}
func main() {
cmdMain.Execute()
}
+2 -3
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -35,7 +35,7 @@ var mergecmd = &cobra.Command{
} }
}) })
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "") starlog.Errorln(err.Error)
} }
}, },
@@ -44,5 +44,4 @@ var mergecmd = &cobra.Command{
func init() { func init() {
mergecmd.Flags().StringP("src", "s", "", "源文件地址,用*替换文件数字") mergecmd.Flags().StringP("src", "s", "", "源文件地址,用*替换文件数字")
mergecmd.Flags().StringP("dst", "d", "", "目标文件地址") mergecmd.Flags().StringP("dst", "d", "", "目标文件地址")
Maincmd.AddCommand(mergecmd)
} }
+806
View File
@@ -0,0 +1,806 @@
package main
import (
"fmt"
"io"
"net"
"strconv"
"strings"
"time"
"github.com/spf13/cobra"
)
func init() {
netcmd.AddCommand(netforwardcmd, natscmd, natccmd)
netforwardcmd.Flags().BoolP("tcp", "t", false, "TCP转发")
netforwardcmd.Flags().BoolP("udp", "u", false, "UDP转发")
netforwardcmd.Flags().IntP("port", "p", 1127, "转发本地端口")
netforwardcmd.Flags().StringP("address", "a", "0.0.0.0", "监听地址")
natscmd.Flags().BoolP("tcp", "t", false, "TCP穿透")
natscmd.Flags().BoolP("udp", "u", false, "UDP穿透")
natscmd.Flags().IntP("port", "p", 1127, "监听本地端口开始点")
natscmd.Flags().StringP("key", "k", "sakura", "认证密码")
natscmd.Flags().StringP("address", "a", "0.0.0.0", "监听本地地址")
natscmd.Flags().IntP("number", "n", 1, "监听端口数量")
natccmd.Flags().BoolP("tcp", "t", false, "TCP穿透")
natccmd.Flags().BoolP("udp", "u", false, "UDP穿透")
natccmd.Flags().IntP("port", "p", 1127, "转发穿透端口")
natccmd.Flags().StringP("key", "k", "sakura", "认证密码")
natccmd.Flags().StringP("address", "a", "127.0.0.1", "转发穿透地址")
}
var netcmd = &cobra.Command{
Use: "net",
Short: "端口转发,穿透相关",
Long: "端口转发,穿透相关",
}
var netforwardcmd = &cobra.Command{
Use: "forward",
Short: "TCP/UDP端口转发",
Long: "TCP/UDP端口转发",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
a, _ := cmd.Flags().GetString("address")
if len(args) != 1 {
cmd.Help()
return
}
ra := args[0]
if !t && !u {
fmt.Println("请指定TCP或UDP协议")
return
}
localtcp, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p))
if err != nil {
fmt.Println(err)
return
}
remotetcp, err := net.ResolveTCPAddr("tcp", ra)
if err != nil {
fmt.Println(err)
return
}
localudp, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p))
remoteudp, _ := net.ResolveUDPAddr("udp", ra)
if u {
go UdpForward(localudp, remoteudp)
}
if t {
go TcpForward(localtcp, remotetcp)
}
for {
time.Sleep(time.Second * 100)
}
},
}
var natscmd = &cobra.Command{
Use: "nats",
Short: "TCP/UDP内网穿透服务端",
Long: "TCP/UDP内网穿透服务端",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
k, _ := cmd.Flags().GetString("key")
a, _ := cmd.Flags().GetString("address")
n, _ := cmd.Flags().GetInt("number")
/*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p)
if err != nil {
fmt.Println(err)
return
}
*/
for i := 0; i < n; i++ {
tcplocal, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p+i))
if err != nil {
fmt.Println(err)
return
}
udplocal, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p+i))
if !t && !u {
fmt.Println("请至少指定一种网络协议!")
return
}
if t {
go TcpNatServer(tcplocal, k)
}
if u {
go UdpNatServer(udplocal, k)
}
}
for {
time.Sleep(time.Second * 10)
}
},
}
var natccmd = &cobra.Command{
Use: "natc",
Short: "TCP/UDP内网穿透客户端",
Long: "TCP/UDP内网穿透客户端",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
k, _ := cmd.Flags().GetString("key")
a, _ := cmd.Flags().GetString("address")
/*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p)
if err != nil {
fmt.Println(err)
return
}
*/
if len(args) != 1 {
cmd.Help()
return
}
if !t && !u {
fmt.Println("请至少指定一种网络协议!")
return
}
tcprmt, err := net.ResolveTCPAddr("tcp", args[0])
if err != nil {
fmt.Println(err)
return
}
tcpforward, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p))
if err != nil {
fmt.Println(err)
return
}
udprmt, _ := net.ResolveUDPAddr("udp", args[0])
udpforward, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p))
if t {
go TcpNatClient(tcprmt, tcpforward, k)
}
if u {
go UdpNatClient(udprmt, udpforward, k)
}
for {
time.Sleep(time.Second * 10)
}
},
}
type tcpnat struct {
Conn *net.TCPConn
Msg []byte
Date int64
}
func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) {
var trueconn *net.UDPConn
var err error
ismain := false
var lastcheck int64
dialudp := func(udpaddr *net.UDPAddr) (*net.UDPConn, error) {
trueconn, err := net.DialUDP("udp", nil, udpaddr)
if err != nil {
return nil, err
}
return trueconn, nil
}
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for {
trueconn, err = dialudp(udpremote)
if err != nil || trueconn == nil {
time.Sleep(5 * time.Second)
fmt.Println(err)
continue
}
fmt.Println("UDP远端服务器连接成功" + trueconn.RemoteAddr().String())
trueconn.Write([]byte(pwd))
go func() {
for !ismain {
time.Sleep(time.Second * 2)
if trueconn != nil {
if ismain {
return
}
_, err := trueconn.Write([]byte(pwd))
if err != nil {
fmt.Println(err)
return
}
}
}
}()
go func() {
for {
if trueconn == nil {
break
}
var conn1, conn2 *net.UDPConn
buf := make([]byte, 7)
n, err := trueconn.Read(buf)
if n != 7 || err != nil {
fmt.Println(err)
trueconn = nil
ismain = false
fmt.Println("UDP下线01")
break
}
switch string(buf) {
case "yesyesi":
ismain = true
fmt.Println("UDP主节点认证成功")
lastcheck = time.Now().Unix()
go func() {
for {
time.Sleep(time.Second * 2)
if time.Now().Unix()-lastcheck > 4 {
ismain = false
trueconn = nil
fmt.Println("UDP下线02")
return
}
}
}()
case "vicregs":
if trueconn != nil {
trueconn.Write([]byte("vicregs"))
}
lastcheck = time.Now().Unix()
case "newconn":
if !ismain {
trueconn.Close()
break
}
for conn1, err = dialudp(udpforward); err != nil; conn1, err = dialudp(udpforward) {
time.Sleep(time.Second * 2)
}
fmt.Println("UDP已连接转发远端:" + conn1.RemoteAddr().String())
for conn2, err = dialudp(udpremote); err != nil; conn2, err = dialudp(udpremote) {
time.Sleep(time.Second * 2)
}
conn2.Write([]byte("v%2^f&K"))
fmt.Println("UDP已连接主控远端:" + conn2.RemoteAddr().String())
go UdpCopy(conn1, conn2)
go UdpCopy(conn2, conn1)
}
}
}()
for ismain || trueconn != nil {
time.Sleep(time.Second * 4)
}
ismain = false
}
}
func TcpNatClient(tcpremote, tcpforward *net.TCPAddr, pwd string) {
var trueconn *net.TCPConn
var err error
ismain := false
var lastcheck int64
dialtcp := func(tcpaddr *net.TCPAddr) (*net.TCPConn, error) {
trueconn, err := net.DialTCP("tcp", nil, tcpaddr)
if err != nil {
return nil, err
}
return trueconn, nil
}
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for {
trueconn, err = dialtcp(tcpremote)
if err != nil || trueconn == nil {
fmt.Println(err)
time.Sleep(5 * time.Second)
continue
}
fmt.Println("TCP远端服务器连接成功" + trueconn.RemoteAddr().String())
n, err := trueconn.Write([]byte(pwd))
if err != nil || n == 0 {
fmt.Println(err)
continue
}
go func() {
for {
time.Sleep(time.Second * 2)
if !ismain {
if trueconn != nil {
_, err := trueconn.Write([]byte(pwd))
if err != nil {
return
}
} else {
return
}
} else {
return
}
}
}()
go func() {
for {
if trueconn == nil {
break
}
var conn1, conn2 *net.TCPConn
buf := make([]byte, 7)
n, err := trueconn.Read(buf)
if n != 7 || err != nil {
fmt.Println("TCP下线01")
fmt.Println(err)
trueconn = nil
ismain = false
break
}
switch string(buf) {
case "yesyesi":
ismain = true
fmt.Println("TCP主节点认证成功")
lastcheck = time.Now().Unix()
go func() {
for {
time.Sleep(time.Second)
if time.Now().Unix()-lastcheck > 4 {
fmt.Println("TCP下线02")
ismain = false
trueconn = nil
return
}
}
}()
case "vicb612":
lastcheck = time.Now().Unix()
if trueconn != nil {
trueconn.Write([]byte("vicb612"))
}
case "newconn":
if !ismain {
trueconn.Close()
trueconn = nil
fmt.Println("TCP下线03")
break
}
for conn1, err = dialtcp(tcpforward); err != nil; conn1, err = dialtcp(tcpforward) {
time.Sleep(time.Second * 2)
}
fmt.Println("TCP已连接转发远端:" + conn1.RemoteAddr().String())
for conn2, err = dialtcp(tcpremote); err != nil; conn2, err = dialtcp(tcpremote) {
time.Sleep(time.Second * 2)
}
conn2.Write([]byte("v%2^f&K"))
fmt.Println("TCP已连接主控远端:" + conn2.RemoteAddr().String())
go TcpCopy(conn1, conn2)
go TcpCopy(conn2, conn1)
}
}
}()
for ismain || trueconn != nil {
time.Sleep(time.Second * 4)
}
ismain = false
}
}
func TcpCopy3(dst net.Conn, src *net.TCPConn) {
defer dst.Close()
defer src.Close()
io.Copy(dst, src)
}
func TcpCopy2(dst *net.TCPConn, src net.Conn) {
defer src.Close()
defer dst.Close()
io.Copy(dst, src)
}
func TcpCopy(dst, src *net.TCPConn) {
defer dst.Close()
defer src.Close()
io.Copy(dst, src)
}
func UdpCopy(dst, src *net.UDPConn) {
defer dst.Close()
defer src.Close()
for {
buf := make([]byte, 131072)
n, err := src.Read(buf)
dst.Write(buf[0:n])
if err != nil {
fmt.Println(err)
break
}
}
}
type udpnat struct {
Conn *net.UDPAddr
Msg []byte
Married bool
LastTrans int64
}
func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
var trueconn *net.UDPAddr
isconn := false
var lastcheck int64
udplistener, err := net.ListenUDP("udp", udplocal)
defer udplistener.Close()
if err != nil {
fmt.Println(err)
return
}
udpconnlist := []string{}
udpool := make(map[string]*udpnat)
udpdial := make(map[string]*net.UDPAddr)
fmt.Println("UDP已建立监听:" + udplistener.LocalAddr().String())
removeudplist := func(str string) {
var tmp []string
for _, v := range udpconnlist {
if v != str {
tmp = append(tmp, str)
}
}
udpconnlist = tmp
}
go func() {
for {
time.Sleep(time.Second * 20)
pool := []string{}
for k, v := range udpool {
if time.Now().Unix()-v.LastTrans > 30 {
pool = append(pool, k)
}
}
for _, v := range pool {
if udpool[v].Married {
delete(udpdial, udpool[v].Conn.String())
} else {
removeudplist(v)
}
delete(udpool, v)
}
}
}()
for {
buf := make([]byte, 131072)
n, conn, errp := udplistener.ReadFromUDP(buf)
go func() {
if !isconn {
if errp != nil {
return
}
if string(buf[0:len(pwd)]) == pwd && n == len(pwd) {
isconn = true
trueconn = conn
udplistener.WriteToUDP([]byte("yesyesi"), trueconn)
fmt.Println("UDP穿透客户端已注册")
udpool = make(map[string]*udpnat)
udpdial = make(map[string]*net.UDPAddr)
udpconnlist = []string{}
lastcheck = time.Now().Unix()
go func() {
for {
time.Sleep(time.Second * 2)
go udplistener.WriteToUDP([]byte("vicregs"), trueconn)
if time.Now().Unix()-lastcheck > 6 {
fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线01")
isconn = false
break
}
}
}()
}
} else {
if string(buf[0:7]) == "vicregs" {
lastcheck = time.Now().Unix()
return
}
if string(buf[0:7]) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接")
if len(udpconnlist) != 0 {
if v, ok := udpool[udpconnlist[0]]; ok {
if !v.Married {
v.Conn = conn
udplistener.WriteToUDP(v.Msg, conn)
v.Msg = []byte{}
udpaddr, _ := net.ResolveUDPAddr("udp", udpconnlist[0])
udpdial[conn.String()] = udpaddr
v.Married = true
}
}
if len(udpconnlist) == 1 {
udpconnlist = []string{}
} else {
udpconnlist = udpconnlist[1:]
}
}
return
} else {
if v, ok := udpool[conn.String()]; ok {
if !v.Married {
for i := 0; i < n; i++ {
v.Msg = append(v.Msg, buf[i])
}
if len(v.Msg) > 10485760 {
v.Msg = []byte{}
}
} else {
_, err := udplistener.WriteToUDP(buf[0:n], v.Conn)
v.LastTrans = time.Now().Unix()
if errp != nil || err != nil {
fmt.Println(errp, err)
udplistener.WriteToUDP(nil, v.Conn)
udplistener.WriteToUDP(nil, conn)
delete(udpool, conn.String())
delete(udpdial, v.Conn.String())
return
}
}
return
}
if v, ok := udpdial[conn.String()]; ok {
_, err := udplistener.WriteToUDP(buf[0:n], v)
udpool[v.String()].LastTrans = time.Now().Unix()
if errp != nil || err != nil {
fmt.Println(errp, err)
udplistener.WriteToUDP(nil, v)
udplistener.WriteToUDP(nil, conn)
delete(udpool, v.String())
delete(udpdial, conn.String())
return
}
return
}
fmt.Println("链接已加入等待列表")
udpool[conn.String()] = &udpnat{
Msg: buf[0:n],
Married: false,
LastTrans: time.Now().Unix(),
}
udpconnlist = append(udpconnlist, conn.String())
_, err := udplistener.WriteToUDP([]byte("newconn"), trueconn)
if err != nil {
fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线02")
isconn = false
}
}
}
}()
}
fmt.Println("执行完毕")
}
func TcpNatServer(tcplocal *net.TCPAddr, pwd string) {
var trueconn *net.TCPConn
lastcheck := int64(0)
isconn := false
tcplistener, err := net.ListenTCP("tcp", tcplocal)
defer tcplistener.Close()
var waitconn []tcpnat
if err != nil {
fmt.Println(err)
return
}
fmt.Println("TCP已建立监听:" + tcplistener.Addr().String())
for {
conn, err := tcplistener.AcceptTCP()
if err != nil {
return
}
go func() {
for {
now := time.Now().Unix()
if len(waitconn) != 0 {
if now-waitconn[0].Date > 8 {
waitconn[0].Conn.Close()
if len(waitconn) > 1 {
waitconn = waitconn[1:]
} else {
waitconn = []tcpnat{}
}
}
}
time.Sleep(time.Second * 2)
}
}()
go func() {
if !isconn {
buf := make([]byte, len(pwd)+1)
n, err := conn.Read(buf)
if n != len(pwd) || err != nil {
conn.Close()
return
}
if string(buf[0:len(pwd)]) == pwd {
isconn = true
trueconn = conn
conn.Write([]byte("yesyesi"))
fmt.Println("TCP穿透客户端已注册")
lastcheck = time.Now().Unix()
go func() {
for isconn && trueconn != nil {
buf := make([]byte, 7)
n, err := trueconn.Read(buf)
if n != 7 || err != nil {
isconn = false
trueconn = nil
return
}
if string(buf) == "vicb612" {
lastcheck = time.Now().Unix()
}
}
}()
go func() {
for {
time.Sleep(time.Second * 2)
if trueconn != nil {
_, err := trueconn.Write([]byte("vicb612"))
if err != nil {
trueconn.Close()
trueconn = nil
isconn = false
fmt.Println("TCP下线01")
return
}
}
if time.Now().Unix()-lastcheck > 4 {
fmt.Println("TCP下线02")
trueconn = nil
isconn = false
return
}
}
}()
}
return
} else {
isRun := false
buf := make([]byte, 7)
if strings.Split(conn.RemoteAddr().String(), ":")[0] == strings.Split(trueconn.RemoteAddr().String(), ":")[0] {
isRun = true
n, err := conn.Read(buf)
if n != 7 || err != nil {
conn.Close()
return
}
}
if string(buf) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接")
if len(waitconn) != 0 {
if waitconn[0].Msg != nil {
conn.Write(waitconn[0].Msg)
}
waitconn[0].Msg = []byte{}
go TcpCopy(waitconn[0].Conn, conn)
go TcpCopy(conn, waitconn[0].Conn)
if len(waitconn) > 1 {
waitconn = waitconn[1:]
} else {
waitconn = []tcpnat{}
}
} else {
conn.Close()
}
} else {
fmt.Println("链接已加入等待列表")
var tcpnats tcpnat
if isRun {
tcpnats = tcpnat{Msg: buf, Conn: conn, Date: time.Now().Unix()}
} else {
tcpnats = tcpnat{Msg: nil, Conn: conn, Date: time.Now().Unix()}
}
waitconn = append(waitconn, tcpnats)
if trueconn == nil {
isconn = false
fmt.Println("TCP下线04")
return
}
_, err := trueconn.Write([]byte("newconn"))
if err != nil {
fmt.Println("穿透客户端已下线")
fmt.Println("TCP下线03")
trueconn.Close()
trueconn = nil
isconn = false
}
}
}
}()
}
}
func TcpForward(tcplocal, tcpforward *net.TCPAddr) {
tcplistener, err := net.ListenTCP("tcp", tcplocal)
if err != nil {
fmt.Println(err)
return
}
dialtcp := func() (*net.Conn, error) {
tcpclient, err := net.DialTimeout("tcp", tcpforward.String(), time.Second*10)
if err != nil {
return nil, err
}
return &tcpclient, nil
}
fmt.Println("TCP监听已建立:" + tcplocal.String())
for {
conn, err := tcplistener.AcceptTCP()
if err != nil {
continue
}
fmt.Println(conn.RemoteAddr().String() + " 已连接")
tcpclient, err := dialtcp()
if err != nil {
fmt.Println(err)
conn.Write([]byte("Dial To Remote Addr Error"))
conn.Close()
continue
}
fmt.Println("成功连接到转发端口,本地端口:" + (*tcpclient).LocalAddr().String())
go TcpCopy2(conn, *tcpclient)
go TcpCopy3(*tcpclient, conn)
}
}
func UdpForward(udplocal, udpforward *net.UDPAddr) {
udplistener, err := net.ListenUDP("udp", udplocal)
if err != nil {
fmt.Println(err)
return
}
dialudp := func() (*net.UDPConn, error) {
udpclient, err := net.DialUDP("udp", nil, udpforward)
if err != nil {
return nil, err
}
return udpclient, nil
}
fmt.Println("UDP监听已建立:" + udplocal.String())
udppool := make(map[string]*net.UDPConn)
for {
buf := make([]byte, 131072)
n, conn, err := udplistener.ReadFromUDP(buf)
udpclient, ok := udppool[conn.String()]
if !ok || udpclient == nil {
fmt.Println(conn.String() + " 已连接")
udpclient, err = dialudp()
if err != nil {
fmt.Println(err)
udplistener.WriteToUDP([]byte("Dial To Remote Addr Error"), conn)
continue
}
udppool[conn.String()] = udpclient
fmt.Println("成功连接到转发端口,本地端口:" + udpclient.LocalAddr().String())
}
go udpclient.Write(buf[0:n])
go func(conns *net.UDPAddr, udpclient *net.UDPConn) {
bufs := make([]byte, 131072)
n, err := udpclient.Read(bufs)
udplistener.WriteToUDP(bufs[0:n], conns)
if err != nil {
udpclient.Close()
udppool[conn.String()] = nil
}
}(conn, udpclient)
if err != nil {
udpclient.Close()
udppool[conn.String()] = nil
}
}
}
+172
View File
@@ -0,0 +1,172 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"runtime"
"strings"
"b612.me/starainrt"
"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")
s, _ := this.Flags().GetString("src")
r, _ := this.Flags().GetString("dst")
i, _ := this.Flags().GetString("identify")
k, _ := this.Flags().GetString("password")
p, _ := this.Flags().GetInt("port")
b, _ := this.Flags().GetInt("buffer")
g, _ := this.Flags().GetString("regexp")
var user, host string
var err error
if len(args) != 1 {
fmt.Println("sftp <[user@]Host> -s <Local> -d <Remote>")
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连接……")
myssh := new(sshd.StarSSH)
err = myssh.Connect(user, k, host, i, p)
if err != nil {
fmt.Println(err)
return
}
defer myssh.Close()
fmt.Println("已连接上……")
sftp, err := sshd.CreateSftp(myssh.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)
}
}
var UploadDir func(string, string)
UploadDir = func(fs, remote string) {
if runtime.GOOS == "windows" {
fs = strings.Replace(fs, "/", "\\", -1)
}
sftp.MkdirAll(remote)
abspath, _ := filepath.Abs(fs)
dir, err := ioutil.ReadDir(fs)
if err != nil {
fmt.Println(err)
return
}
for _, v := range dir {
if v.IsDir() {
if g != "" {
continue
}
UploadDir(abspath+string(os.PathSeparator)+v.Name(), remote+"/"+v.Name())
} else {
if ok, _ := regexp.MatchString(g, v.Name()); !ok {
continue
}
fmt.Println("上传:" + abspath + string(os.PathSeparator) + v.Name())
err = sshd.FtpTransferOutFunc(abspath+string(os.PathSeparator)+v.Name(), remote+"/"+v.Name(), b, shell, sftp)
if err != nil {
fmt.Println(err)
continue
}
}
}
}
var DownloadDir func(string, string)
DownloadDir = func(fs, remote string) {
abspath, _ := filepath.Abs(remote)
os.MkdirAll(abspath, 0755)
dir, err := sftp.ReadDir(fs)
if err != nil {
fmt.Println("读取错误", err)
return
}
for _, v := range dir {
if v.IsDir() {
if g != "" {
continue
}
DownloadDir(fs+"/"+v.Name(), abspath+string(os.PathSeparator)+v.Name())
} else {
if ok, _ := regexp.MatchString(g, v.Name()); !ok {
continue
}
fmt.Println("下载:" + fs + "/" + v.Name())
err = sshd.FtpTransferInFunc(fs+"/"+v.Name(), abspath+string(os.PathSeparator)+v.Name(), b, shell, sftp)
if err != nil {
fmt.Println(err)
continue
}
}
}
}
if !d {
if !starainrt.Exists(s) {
fmt.Println("本地文件或文件夹:" + s + "不存在")
return
}
if starainrt.IsFile(s) {
err = sshd.FtpTransferOutFunc(s, r, b, shell, sftp)
} else {
UploadDir(s, r)
}
} else {
if !myssh.Exists(s) {
fmt.Println("远端文件或文件夹:" + s + "不存在")
return
}
stat, err := sftp.Stat(s)
if err != nil {
fmt.Println("错误:", err)
return
}
if !stat.IsDir() {
err = sshd.FtpTransferInFunc(s, r, b, shell, sftp)
} else {
DownloadDir(s, r)
}
}
if err != nil {
fmt.Println(err)
}
},
}
func init() {
sftpcmd.Flags().BoolP("download", "D", false, "进行下载")
sftpcmd.Flags().StringP("identify", "i", "", "RSA登录密钥")
sftpcmd.Flags().StringP("password", "k", "", "登录密码")
sftpcmd.Flags().StringP("src", "s", "", "本机路径/若为下载则相反")
sftpcmd.Flags().StringP("dst", "d", "", "远程路径/若为下载则相反")
sftpcmd.Flags().IntP("port", "p", 22, "登录端口")
sftpcmd.Flags().StringP("regexp", "r", "", "正则表达式")
sftpcmd.Flags().IntP("buffer", "b", 10240, "buffer大小")
}
+4 -5
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -27,12 +27,12 @@ var splitcmd = &cobra.Command{
num, _ = this.Flags().GetInt("num") num, _ = this.Flags().GetInt("num")
} }
if !starainrt.Exists(src) { if !starainrt.Exists(src) {
starlog.Println("源文件不存在", "red", "b") starlog.Errorln("源文件不存在")
this.Help() this.Help()
return return
} }
if num == 0 { if num == 0 {
starlog.Println("参数num不合法", "red", "b") starlog.Errorln("参数num不合法", "red")
this.Help() this.Help()
return return
} }
@@ -46,7 +46,7 @@ var splitcmd = &cobra.Command{
} }
}) })
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "") starlog.Errorln(err.Error)
} }
}, },
@@ -57,5 +57,4 @@ func init() {
splitcmd.Flags().StringP("dst", "d", "./split*.vicque", "目标文件地址,用*替换文件数字") splitcmd.Flags().StringP("dst", "d", "./split*.vicque", "目标文件地址,用*替换文件数字")
splitcmd.Flags().BoolP("byte", "b", false, "按byte分割") splitcmd.Flags().BoolP("byte", "b", false, "按byte分割")
splitcmd.Flags().IntP("num", "n", 0, "分割数/byte数") splitcmd.Flags().IntP("num", "n", 0, "分割数/byte数")
Maincmd.AddCommand(splitcmd)
} }
+442
View File
@@ -0,0 +1,442 @@
package main
import (
"fmt"
"io"
"io/ioutil"
"net"
"os"
"path/filepath"
"regexp"
"runtime"
"strconv"
"strings"
"time"
"b612.me/starainrt"
"b612.me/starlog"
"github.com/spf13/cobra"
)
var tcpcmd = &cobra.Command{
Use: "tcp",
Short: "发送并监听tcp数据包",
Long: "发送并监听tcp数据包",
Run: func(this *cobra.Command, args []string) {
r, _ := this.Flags().GetBool("recvonly")
if len(args) != 1 && !r {
fmt.Println("请指定远程tcp地址")
return
}
l, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
s, _ := this.Flags().GetBool("local")
b, _ := this.Flags().GetBool("byte")
laddr, err := net.ResolveTCPAddr("tcp", a+":"+l)
if err != nil {
fmt.Println(err)
return
}
if s {
tcplisten, err := net.ListenTCP("tcp", laddr)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("监听已建立")
defer tcplisten.Close()
go func() {
for {
conn, err := tcplisten.AcceptTCP()
if err != nil {
fmt.Printf("Error Connect From %s : %s\n", conn.RemoteAddr(), err.Error())
continue
}
starlog.Infof("Accept Connect From %s\n", conn.RemoteAddr())
go func(conns *net.TCPConn) {
for {
buf := make([]byte, 204800)
n, err := conns.Read(buf)
if err != nil {
starlog.Infof("Error from %s Where Message=%s\n", conns.RemoteAddr(), err.Error())
conn.Close()
return
}
starlog.Infof("Receive Msg From %s : %s\n", conns.RemoteAddr(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
}(conn)
}
}()
}
if !r {
mytcp, err := net.DialTimeout("tcp", args[0], time.Second*15)
if err != nil {
fmt.Println(err)
if s {
for {
time.Sleep(time.Second * 10)
}
}
return
}
defer mytcp.Close()
fmt.Println("TCP连接已建立")
go func() {
var err error
for {
txt := starainrt.MessageBox("", "")
if txt == "" {
continue
}
if !b {
_, err = mytcp.Write([]byte(txt))
} else {
var sendbyte []byte
bytes := strings.Split(txt, ",")
for _, v := range bytes {
ints, _ := strconv.Atoi(v)
if ints < 0 || ints > 255 {
continue
}
sendbyte = append(sendbyte, byte(ints))
}
_, err = mytcp.Write(sendbyte)
}
if err != nil {
starlog.Errorf("Error from %s Where Message=%s\n", mytcp.RemoteAddr().String(), err.Error())
return
}
}
}()
for {
buf := make([]byte, 204800)
n, err := mytcp.Read(buf)
if err != nil {
starlog.Errorf("Error from %s Where Message=%s\n", mytcp.RemoteAddr().String(), err.Error())
return
}
starlog.Infof("Receive Msg From %s : %s\n", mytcp.RemoteAddr().String(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
} else {
for {
time.Sleep(time.Second)
}
}
},
}
/*
*/
func init() {
tcpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据")
tcpcmd.Flags().StringP("port", "p", "1127", "本地监听端口")
tcpcmd.Flags().StringP("addr", "a", "0.0.0.0", "本地监听ip")
tcpcmd.Flags().BoolP("local", "s", false, "启动本地监听")
tcpsendcmd.Flags().StringP("port", "p", "1127", "远程连接端口")
tcpsendcmd.Flags().StringP("addr", "a", "0.0.0.0", "远程监听ip")
tcpsendcmd.Flags().StringP("regexp", "r", "", "正则匹配字符串")
tcprecvcmd.Flags().StringP("port", "p", "1127", "本地监听端口")
tcprecvcmd.Flags().StringP("addr", "a", "0.0.0.0", "本地监听ip")
tcpcmd.Flags().BoolP("recvonly", "r", false, "仅接收udp包")
tcpcmd.AddCommand(tcpsendcmd, tcprecvcmd)
}
var cansend, backsck, foldercreate bool = false, false, false
var tcpsendcmd = &cobra.Command{
Use: "send",
Short: "通过tcp发送文件",
Long: "通过tcp接受文件",
Run: func(this *cobra.Command, args []string) {
stop := false
p, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
r, _ := this.Flags().GetString("regexp")
if len(args) != 1 {
this.Help()
return
}
mytcp, err := net.DialTimeout("tcp", a+":"+p, time.Second*15)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("TCP连接已建立")
defer mytcp.Close()
go func() {
for {
buf := make([]byte, 1048576)
n, err := mytcp.Read(buf)
if err != nil {
if !stop {
fmt.Println(err)
os.Exit(1)
}
continue
}
data := string(buf[0:n])
if data == "oksend!" {
cansend = true
} else if data == "backsck" {
backsck = true
} else if data == "folderok" {
foldercreate = true
} else {
fmt.Println(data)
os.Exit(1)
}
}
}()
file := args[0]
if file[len(file)-1:] == "\\" || file[len(file)-1:] == "/" {
file = file[0 : len(file)-1]
}
file, _ = filepath.Abs(file)
Scan(file, "", mytcp, r)
stop = true
mytcp.Write([]byte("jane&0&0"))
return
},
}
func tcpupload(file, prefix string, mytcp net.Conn) error {
if runtime.GOOS == "windows" {
file = strings.Replace(file, "/", "\\", -1)
prefix = strings.Replace(prefix, "/", "\\", -1)
}
fmt.Println(file)
fpsrc, err := os.Open(file)
if err != nil {
fmt.Println(err)
return err
}
stat, _ := os.Stat(file)
filebig := float64(stat.Size())
_, err = mytcp.Write([]byte("victorique&" + stat.Name() + "&" + prefix))
if err != nil {
fmt.Println(err)
return err
}
var sakura int = 0
for !cansend {
time.Sleep(time.Millisecond * 100)
sakura++
if sakura > 50 {
mytcp.Write([]byte{1, 9, 9, 6, 1, 1, 2, 7})
time.Sleep(time.Millisecond * 100)
mytcp.Write([]byte("victorique&" + stat.Name() + "&" + prefix))
}
}
cansend = false
sum := 0
for {
buf := make([]byte, 524288)
n, err := fpsrc.Read(buf)
if err != nil {
if err == io.EOF {
err = nil
mytcp.Write([]byte{1, 9, 9, 6, 1, 1, 2, 7})
for !backsck {
time.Sleep(time.Millisecond * 150)
}
backsck = false
break
}
fmt.Println(err)
return err
}
_, err = mytcp.Write(buf[0:n])
if err != nil {
fmt.Println(err)
return err
}
sum += n
fmt.Printf("当前已传输:%f\r", float64(sum)/filebig*100)
}
fmt.Printf("当前已传输:%f\n\n", 100.000000)
fpsrc.Close()
return nil
}
func Scan(path, prefix string, mytcp net.Conn, reg string) {
var err error
var regp *regexp.Regexp
if prefix != "" {
prefix += "/"
}
if reg != "" {
regp, err = regexp.Compile(reg)
if err != nil {
fmt.Println(err)
return
}
}
if runtime.GOOS == "windows" {
path = strings.Replace(path, "/", "\\", -1)
prefix = strings.Replace(prefix, "/", "\\", -1)
}
if starainrt.IsFile(path) {
if reg != "" {
if regp.MatchString(path) {
tcpupload(path, prefix, mytcp)
}
} else {
tcpupload(path, prefix, mytcp)
}
} else if starainrt.IsFolder(path) {
dir, err := ioutil.ReadDir(path)
if err != nil {
fmt.Println(err)
return
}
for _, v := range dir {
if v.IsDir() && (v.Name() != "." || v.Name() != "..") {
mytcp.Write([]byte("b612&" + prefix + v.Name() + "&0"))
count := 0
for !foldercreate {
time.Sleep(time.Millisecond * 100)
count++
if count%30 == 0 {
mytcp.Write([]byte("b612&" + prefix + v.Name() + "&0"))
}
}
foldercreate = false
Scan(path+"/"+v.Name(), prefix+v.Name(), mytcp, reg)
} else {
if reg != "" {
if regp.MatchString(path + "/" + v.Name()) {
err = tcpupload(path+"/"+v.Name(), prefix, mytcp)
}
} else {
err = tcpupload(path+"/"+v.Name(), prefix, mytcp)
}
if err != nil {
fmt.Println(err)
return
}
}
}
}
}
var tcprecvcmd = &cobra.Command{
Use: "recv",
Short: "通过tcp接收文件",
Long: "通过tcp接收文件",
Run: func(this *cobra.Command, args []string) {
p, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
laddr, err := net.ResolveTCPAddr("tcp", a+":"+p)
if err != nil {
fmt.Println(err)
return
}
tcplisten, err := net.ListenTCP("tcp", laddr)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("TCP监听已建立")
defer tcplisten.Close()
for {
conn, err := tcplisten.AcceptTCP()
if err != nil {
fmt.Printf("Error Connect From %s : %s\n", conn.RemoteAddr(), err.Error())
continue
}
fmt.Printf("Accept Connect From %s\n", conn.RemoteAddr())
go func(conns *net.TCPConn) {
canrecv := false
name := ""
var fpdst *os.File
defer conns.Close()
var sum int64
for {
buf := make([]byte, 393216)
n, err := conns.Read(buf)
if !canrecv {
if err != nil {
fmt.Println(err)
return
}
data := string(buf[0:n])
str := strings.Split(data, "&")
if len(str) != 3 {
continue
}
if str[0] == "victorique" {
canrecv = true
name = str[1]
prefix := str[2]
if runtime.GOOS != "windows" {
prefix = strings.Replace(prefix, "\\", "/", -1)
}
if prefix == "" {
fpdst, err = os.Create("./" + name)
} else {
fpdst, err = os.Create(prefix + name)
}
if err != nil {
fmt.Println(err)
conns.Write([]byte(err.Error()))
return
}
conns.Write([]byte("oksend!"))
} else if str[0] == "b612" {
str[1] = ".\\" + str[1]
if runtime.GOOS != "windows" {
str[1] = strings.Replace(str[1], "\\", "/", -1)
}
fmt.Println("进入文件夹:" + str[1] + "\n")
os.MkdirAll(str[1], 0644)
time.Sleep(time.Millisecond * 50)
conns.Write([]byte("folderok"))
} else if str[0] == "jane" {
return
}
} else {
if buf[n-1] == byte(7) && buf[n-2] == byte(2) && buf[n-3] == byte(1) {
ok := func() bool {
for k, v := range []byte{1, 9, 9, 6, 1, 1, 2, 7} {
if buf[n-8+k] != v {
return false
}
}
return true
}()
if ok {
if n > 8 {
fpdst.Write(buf[0 : n-8])
sum += int64(n - 8)
}
fmt.Printf("已写入:%d 字节\n", sum)
fmt.Println(name + "接收成功\n")
fpdst.Close()
canrecv = false
sum = 0
conns.Write([]byte("backsck"))
continue
}
}
fpdst.Write(buf[0:n])
sum += int64(n)
fmt.Printf("已写入:%d 字节\r", sum)
}
}
}(conn)
}
},
}
+19 -24
View File
@@ -1,40 +1,37 @@
package tools package main
import ( import (
"fmt" "fmt"
"os" "os"
"os/signal" "os/signal"
"syscall"
"time"
"strconv" "strconv"
"syscall"
"victorique/vtqe/tools/ping" "tcping/ping"
"time"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var ( var (
showVersion bool counter int
version string timeout string
gitCommit string interval string
counter int sigs chan os.Signal
timeout string
interval string
sigs chan os.Signal
httpMode bool httpMode bool
httpHead bool httpHead bool
httpPost bool httpPost bool
httpUA string httpUA string
permanent bool
dnsServer []string dnsServer []string
) )
var tcpingcmd = &cobra.Command{ var tcpingcmd = &cobra.Command{
Use: "tcping", Use: "tcping",
Short: "tcp ping", Short: "tcp/http ping",
Long: "进行Tcping", Long: "使用进行Tcp或Http协议进行ping探测",
Example: ` Example: `
1. ping over tcp 1. ping over tcp
> tcping google.com > tcping google.com
@@ -48,11 +45,13 @@ var tcpingcmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
sigs = make(chan os.Signal, 1) sigs = make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
if showVersion { if permanent && counter != 4 {
fmt.Printf("version: %s\n", version) fmt.Println("不能同时指定-t与-c,请检查您的输入")
fmt.Printf("git: %s\n", gitCommit)
return return
} }
if permanent {
counter = 0
}
if len(args) != 2 && len(args) != 1 { if len(args) != 2 && len(args) != 1 {
cmd.Usage() cmd.Usage()
return return
@@ -162,20 +161,16 @@ var tcpingcmd = &cobra.Command{
} }
func init() { func init() {
tcpingcmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit")
tcpingcmd.Flags().IntVarP(&counter, "counter", "c", 4, "ping的次数") tcpingcmd.Flags().IntVarP(&counter, "counter", "c", 4, "ping的次数")
tcpingcmd.Flags().BoolVarP(&permanent, "permanent", "t", false, "一直ping下去")
tcpingcmd.Flags().StringVarP(&timeout, "timeout", "T", "1s", `超时时间, 单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h"`) 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().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().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(&httpHead, "head", false, `使用http head模式`)
tcpingcmd.Flags().BoolVar(&httpPost, "post", false, `使用http post模式`) tcpingcmd.Flags().BoolVar(&httpPost, "post", false, `使用http post模式`)
tcpingcmd.Flags().StringVar(&httpUA, "user-agent", "tcping", `自定义UA`) tcpingcmd.Flags().StringVar(&httpUA, "user-agent", "victorique/tcping", `自定义UA`)
tcpingcmd.Flags().StringArrayVarP(&dnsServer, "dns-server", "D", nil, `使用自定义DNS服务器`) tcpingcmd.Flags().StringArrayVarP(&dnsServer, "dns-server", "D", nil, `使用自定义DNS服务器`)
} }
func init() {
Maincmd.AddCommand(tcpingcmd)
}
-46
View File
@@ -1,46 +0,0 @@
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)
}
-18
View File
@@ -1,18 +0,0 @@
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
}
-192
View File
@@ -1,192 +0,0 @@
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, `<html><body><p>%v</p><h2><a href="./vtqeupload1127/web">Return To Web Page</a></h2></body></html>`, 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(`<html><body><form id= "uploadForm" action= "../vtqeupload1127" method= "post" enctype ="multipart/form-data">
<h1 >Victorique's File Upload Page </h1>
<p >上传文件: <input type ="file" name="victorique" /></p>
<input type ="submit" value="上传"/>
</form>
<h2>Copyright@b612.me </h2></body></html>`))
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("<h1>404 NOT FOUND</h1>"))
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("<h1>502 ERROR</h1>"))
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("<h1>Cannot Access!</h1>"))
return
}
w.Write([]byte("<html>\n<style>\np{margin: 2px auto}\n</style>\n<h1>Victorique Http Server - " + Version + "</h1>"))
if up {
w.Write([]byte("<a href=/vtqeupload1127/web>Upload Web Page Is Openned!</a><br /><br />"))
}
w.Write([]byte("<hr /><pre>\n"))
if !isroot {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", "..", "..", "上层文件夹")))
}
for _, v := range dir {
if v.Name() != "." || v.Name() != ".." {
if !v.IsDir() {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %d %s</p>\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("<p><a href='%s'>%s</a> %s %s</p>\n", v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05"))))
}
}
}
w.Write([]byte("</pre>\n</html>"))
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)
}
-77
View File
@@ -1,77 +0,0 @@
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> <Local> <Remote>")
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大小")
}
+2 -2
View File
@@ -1,6 +1,6 @@
// +build windows // +build windows
package tools package main
import ( import (
"os" "os"
@@ -29,5 +29,5 @@ var uaccmd = &cobra.Command{
} }
func init() { func init() {
Maincmd.AddCommand(uaccmd) cmdMain.AddCommand(uaccmd)
} }
+126
View File
@@ -0,0 +1,126 @@
package main
import (
"fmt"
"net"
"strconv"
"strings"
"time"
"b612.me/starainrt"
"b612.me/starlog"
"github.com/spf13/cobra"
)
var udpcmd = &cobra.Command{
Use: "udp",
Short: "发送并监听udp数据包",
Long: "发送并监听udp数据包",
Run: func(this *cobra.Command, args []string) {
var raddr *net.UDPAddr
r, _ := this.Flags().GetBool("recvonly")
if len(args) != 1 && !r {
fmt.Println("请指定远程udp地址")
return
}
l, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
s, _ := this.Flags().GetBool("local")
b, _ := this.Flags().GetBool("byte")
laddr, err := net.ResolveUDPAddr("udp", a+":"+l)
if !r {
raddr, err = net.ResolveUDPAddr("udp", args[0])
}
if err != nil {
fmt.Println(err)
return
}
if s {
udplisten, err := net.ListenUDP("udp", laddr)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("监听已建立")
go func() {
for {
buf := make([]byte, 204800)
n, addr, err := udplisten.ReadFromUDP(buf)
if err != nil {
starlog.Errorln("Error from %s Where Message=%s\n", addr.String(), err.Error())
continue
}
starlog.Infof("Receive Msg From %s : %s\n", addr.String(), string(buf[0:n]))
if b {
starlog.Infof("%#v\n", buf[0:n])
}
}
}()
}
if !r {
myudp, err := net.DialUDP("udp", nil, raddr)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("UDP虚拟连接已建立")
go func() {
var err error
for {
txt := starainrt.MessageBox("", "")
if txt == "" {
continue
}
if !b {
_, err = myudp.Write([]byte(txt))
} else {
var sendbyte []byte
bytes := strings.Split(txt, ",")
for _, v := range bytes {
ints, _ := strconv.Atoi(v)
if ints < 0 || ints > 255 {
continue
}
sendbyte = append(sendbyte, byte(ints))
}
_, err = myudp.Write(sendbyte)
}
if err != nil {
fmt.Printf("Error from %s Where Message=%s\n", myudp.RemoteAddr().String(), err.Error())
return
}
}
}()
for {
buf := make([]byte, 204800)
n, err := myudp.Read(buf)
if err != nil {
starlog.Infof("Error from %s Where Message=%s\n", myudp.RemoteAddr().String(), err.Error())
return
}
starlog.Infof("Receive Msg From %s : %s\n", myudp.RemoteAddr().String(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
} else {
for {
time.Sleep(time.Second)
}
}
},
}
/*
*/
func init() {
udpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据")
udpcmd.Flags().StringP("port", "p", "1127", "本地监听端口")
udpcmd.Flags().StringP("addr", "a", "0.0.0.0", "本地监听ip")
udpcmd.Flags().BoolP("local", "s", false, "启动本地监听")
udpcmd.Flags().BoolP("recvonly", "r", false, "仅接收udp包")
}
+6 -9
View File
@@ -1,4 +1,4 @@
package tools package main
import ( import (
"fmt" "fmt"
@@ -13,7 +13,7 @@ import (
var viccmd = &cobra.Command{ var viccmd = &cobra.Command{
Use: "vicque", Use: "vicque",
Short: "嵐を乗り越えて", Short: "嵐を乗り越えて",
Long: "ほら!嵐を乗り越えて", Long: "あの子の未来を照らし出せ",
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
var err error var err error
ok, _ := this.Flags().GetBool("file") ok, _ := this.Flags().GetBool("file")
@@ -21,11 +21,9 @@ var viccmd = &cobra.Command{
pwd, _ := this.Flags().GetString("key") pwd, _ := this.Flags().GetString("key")
rep, _ := this.Flags().GetBool("replace") rep, _ := this.Flags().GetBool("replace")
ext, _ := this.Flags().GetBool("extension") ext, _ := this.Flags().GetBool("extension")
if len(args) != 2 { if len(args) != 2 || args[1] != "sakura" {
if len(args) < 2 || args[1] != "sakura" { starlog.Errorln("ヴィクトリカだけが使えるよ")
starlog.Println("ヴィクトリカだけが使えるよ", "red", "b") return
return
}
} }
shell := func(pect float64) { shell := func(pect float64) {
if pect == 100 { if pect == 100 {
@@ -79,7 +77,7 @@ var viccmd = &cobra.Command{
} }
} }
if err != nil { if err != nil {
starlog.Println(err, "red", "b") starlog.Errorln(err)
return return
} }
}, },
@@ -93,5 +91,4 @@ func init() {
viccmd.Flags().BoolP("replace", "r", false, "覆盖原文件") viccmd.Flags().BoolP("replace", "r", false, "覆盖原文件")
viccmd.Flags().BoolP("extension", "e", false, "添加/取消.victorique后缀") viccmd.Flags().BoolP("extension", "e", false, "添加/取消.victorique后缀")
viccmd.MarkFlagRequired("key") viccmd.MarkFlagRequired("key")
Maincmd.AddCommand(viccmd)
} }