前端之家收集整理的这篇文章主要介绍了
交互批量拖取文件代码片段,非完整代码,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io/IoUtil"
"net/http"
"os"
"strings"
)
const (
bodyType = "application/json"
)
type job struct {
FullDir bool
Files string
Date int
Reg string
IPlist string
Port string
Host string
}
var (
cfg string
j job
SJ SourceJob
)
func init() {
flag.StringVar(&cfg,"c","","-c cfg.json")
flag.BoolVar(&j.FullDir,"d",false,"-d true")
flag.StringVar(&j.Files,"f","-f 1,D:/test/2,test/3")
flag.IntVar(&j.Date,"t","-t -1 or -t 1")
flag.StringVar(&j.Reg,"r","-r *.go")
flag.StringVar(&j.IPlist,"i","-i 172.18.80.2:1789,127.0.0.1:1789")
flag.StringVar(&j.Port,"p","-p 1789")
flag.StringVar(&j.Host,"h","-h 192.168.1.2:1789")
flag.Parse()
if len(cfg) > 0 {
readConfig(cfg,&j)
}
if len(j.Files) <= 0 || len(j.IPlist) <= 0 || len(j.Host) <= 0 {
fmt.Printf("%s -f -h or -i is null\n",os.Args[0])
os.Exit(1)
}
if j.FullDir {
if j.Date != 0 || len(j.Reg) != 0 {
SJ.Job.Tag = 4
} else {
SJ.Job.Tag = 2
}
} else {
if j.Date != 0 || len(j.Reg) != 0 {
SJ.Job.Tag = 3
} else {
SJ.Job.Tag = 1
}
}
SJ.Job.Date = j.Date
SJ.Job.Regexp = j.Reg
SJ.Job.Files = strings.Split(j.Files,",")
SJ.IPlist = resolveIP(j.IPlist,j.Port)
}
func main() {
buf,err := json.Marshal(SJ)
if err != nil {
fmt.Printf("Marshal msg faild,%v\n",err)
return
}
rio := bytes.NewReader(buf)
resp,err := http.Post(fmt.Sprintf("http://%v/index",j.Host),bodyType,rio)
if err != nil {
fmt.Printf("Request faild,err)
return
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
fmt.Println(resp.StatusCode)
return
}
buf,err = IoUtil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("Read resp msg faild,err)
return
}
m := make(map[string]Exec)
err = json.Unmarshal(buf,&m)
if err != nil {
fmt.Printf("Unmarshal resp msg faild,err)
return
}
if len(m) > 0 {
for k,v := range m {
fmt.Printf("agent:%v\tFind AllFiles Size:%v\n",k,v.Size)
fmt.Printf("Find Files:%v\n",v.Files)
fmt.Printf("Find AbsFiles%v\n",v.AbsFiles)
}
} else {
fmt.Println("Can't found valied file.")
return
}
var enter string
for {
fmt.Print("Input 'Y' continue or 'N' exit:")
fmt.Scan(&enter)
switch {
case strings.Contains("Y,y",enter):
rio = bytes.NewReader(buf)
resp,err = http.Post(fmt.Sprintf("http://%v/run",rio)
if err != nil {
fmt.Println("Commit compress faild,err)
return
}
if resp.StatusCode != 200 {
fmt.Println("Resp stausCode:%v\n",resp.StatusCode)
}
return
case strings.Contains("N,n",enter):
return
default:
continue
}
}
}
func resolveIP(ip,port string) []string {
iplist := strings.Split(ip,")
if len(port) <= 0 {
return iplist
}
for index,value := range iplist {
if strings.Contains(value,":") {
continue
}
iplist[index] = value + ":" + port
}
return iplist
}
func readConfig(cfgPath string,cfg *job) {
buf,err := IoUtil.ReadFile(cfgPath)
if err != nil {
fmt.Printf("Read config file faild,err)
os.Exit(1)
}
err = json.Unmarshal(buf,cfg)
if err != nil {
fmt.Printf("Unmarshal config file faild,%s\n",err)
os.Exit(1)
}
}