`

go语言四—脚本二

 
阅读更多

记录一些go脚本,使用定时器,信号,go轻量级线程,调用系统命令,压缩,计算md5,列表,获取本机IP等功能

(向程序发送信号如:kill -2 进程号)

package main

import (
	"os"; "os/signal"; "os/exec"
	"syscall"
	"net"
	"time"
	"strconv"; "strings"
	"bufio"
	"io/ioutil"
	"fmt"
	"archive/zip"
	"crypto/md5"
	l "container/list"
	"bytes"
//	"encoding/hex"
	"io"
)

const (
	path string = "/root/logs/"

	log_pos string = "log_watcher.pos"
	log_access string = "access.log"
	log_upload string = "upload_access.log"

	salt string = "salt-value"
)

var restarter int = 0
var localip string
var uploadfiles = l.New()

//------------------------------------------------------------------------------

func check(err error) bool {
	if err != nil {
//		panic(err)
		return false
	}
	return true
}

func get_local_ip() (string) {
	ifi, err := net.InterfaceByName("eth0")
	check(err)
	addrs, err := ifi.Addrs()
	check(err)
	for _,a := range addrs {
		if ip := strings.Split(a.String(),"/"); len(ip) > 1 {
			return ip[0]
		}
	}

	ifi, err = net.InterfaceByName("bond0")
	check(err)
	addrs, err = ifi.Addrs()
	check(err)
	for _,a := range addrs {
		if ip := strings.Split(a.String(),"/"); len(ip) > 1 {
			return ip[0]
		}
	}

	ifi, err = net.InterfaceByName("br0")
	check(err)
	addrs, err = ifi.Addrs()
	check(err)
	for _,a := range addrs {
		if ip := strings.Split(a.String(),"/"); len(ip) > 1 {
			return ip[0]
		}
	}

	panic("IP")
}

func load_data(filename string) (string) {
	buff, err := ioutil.ReadFile(filename)
	if !check(err) { return "" }
	return string(buff)
}

func save_data(filename, data string) {
	f, err := os.OpenFile(filename, os.O_WRONLY | os.O_CREATE | os.O_TRUNC , 0755)
	if !check(err) { return }
	defer f.Close()

	f.WriteString(data)
}

//------------------------------------------------------------------------------

func restart() {
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, syscall.SIGINT)
	for {
		<-ch
		restarter = 1
	}
}

//------------------------------------------------------------------------------

func upload_append(filename, line string) {
	f, err := os.OpenFile(filename, os.O_RDWR | os.O_CREATE | os.O_APPEND , 0755)
	if !check(err) { return }
	defer f.Close()

	f.WriteString(line)
}


func worker(pos int64, line string) {

	upload_append(log_upload, line)

	if int(pos) % 10 ==0 {
		save_data(log_pos, strconv.Itoa(int(pos)))
	}
}

//------------------------------------------------------------------------------

func compress() {
	// compress
	t := time.Now().Format("20060102_15_04")
	filename := path + "upload_access_" + t + ".zip"

	outf, err := os.Create(filename)
	if !check(err) { return }
	defer outf.Close()
	//defer os.Remove(filename)

	zw := zip.NewWriter(outf)
	f, err := zw.Create(log_upload)
	if !check(err) { os.Remove(filename); return }

	buff, err := ioutil.ReadFile(log_upload)
	if !check(err) { os.Remove(filename); return }

	_, err = f.Write(buff)
	if !check(err) { os.Remove(filename); return }
	zw.Close()

	os.Remove(log_upload)

	uploadfiles.PushFront(filename)

}

func upload() {

	file := uploadfiles.Back()
	if file != nil {
		filename,_ := file.Value.(string)

		ts := strconv.Itoa(int(time.Now().Unix()) - 8 * 3600)
		h := md5.New()
		io.WriteString(h, salt + string(ts))
		k := fmt.Sprintf("%x", h.Sum(nil))
		k = k[0:10]

		var out bytes.Buffer
		cmd := exec.Command("/bin/sh","-c","curl -F \"action=upload\" -F \"t="+string(ts)+"\" -F \"k="+k+"\" -F \"f="+localip+"\" --limit-rate 50k --connect-timeout 60 --max-time 600 -F \"Filedata=@"+filename+"\" \"http://127.0.0.1/test.php\"")
		cmd.Stdout = &out
		err := cmd.Run()
		if !check(err) { return }
		if out.String() == "1" {
			uploadfiles.Remove(file)
			os.Remove(filename)
		}
	}
}

func compress_timer() {
	for {
		timer := time.NewTicker(250 * time.Second)
		for {
			select {
			case <- timer.C:
				go compress()
			}
		}
	}
}

func upload_timer() {
	for {
		timer := time.NewTicker(30 * time.Second)
		for {
			select {
			case <- timer.C:
				upload()
			}
		}
	}
}

//------------------------------------------------------------------------------

func main() {
	os.Chdir(path)

	//get local ip
	localip = get_local_ip()

	//set timer to upload
	go compress_timer()
	go upload_timer()
	go restart()

	//load info
	cur_pos := load_data(log_pos)

	//read access log
	f, err := os.OpenFile(log_access, os.O_RDONLY, 0)
	if !check(err) { return }

	pos, _ := strconv.ParseInt(cur_pos, 0, 64)
	_, err = f.Seek(pos, os.SEEK_SET)
	if !check(err) { return }

	br := bufio.NewReader(f)
	for {
		line , err := br.ReadString('\n')
		pos, _ = f.Seek(0, os.SEEK_CUR)
		if err == io.EOF {
			time.Sleep(1 * time.Second)
			if restarter == 1 {
				f.Close()
				f, _ = os.OpenFile(log_access,os.O_RDONLY,0)
				_, err = f.Seek(0, os.SEEK_SET)
				br = bufio.NewReader(f)
				restarter = 0
			}
		} else {
			go worker(pos, line)
		}
	}

}

 

分享到:
评论

相关推荐

    实现京东抢茅台脚本源码go语言

    Go语言,也称为Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言,因其高效性能和简洁的语法而受到广大开发者喜爱。在后端开发领域,Go语言以其强大的并发处理能力而独树一帜,这...

    Go-Tengo是Go的可嵌入脚本语言

    Go-Tengo是Go语言的一个重要扩展,它提供了一种可嵌入的脚本语言能力,使得开发者能够在Go程序中执行动态脚本。这种特性在许多场景下非常有用,比如游戏开发、数据分析、自动化任务处理或者作为配置语言等。Tengo的...

    基于Shell、Python、Go语言的脚本诊断工具设计源码

    该项目是一款集成Shell、Python和Go语言编写的脚本诊断工具设计源码,总共有44个文件,其中包括23个Shell脚本文件、7个Python脚本文件、2个Markdown文件、1个许可证文件、1个awk脚本文件、1个toprc配置文件、1个Vim...

    Go-gpython是采用Go语言编写的Python3.4解释器

    Go语言,又称Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率。Go语言的特性包括简洁的语法、高效的并发模型(goroutines和...

    Go-Neugram一种与Go集成的脚本语言

    Go-Neugram是一种独特的编程语言,它设计的目的是与Go语言紧密结合,提供了一种用于与Go软件包交互的轻量级脚本解决方案。通过利用Go的语法结构和类型系统,Go-Neugram旨在为开发者提供一种既熟悉又高效的工具,以便...

    毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip

    毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价...

    基于Go语言的脚本版本管理与定时运行托管服务设计源码

    该项目是一款基于Go语言的脚本版本管理与定时运行托管服务设计源码,包含25个文件,涵盖Go源码、Python脚本、HTML模板以及SQL数据库文件。系统旨在实现脚本的版本控制与自动化运行,适用于构建高效的脚本托管与执行...

    Go的快速脚本语言-Golang开发

    Tengo语言Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是快速和安全的,因为它在本机Go中编写的基于堆栈的VM上被编译/执行为字节码。 / * Tengo语言Tengo语言Tengo是Go的一种小型,动态,快速,安全的...

    FLASH脚本语言详解.doc

    FLASH脚本语言详解 FLASH脚本语言是用于创建交互式FLASH动画和应用程序的脚本语言,具有强大的编程能力和灵活的应用性。 FLASH脚本语言可以用来控制FLASH电影的播放、交互、动画和其他效果。 FLASH脚本语言的主要...

    使用 Go 语言实现的简单的 Lua 解释器。.zip

    Go 语言以其高效的性能、简洁的语法和强大的并发支持而备受推崇,而 Lua 则是一种轻量级的脚本语言,常用于游戏开发和其他嵌入式系统。结合两者,我们可以创建一个快速且易于维护的解释器。 首先,我们要理解 Lua ...

    linux-updategolang一个脚本轻松获取并安装新Golang版本

    `update-golang`是一个专为Linux开发环境设计的实用工具,它使得Go语言版本的管理和更新变得轻而易举。 首先,让我们深入了解`update-golang`脚本的工作原理。这个脚本通常由bash编写,它会自动检测当前系统的...

    golang构建脚本使用案例(偏向工程上)

    Golang作为一种静态类型的编程语言,其构建过程相比其他语言更为简洁,但是通过编写构建脚本,我们可以进一步提高工程的可维护性和复用性。 首先,让我们来看看“生成多个可执行文件”这一知识点。在Golang中,一个...

    基于go语言的定时脚本任务.zip

    基于go语言的定时脚本任务.zip 示例代码 package xz_crontab import ( "context" "log" "testing" "time" ) func Test_crontab(t *testing.T) { jobs := []Job{ { Name: "test", Par: "1", //...

    go语言PDF---golang

    Go语言,又称为Golang,是由Google设计的一种开放源代码的编程语言。它具备高效性、简洁性和易用性的特点,在现代软件开发领域备受青睐。以下是Go语言的一些关键特性: 1. **快速编译**: Go语言能在几秒钟内编译...

    Go语言中通过Lua脚本操作Redis的方法

    在Go语言中,我们可以利用Lua脚本来操作Redis数据库,以此提高效率并确保操作的原子性。Redis支持在服务器端执行Lua脚本,这样可以减少网络通信的开销,并且提供了事务处理般的特性,保证了脚本执行的完整性。本文将...

    基于Go语言和Shell脚本的Kubernetes多集群云原生平台Kurator设计源码

    该项目是采用Go语言、Shell脚本及HTML编写的开源云原生平台Kurator的设计源码,包含578个文件,涵盖226个YAML配置文件、218个Go源文件、50个Markdown文档、21个Shell脚本、10个HTML文件、9个模板文件、8个PNG图片...

    Python到Go语言之路

    本文讲述了作者从Python转向Go语言的心路历程,强调了Go语言在语法结构、项目布局、类型系统等方面的显著特点,以及在切换语言过程中遇到的差异和挑战,并提供了克服这些挑战的建议和资源。 首先,作者表达了对...

    GO语言教程+源码范例合集

    go语言入门进阶学习资料包:go语言入门,go语言常见问题,beego框架学习资料及项目管理,后台管理等等各种应用范例含源码及MYSQL数据库脚本,值得大家学习。特分享给大家,希望go语言越来越受关注。

Global site tag (gtag.js) - Google Analytics