用Go写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载

原创 2015年08月17日 16:03:01
package main

import (
	"archive/tar"
	"bufio"
	"bytes"
	"compress/gzip"
	"flag"
	"fmt"
	"io"
	"net/http"
	"os"
	"os/exec"
	"regexp"
	"sort"
	"text/template"
	"time"
)

type ID_info map[string]string

var Config *ID_info
var re *regexp.Regexp

func main() {
	listen := flag.String("l", ":1789", "-l= 127.0.0.1:1789")
	config := flag.String("c", "cfg", "-c=cfg")
	flag.Parse()
	Config = parseconfig(*config)
	re, _ = regexp.Compile("[0-9]{7}$")
	http.Handle("/download/", http.FileServer(http.Dir("./")))
	http.HandleFunc("/", router)
	http.ListenAndServe(*listen, nil)
}

func router(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == "/" {
		M := template.New("")
		M.Parse(Index)
		M.Execute(w, Config.Sort())
		return
	}
	if s := re.FindString(r.URL.Path); len(s) != 0 {
		ip, x := Config.Map()[s]
		if x {
			if _, e := os.Stat(s); e == nil {
				if list := parse(r); len(list) > 0 {
					var tar_list []string
					for _, v := range list {
						desc := fmt.Sprintf("download/%s/%s_%s.log", s, time.Now().Format("20060102"), v)
						tar_list = append(tar_list, desc)
						Excute(ip, v, desc)
					}
					zip(s, tar_list)
					w.Write([]byte(fmt.Sprintf("下载地址:http://%s/download/%s/%s.tar.gz", r.Host, s, time.Now().Format("20060102"))))
					return
				}
				w.Write([]byte(package_page))
			} else {
				if list := parse(r); len(list) > 0 {
					os.MkdirAll(fmt.Sprintf("download/%s", s), 0644)
					var tar_list []string
					for _, v := range list {
						desc := fmt.Sprintf("download/%s/%s_%s.log", s, time.Now().Format("20060102"), v)
						tar_list = append(tar_list, desc)
						Excute(ip, v, desc)
					}
					zip(s, tar_list)
					w.Write([]byte(fmt.Sprintf("下载地址:http://%s/download/%s/%s.tar.gz", r.Host, s, time.Now().Format("20060102"))))
					return
				}
				w.Write([]byte(package_page))
			}
			return
		}
		w.Write([]byte(fmt.Sprintf("%s  不存在", s)))
		return
	}
}

func Excute(ip, processname, name string) {
	fmt.Printf("ton %s:/data/gamehome/server/%s/nohub.out %s\n", ip, processname, name)
	cmd := exec.Command("ton", fmt.Sprintf("%s:/data/gamehome/server/%s/nohub.out", ip, processname), name)
	cmd.Run()
}

func parseconfig(path string) *ID_info {
	File, err := os.Open(path)
	defer File.Close()
	if err != nil {
		panic(err)
	}
	result := make(ID_info)
	B := bufio.NewReader(File)
	for {
		line, _, e := B.ReadLine()
		if e != nil {
			if e == io.EOF {
				break
			}
			panic(e)
		}
		list := bytes.Split(line, []byte{58})
		result[string(list[0])] = string(list[1])
	}
	return &result
}
func (self *ID_info) Map() ID_info {
	return *self

}
func (self *ID_info) Sort() []string {
	var list []string
	for k, _ := range *self {
		list = append(list, k)
	}
	sort.Strings(list)
	return list
}

func parse(r *http.Request) []string {
	var list []string
	for k, _ := range r.URL.Query() {
		list = append(list, k)
	}
	return list
}

