send_file.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package auto
  2. import (
  3. "fmt"
  4. "strconv"
  5. "xg_auto_deploy/internal/global"
  6. "xg_auto_deploy/internal/models"
  7. "xg_auto_deploy/internal/remote"
  8. "xg_auto_deploy/internal/utils"
  9. "golang.org/x/crypto/ssh"
  10. )
  11. func SendToNodes(nodeIds []string, local_file string, target_file string) {
  12. if nodeIds[0] == "all" {
  13. fmt.Println("is ALL")
  14. for _, nodeTemp := range global.ServerNodeConfigs {
  15. NodeId := nodeTemp.NodeId
  16. toNode(nodeTemp, NodeId, local_file, target_file)
  17. }
  18. return
  19. }
  20. if !IsNumericArray(nodeIds) {
  21. fmt.Println("传入指定节点参数错误,请检查:", nodeIds)
  22. return
  23. }
  24. global.Logs.Infoln("----------------开始发送文件----------------------------")
  25. for _, NodeId := range nodeIds {
  26. nodeTemp := global.ServerNodeConfigs[NodeId]
  27. toNode(nodeTemp, NodeId, local_file, target_file)
  28. }
  29. }
  30. func toNode(nodeTemp models.ServerNodeConfig, NodeId string, local_file string, target_file string) {
  31. if nodeTemp == (models.ServerNodeConfig{}) {
  32. global.Logs.Fatalf(" %s节点 配置不存在于配置文件中\n", NodeId)
  33. return
  34. }
  35. if local_file == "" {
  36. local_file = nodeTemp.LocalFile
  37. }
  38. if target_file == "" {
  39. target_file = nodeTemp.TargetFile
  40. }
  41. //传送文件
  42. //检测上传为文件还是文件夹
  43. ret, _ := utils.IsFileOrFolder(local_file)
  44. switch ret {
  45. case "file":
  46. err := remote.UploadFile(&nodeTemp, local_file, target_file)
  47. if err != nil {
  48. global.Logs.Fatalf("%s节点上传文件失败: %s\n", NodeId, err)
  49. return
  50. }
  51. global.Logs.Printf("%s节点上传文件成功\n", NodeId)
  52. case "folder":
  53. // 连接到远程主机
  54. client, err := ssh.Dial("tcp", nodeTemp.IpPort, nodeTemp.SSHClient)
  55. if err != nil {
  56. panic(err)
  57. }
  58. defer client.Close()
  59. // 检测远端文件夹是否存在,不存在则创建 [ ! -d "/DATA2/GT/test" ] && mkdir -p /DATA2/GT/test
  60. remote.SingleCmd(&nodeTemp, fmt.Sprintf(`[ ! -d "%s" ] && mkdir -p %s`, target_file, target_file))
  61. // 上传文件夹
  62. err = remote.UploadDir(&nodeTemp, local_file, target_file)
  63. if err != nil {
  64. panic(err)
  65. }
  66. global.Logs.Printf("%s节点上传文件成功\n", NodeId)
  67. }
  68. }
  69. func IsNumericArray(arr []string) bool {
  70. for _, str := range arr {
  71. _, err := strconv.ParseFloat(str, 64)
  72. if err != nil {
  73. return false
  74. }
  75. }
  76. return true
  77. }