用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(此群不允许闲聊)

go语言之脚本命令的使用

比如说我想在go项目启动的时候,也把java项目启动,那么我就可以把启动java项目的脚本命令放入到go项目中 go语言也为我们提供了执行脚本命令的包 “os/exec” 1.引入 "os/exe...

带交互的telnet小工具,golang版

package netTools //main // import ( "fmt" "net" "strconv" "strings" "time" ) func smain() { ...

Go语言使用http下载文件

package main import ( "fmt" "io" "net/http" "os" ) var ( url = "http://127.0.0.1:1789/src/qq....

beego view 层遇到的坑

今天用beego在开发东西。一个修改的需求。有个地方需要 循环一个表的数据到select下拉框出。这个数据有选择这个值。那就默认进行选中,但是在代码写完遇到这样的一个错误. 这个意思说 info 不是...

BeegoAdmin 使用总结

BeegoAdmin 获取安装 执行以下命令,就能够在你的GOPATH/src 目录下发现beego admin $ go get github.com/beego/admin ...

自行控制loadrunner的socket协议性能测试 (转) 一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字

自行控制loadrunner的socket协议性能测试 (转)   一前言二任务的提出三实现方案讨论四技术要点讲解 如何开始录制一个最简单的收发数据包脚本写日志文件一行一行读数据包文...

使用CFile类写日志文件的一个程序

  • 2014年04月02日 09:52
  • 1.79MB
  • 下载

初学shell,今天遇到由wget下载到本地的网页源代码的乱码问题,无聊的写了一个转码的脚本

今天用wget想下载文件,结果下载了一堆本地的index.html文件,一查看全是乱码,然后百度了一下,网页的编码格式大概有三种: 1、utf-8 2、gb2312 3、gbk 要在网页源码中...

清除sql日志文件工具

  • 2012年04月09日 17:04
  • 255KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Go写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载
举报原因:
原因补充:

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