func zip(id string, list []string) {
	File, _ := os.OpenFile(fmt.Sprintf("download/%s/%s.tar.gz", id, time.Now().Format("20060102")), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
	defer File.Close()
	Gzip := gzip.NewWriter(File)
	defer Gzip.Close()
	Tar := tar.NewWriter(Gzip)
	defer Tar.Close()
	for _, v := range list {
		T, err := os.Open(v)
		if err != nil {
			fmt.Printf("压缩文件:%s\n", v)
			fmt.Println(err)
			continue
		}
		defer T.Close()
		head := new(tar.Header)
		Fileinfo, _ := T.Stat()
		head.Name = Fileinfo.Name()
		head.Size = Fileinfo.Size()
		head.Mode = int64(Fileinfo.Mode())
		head.ModTime = Fileinfo.ModTime()
		Tar.WriteHeader(head)
		io.Copy(Tar, T)
	}
	return
}

const Index = `<html>  
<title>文件列表</title>  
<body> 
{{range .}}<a href="/{{.}}">{{.}}</a><br>{{end}}
</body>  
</html>`

const package_page = `<html><meta charset="utf-8">
<body>
	<form action="" method="get"> 
		选取需要拖取的日志:<br /><br />
		<label><input name="1" type="checkbox" value="true" />Game </label> 
		<label><input name="2" type="checkbox" value="true" />Gate </label> 
		<label><input name="3" type="checkbox" value="true" />Mail </label> 
		<label><input name="4" type="checkbox" value="true" />Fight</label> 
		<label><input name="5" type="checkbox" value="true" />Fight2</label> 
		<label><input name="5" type="checkbox" value="true" />Fight3</label> 
		<br /><br />
		<input type="submit" value="打包下载"><br />
		打包需要后台执行,这个过程是阻塞的,时间可能会比较久
	</form> 
</body>
</html>`
代码写的很低效,时间特别短,为了实现功能而实现,有时间再优化代码吧
版权声明:本文为博主原创文章,交流邮箱czxichen@163.com,交流群:259693140(此群不允许闲聊)

IE11 —— F12 开发者工具

F12 开发者工具 简介 使用 F12 开发人员工具,你可以调试、测试网页并加快其速度。无论你是需要微调你的 CSS 布局还是查找内存泄漏,你都能在此处找到帮助工具。 如果你正在 I...
  • binyao02123202
  • binyao02123202
  • 2014年12月15日 16:22
  • 22403

使用GO开发桌面GUI程序

使用GO来开发桌面GUI程序,个人感觉有几个好处: 静态编译后只生成单个文件。实现小型和工具型程序不需依赖,易于分享。 直接编译为exe等可执行文件,不用像PyQt、Electron那样再打包。 跨平...
  • github_38589282
  • github_38589282
  • 2017年11月09日 21:29
  • 955

go实现的一个监控日志报警程序

package main import ( "compile" "encoding/json" "flag" "fmt" "io/ioutil" "libconf/goini" log...
  • qiuyoujie
  • qiuyoujie
  • 2017年12月29日 15:43
  • 117

GO语言实现的简单“木马”小程序

初学GO语言可能会感觉到很枯燥,而且GO和其他的编程语言的语法还有很大的差异,可能刚开始很难入门,为了提高对GO语言的学习兴趣,快速地掌握GO的基本语法,我尝试写了个类似后门的小程序,主要的功能是可以...
  • zhaowen25
  • zhaowen25
  • 2016年11月06日 13:17
  • 1622

Go语言使用http下载文件

package main import ( "fmt" "io" "net/http" "os" ) var ( url = "http://127.0.0.1:1789/src/qq....
  • fyxichen
  • fyxichen
  • 2015年07月16日 17:44
  • 6069

golang文件下载

golang文件下载 func downloadFile(fileFullPath string, res *restful.Response) { file, err := os.Open(fi...
  • yueguanyun
  • yueguanyun
  • 2016年11月18日 14:47
  • 1793

Go语言实现Windows命令行下载文件.

package main import ( "fmt" "io" "net/http" "os" "strings" "sync" ) var go_lock sync.WaitGro...
  • fyxichen
  • fyxichen
  • 2015年10月20日 11:01
  • 960

Golang优秀开源项目汇总(持续更新。。。)

Golang优秀开源项目汇总: 按照监控系统, 容器技术, paas工具, 大数据, 数据库技术, 分布式系统等等分类,汇总了比较众多知名的go语言开源项目。 在开源社区, go的开发者用go技术栈开...
  • hackstoic
  • hackstoic
  • 2016年07月23日 23:55
  • 22764

用Go写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载

package main import ( "archive/tar" "bufio" "bytes" "compress/gzip" "flag" "fmt" "io" "net/...
  • fyxichen
  • fyxichen
  • 2015年08月17日 16:03
  • 1218

在ubuntu上搭建go编程环境(附带自动化部署脚本)

自2009年Go语言发布以来,我一直在关注Go语言,如今Go语言已经发展到1.2版本,而且也收到越来越多的人关注这门语言。Go语言设计的目的就是为了解决执行数度快但是编译数度并不理想(如C++)以及编...
  • trochiluses
  • trochiluses
  • 2014年10月28日 15:58
  • 1440
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Go写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载
举报原因:
原因补充:

(最多只允许输入30个字)