用GO按老大要求写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载

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>`

代码写的很低效,时间特别短,为了实现功能而实现,有时间再优化代码吧

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 16:12:58

用GO按老大要求写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载的相关文章

【开源一个小工具】一键将网页内容推送到Kindle

最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zhanjindong/SimpleSendToKindle 功能:Windows下一个简单的将网页内容推送到Kindle的工具. 写这个工具的是满足自己的需求.自从买了Kindle paperwhite 2,它就成了我使用率最高的一个电子设备.相信很多Kindle拥有者和我一样都有这样一个需求:就是白

分享一个小工具:UnityRemoteLog

最近经常需要调试Unity客户端的Android版,看LOG是一个最基本的调试方法了.为了看LOG,总要看Eclipse这么重量级的工具,觉得还是有点麻烦,于是抽了点业余时间写了一个小工具:把Unity的LOG使用网络连接转发到一个PC端的窗口程序中. 使用方法 将RemoteLog.cs拷贝到你的Unity Project里面: 在任意一个MonoBehavior脚本的Start()函数中,调用RemoteLog.Instance.Start(主机IP,端口):目前默认端口是2010: 运行U

使用寻路算法写的一个小项目

用寻路算法写的一个小项目 地址 https://a1115040996.github.io/arithmetic/html/寻路应用.html 没来得及仔细优化,后面再优化 代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="t

写个js小工具自动生成博文目录

我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做吧,研究了2天,总算是按照自己的设想做出来了,最终效果如下: 下面来介绍一下这个小工具的实现. 一.

介绍一个小工具 Linqer

原文:介绍一个小工具 Linqer 这些天写Linq挺烦人的,就上网搜搜可有什么好的sql转Linq的工具,咦,马上就看上了Linqer. 哈哈,介绍一下使用方法吧: 官方下载网站:http://sqltolinq.com/download. 第一步:运行这个神马文件. 第二步:指定一个路径给它.他会生成一个Linqer.exe可运行的文件. 第三步:运行这个exe文件,点击Add按钮, 第四步:在弹出的Add界面中,给串串取个名字(如这里面的Demo),点右边的“省略号”按钮,会弹出你做梦都会

原生JS写了一个小demo,根据输入的数字生成不同背景颜色的小方块儿~

昨天练习写了这个小demo,个人觉得通过设置定位元素left和top的值,来实现换行的功能,这种方法很巧妙~ 另外,如下代码中的随机颜色的获取,还请各位前辈多多指教:需要改进的地方:或者有没有更好的方法. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style type="text

网站发布助手V1.1 (去年写的简单小工具)

去年在更新网站内容时老是要输入重复的话,所以就写了一个很简单的工具(很菜的). 网站发布助手V1.1(使用快捷键快速输入自定义的文本)    网站发布助手是一个多次复制粘贴工具,能够快速将自己事先定义好的的文本通过快捷键粘贴到想要发布的地方,软件有8个快捷键,分别是F1.F2.F3.F4.数字键1.数字键2.数字键3.数字键4,在软件目录下的st.txt能够自定义要粘贴的内容,由上到下每行分别对应一个相应快捷键.当你每天重复大量相同文本录入的时候本软件可以减轻你的负担,让你快捷的输入文本.   

分享一个小工具:Excel表快速转换成JSON字符串

在游戏项目中一般都需要由策划制作大量的游戏内容,其中很大一部分是使用Excel表来制作的.于是程序就需要把Excel文件转换成程序方便读取的格式. 之前项目使用的Excel表导入工具都是通过Office Excel组件来实现数据访问的,效率十分令人不满.一个端游项目一般要上百个表格,手游项目20.30个表格基本也是要的,于是表格导入程序的过程一般要几分钟,项目后期要接近半个小时. 此次分享的小工具,在速度上有质的飞越,比上述方法实现的工具有接近100倍的速度提升: 完整项目源代码下载:https

x01.TextProc: 两三分钟完成的一个小工具

在工作中,遇到这么个问题,需要将 Excel 表中类似 2134-1234-4456 的商品编号输入到单位的程序中,而程序只认 213412344456 这种没有 ‘-’ 的输入.数量比较多,一笔一笔的敲,费时费力不可取,所以转换一下,复制粘贴,不仅可以提高速度,而且也不易出错.并且,由于 Excel 表是别人提供,可能反复遇到此问题,所以写个转换的小工具是必要的. 直接操作 Excel 吗?问题 ”矮小下“,显然用不着这么麻烦.我的方法是,将商品编号列复制粘贴到记事本中保存为 temp.txt