Golang实现一个批量自动化执行树莓派指令的软件(6)简易批量指令处理

news/2024/10/19 7:29:01/

简介

基于上篇 Golang实现一个批量自动化执行树莓派指令的软件(5)模块整合, 这里我们实现简单的从配置文件设置指令集, 然后程序自动运行指令集的操作。

环境描述

运行环境: Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS
目标终端:树莓派DebianOS(主要做用它测试)

实现

package controllerimport ("encoding/json""fmt""os""ssh_remote_access/app""ssh_remote_access/models""ssh_remote_access/sshutil""ssh_remote_access/utils""sync""time"
)type JobController struct {settings models.Settingssshutil  *sshutil.SSHUtil
}func NewJobController(decryptionKey string, cfgPath string) (*JobController, error) {var (controller   = &JobController{}err          errorencrypt      *utils.EncryptionrealPassword string)/* 加载文件 */if err = controller.loadConfig(cfgPath); nil != err {return nil, err}/* 组合配置信息 */encrypt = utils.NewEncryption(decryptionKey)if realPassword, err = encrypt.Decrypt(controller.settings.User.Password); nil != err {return nil, err}controller.sshutil, err = sshutil.NewSSHUtil(sshutil.SSHConfig{IP:       controller.settings.Network.IP,Port:     controller.settings.Network.Port,Timeout:  controller.settings.Network.Timeout,User:     controller.settings.User.Name,Password: realPassword,})return controller, err
}func RunJobList() error {var (controller *JobControllererr        error)/* 初始化任务列表 */controller, err = NewJobController(app.ASE_KEY, app.CONFIG_PATH)if nil != err {fmt.Println("run job list fail, ", err.Error())return err}defer controller.Destroy()/* 执行任务 */err = controller.RunJobs(func(currFinishedJob models.SSHJob, jobNum, fnishedNum uint) error {fmt.Printf("job_type: %d, total job: %d, finished job: %d.\n", currFinishedJob.Type, jobNum, fnishedNum)return nil})return err
}func (j *JobController) Destroy() error {return j.sshutil.Destroy()
}func (j *JobController) loadConfig(filepath string) error {var bs, err = os.ReadFile(filepath)if nil != err {return err}err = json.Unmarshal(bs, &j.settings)return err
}func (j *JobController) RunJobs(processCallback func(currFinishedJob models.SSHJob, jobNum, fnishedNum uint) error) error {var (waiter sync.WaitGrouperr    error)for i, job := range j.settings.JobList {waiter.Add(1)time.Sleep(time.Duration(job.BeforeSleep) * time.Millisecond)switch models.SSH_TYPE(job.Type) {case models.SSH_COMMAND:_, err = j.sshutil.Commander().Command(job.Command)if nil != err {return err}case models.SSH_UPLOAD:err = j.sshutil.SFTFClient().UploadWithCallback(job.From, job.To, func(from, to string, num, uploaded uint) {fmt.Println("upload from ", from, " to ", to, ", total_num ", num, " upload_num ", uploaded)}, func(err error) {fmt.Println("upload finished")}, false)if nil != err {return err}case models.SSH_DOWNLOAD:err = j.sshutil.SFTFClient().DownloadWithCallback(job.From, job.To, func(from, to string, num, downloaded uint) {fmt.Println("download from ", from, " to ", to, ", total_num ", num, " download_num ", downloaded)}, func(err error) {fmt.Println("download finished")}, false)if nil != err {return err}}time.Sleep(time.Duration(job.AfterSleep) * time.Millisecond)if err = processCallback(job, uint(len(j.settings.JobList)), uint(i+1)); nil != err {}}return err
}

测试用例

代码源

https://gitee.com/grayhsu/ssh_remote_access

视频

Golang实现远程ssh访问-简单批量化指令示例

其他

参考


http://www.ppmy.cn/news/1443362.html

相关文章

OpenHarmony开源软件供应链安全风险

慕冬亮,华中科技大学网络空间安全学院副教授,武汉英才,华中科技大学OpenHarmony技术俱乐部、开放原子开源社团指导教师。研究方向为软件与系统安全,在国际安全会议上发表十余篇论文,并获得ACM CCS 2018杰出论文奖。创立…

抽象代理模式2.0版本

前言: 1.0版本的核心 代理的定义 A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large object in memory, a file, or some other resource t…

CSS_scss切换主题

目录assets/theme以下新建文件 _handle.scss import ./_themes.scss;// 定义混合指令, 切换主题,并将主题中的所有规则添加到theme-map中 mixin themify() {// 将themes中规则放入theme-mapeach $theme-name,$theme-map in $themes {$theme-map: $theme-map !global;[data-t…

4.Docker本地镜像发布至阿里云仓库、私有仓库、DockerHub

文章目录 0、镜像的生成方法1、本地镜像发布到阿里云仓库2、本地镜像发布到私有仓库3、本地镜像发布到Docker Hub仓库 Docker仓库是集中存放镜像的地方,分为公共仓库和私有仓库。 注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库&…

IDEA 中的奇技淫巧

IDEA 中的奇技淫巧 书签 在使用ctrlalt方向键跳转时,或者追踪代码时,经常遇到的情况是层级太多,找不到代码的初始位置,入口。可以通过书签的形式去打上一个标记,后续可以直接跳转到书签位置。 标记书签:c…

【STM32 IIC通信与温湿度传感器AHT20(I2C_AHT20)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 最终效果展示AHT20温湿度传感器(I2C_AHT20) 1、工程配置2、代码如果您发现文章有错误请与我留言,感谢 最终效果展示 详细讲解视频…

Maven介绍 主要包括Maven的基本介绍,作用,以及对应的Maven模型,可以对Maven有一个基本的了解

1、Maven介绍 1.1 什么是Maven Maven是Apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 官网:https://maven.apache.org/ Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会&…

C++:拷贝构造函数与赋值的区别

目录 拷贝构造函数 拷贝构造函数的使用方法 拷贝构造函数与赋值运算符的区别 谈深拷贝和浅拷贝 浅拷贝 注意: 深拷贝 拷贝构造函数 拷贝构造函数的也是一种构造函数,它的作用是将一个类的成员拷贝到另一个类中,类似于赋值。拷贝构造函数分为深拷贝和浅拷贝。 先来定义一…