项目需要,需要一个agent客户端,调用shell脚本以实现自动化部署,写博客备忘
1.go语言开发客户端,调用本地指定脚本
package main
import (
. "agent"
"agent/conf"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"redis"
. "time"
)
var logfile, _ = os.OpenFile("agent.log", os.O_RDWR|os.O_CREATE, 0777)
var logger *log.Logger = log.New(logfile, "", log.LstdFlags|log.Lshortfile)
var latest_frequency int = Config.Heartbeat_frequency
type Task struct {
Taskid string
Script string
ScriptParam string
}
type Redis_Instance struct {
Port string
Password string
Path string
}
type Heart_message struct {
Frequency int
Tasks []Task
Instances []Redis_Instance
}
func main() {
for {
latest_frequency, tasks, instances := get_msg()
go handle_task(tasks)
go sync_config(instances)
Sleep(Duration(latest_frequency) * Minute)
}
}
func get_msg() (int, []Task, []Redis_Instance) {
var msg Heart_message
logger.Println("Config.Heartbeat_service=" + Config.Heartbeat_service)
if resp, err := http.Get(Config.Heartbeat_service + "/heartbeat"); err == nil && resp.StatusCode == http.StatusOK {
defer resp.Body.Close()
if data, err := ioutil.ReadAll(resp.Body); err == nil {
json.Unmarshal(data, &msg)
logger.Print(msg)
json.Unmarshal(data, &msg)
return msg.Frequency, msg.Tasks, msg.Instances
}
}else {
logger.Println("when get msg : do Nothing and return ..")
}
return latest_frequency, nil, nil
}
func handle_task(tasks []Task) {
for _, t := range tasks {
var success string = "0"
cmd := Command{
Cmd: t.Script + ".sh",
Args: t.ScriptParam,
}
if _, err := cmd.Execute(); err == nil { //result, err
success = "1"
logger.Println("task_id=" + t.Taskid + ",t.Script=" + t.Script + ",success=" + success)
}else {
logger.Println("task_id=" + t.Taskid + ",t.Script=" + t.Script + ",success=" + success)
}
i := 0
para := url.Values{
"taskId": {t.Taskid},
"status": {success},
}
for _, err := http.PostForm(Config.Heartbeat_service+"/callback", para); i < Config.Callback_retry && err != nil; i++ {
_, err = http.PostForm(Config.Heartbeat_service+"/callback", para)
}
}
}
func sync_config(instances []Redis_Instance) {
for _, instance := range instances {
if c, err := redis.Dial("tcp", "127.0.0.1:"+instance.Port); err != nil {
log.Println(err)
} else {
defer c.Close()
if configs, err := redis.Strings(c.Do("config", "get", "*")); err == nil {
if c, err := conf.ParseFile(instance.Path); err != nil {
log.Println(err)
} else {
for i := 0; i < len(configs); i += 2 {
if v, err := c.Get(configs[i]); v != configs[i+1] && err == nil {
c.Set(configs[i], configs[i+1])
}
}
}
}
}
}
}
2.主要是下面这个类
package agent
import (
"os/exec"
"strings"
)
type Command struct {
Cmd string
Args string
}
func (cmd *Command) Execute() ([]byte, error) {
var argArray []string
if cmd.Args != "" {
argArray = strings.Split(cmd.Cmd + " " + cmd.Args, " ")
} else {
argArray = make([]string, 0)
}
//如果是执行shell脚本 必须是这么写,如果是win下面执行bat文件,不指定/bin/sh,直接以cmd开头即可
//当然注意脚本的路径了
_cmd := exec.Command("/bin/sh", argArray...)
return _cmd.Output()
}
windows下面安装go和eclipse引入go插件比较简单,网上搜的
linux下也是一样的
go run agent.go直接编译后执行,没有生成可执行文件
go build -o goagent.sh 生成可执行文件
go build与go install有区别,小心使用
相关推荐
Elvish:友好的交互式Shell和表达性编程语言Elvish是友好的交互式Shell和表达性编程语言。 它可以在Linux,BSD,macOS和Windows上运行。 尽管Elvish处于1.0之前的状态,它还是一种友好的交互式Shell和表达性编程语言...
glsp-shell-演示这是演示如何通过在 golang 程序中嵌入来创建交互式 lispy shell 的基本示例代码。用法 $ make$ ./glisp-shell-demo glisp> (+ 1 1)> 2glisp> (defn add [a] (+ a 1))> ()glisp> (add 5)> 6glisp>...
Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以将反向外壳升级为完整的交互式反向器Girsh(Golang交互式反向外壳)谁不厌倦手动键入几行以进行升级将反向shell转换为完全交互式反向shell(tty生成,stty大小....
Thunder BoltDB的交互式Shell安装确保您具有正常的Go环境(需要Go 1.6或更高版本)。 请参阅安装说明。 要安装Thunder,只需运行:go get github.com/muesli/thun Thunder BoltDB的Interactive Shell安装确保您具有...
Docker的简单交互式提示。 从启发使用 。 目录 产品特点 建议docker命令 在docker exec / start / stop命令后列出容器ID和名称 根据键入的命令建议命令参数 在docker pull命令之后列出来自docker hub的图像 在...
go语言邮件反弹shell(windows+linux版,windows版用go1.7编译运行不报毒 此版本为后续改进debug版本,windows下可以编译去掉显示窗口 添加linux版本
走 以下为相关问题记录的目录:(可以复制相关问题关键字... golang shell工具(golang实现的交互式shell,实现一个简易版的交互终端) golang实现一个正向后门(backdoor,基于go的正向后门) golang实现一个反向后
因为rasm2仅支持32/64位操作码到机器代码的转换发布Sna概述基于unicorn的ASM shell目前仅支持x86和x64架构,发布https://github.com/cch123/asm-cli/releases快照X64模式:X86模式:依赖项keystone-engine / ...
Girsh(Golang交互式反向外壳) 谁不厌倦手动键入几行代码即可将反向shell升级为完整的交互式反向shell(tty生成,stty大小...,stty raw-echo)或键入使用的命令。 描述 使用Girsh,只需运行它,它将检测操作系统...
该库提供了一个简单的API,用于创建功能强大的CLI应用程序,并且如果在没有任何命令参数的情况下启动该应用程序,则会自动启动一个集成的交互式Shell 。 提示:我们不保证次要版本(1.x)之间100%向后兼容。 但是...
docker / cli该存储库是Docker CE和Docker EE产品中使用的cli的宿主。 开发docker / cli是使用Docker开发的。 构建Linux二进制文件:$ make -f docker.Makefile binary Build bin ...$ make -f docker.Makefile shell
它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供了动力。 功能完全支持Go规范Yaegi是另一个优雅的Go解释器。 它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供...
juusprime:用golang编写的Prime Tuplet生成2021年3月: 这是juusprime的软件包代码,juusprime是生成Prime Tuplet(Sextuplets和/或Quintuplet和/或Quadruplet)的引擎。 文件列表中提供了一个pdf文件,其中详细...
您还可以通过传递过程或使用交互式Shell在托管事务中顺序执行多个操作。 在多个操作中,您可以使用变量,游标,临时表和其他功能。 功能CSV文件操作选择查询插入查询更新查询替换查询删除查询创建表查询
用法#只需运行goscheme进入交互式shell goscheme#运行方案文件goscheme test.scm示例计算第n个斐波那契数; 计算第n个斐波那契数(定义(fib n)(如果(<= n 2)1(+(fib(-n 1))(fib(-n 2)))))...
Gosh (或Go shell)是一个使用Go的插件系统创建的框架,用于构建基于控制台的交互式shell程序。 一个gosh shell由执行一个或多个命令的Go插件集合组成。 当gosh启动时,它将在目录./plugins搜索实现命令插件的可用...
GitQuery安装检查Releases页面...shell启动一个交互式会话。 版本显示版本信息。 例如:$ cd my_git_repo $ gitquery查询'SELECT哈希,author_email,author_name FROM提交限制2;' SELECT散列,author_email,author_
用于eZmaxinc / eZmax-SDK-go的Go API客户端该API公开... API版本:1.0.37套件版本:1.0.37构建程序包:org.openapitools.codegen.languages.GoClientCodegen有关更多信息,请访问安装安装以下依赖项: go get github....
它在Go运行时的顶部为嵌入式解释器或交互式Shell中的可执行Go脚本和插件提供动力。 产品特点 完全支持 仅使用标准库,以纯Go语言编写 简单的解释器API: New() , Eval() , Use() 到处都可以工作 可从...
Golang CRIU ( ) 这个包不是官方的,只是一个与 rpc/protobuf criu 服务交互的实验包。如何使用这个库首先你需要一个正在运行的 criu 服务器$ sudo criu service -vvv -W criu -o service.log -b -x --address /tmp/...