package auto import ( "fmt" "strconv" "xg_auto_deploy/internal/global" "xg_auto_deploy/internal/models" "xg_auto_deploy/internal/remote" "xg_auto_deploy/internal/utils" "golang.org/x/crypto/ssh" ) func SendToNodes(nodeIds []string, local_file string, target_file string) { if nodeIds[0] == "all" { fmt.Println("is ALL") for _, nodeTemp := range global.ServerNodeConfigs { NodeId := nodeTemp.NodeId toNode(nodeTemp, NodeId, local_file, target_file) } return } if !IsNumericArray(nodeIds) { fmt.Println("传入指定节点参数错误,请检查:", nodeIds) return } global.Logs.Infoln("----------------开始发送文件----------------------------") for _, NodeId := range nodeIds { nodeTemp := global.ServerNodeConfigs[NodeId] toNode(nodeTemp, NodeId, local_file, target_file) } } func toNode(nodeTemp models.ServerNodeConfig, NodeId string, local_file string, target_file string) { if nodeTemp == (models.ServerNodeConfig{}) { global.Logs.Fatalf(" %s节点 配置不存在于配置文件中\n", NodeId) return } if local_file == "" { local_file = nodeTemp.LocalFile } if target_file == "" { target_file = nodeTemp.TargetFile } //传送文件 //检测上传为文件还是文件夹 ret, _ := utils.IsFileOrFolder(local_file) switch ret { case "file": err := remote.UploadFile(&nodeTemp, local_file, target_file) if err != nil { global.Logs.Fatalf("%s节点上传文件失败: %s\n", NodeId, err) return } global.Logs.Printf("%s节点上传文件成功\n", NodeId) case "folder": // 连接到远程主机 client, err := ssh.Dial("tcp", nodeTemp.IpPort, nodeTemp.SSHClient) if err != nil { panic(err) } defer client.Close() // 检测远端文件夹是否存在,不存在则创建 [ ! -d "/DATA2/GT/test" ] && mkdir -p /DATA2/GT/test remote.SingleCmd(&nodeTemp, fmt.Sprintf(`[ ! -d "%s" ] && mkdir -p %s`, target_file, target_file)) // 上传文件夹 err = remote.UploadDir(&nodeTemp, local_file, target_file) if err != nil { panic(err) } global.Logs.Printf("%s节点上传文件成功\n", NodeId) } } func IsNumericArray(arr []string) bool { for _, str := range arr { _, err := strconv.ParseFloat(str, 64) if err != nil { return false } } return true }