FileRouter.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package router
  2. import (
  3. "ARKItems/configs"
  4. "archive/zip"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "io"
  9. "io/ioutil"
  10. "os"
  11. "path/filepath"
  12. "strings"
  13. "time"
  14. )
  15. var (
  16. BackupFileList = make([]string, 0)
  17. // ServerConfigUrls 实际服务器目录,商店插件配置文件位置
  18. ServerConfigUrls = make([]string, 0)
  19. )
  20. func init() {
  21. ReadBackupFileList()
  22. }
  23. func ARKFileRouter(api *gin.RouterGroup) {
  24. //安装插件
  25. api.GET("/installPlugin", InstallArkApiZip)
  26. //保存配置到配置文件
  27. api.GET("/saveConfig", WriteFileConfig)
  28. //更新实际配置文件内容
  29. api.GET("/updateServerShopApiConfig", UpdateServerShopApiConfig)
  30. }
  31. func UpdateServerShopApiConfig(c *gin.Context) {
  32. marshal, err := json.Marshal(ARKConfig)
  33. if err != nil {
  34. fmt.Println(err)
  35. c.JSON(200, CreateResultError(500, "配置文件读取失败"))
  36. }
  37. for i := range ServerConfigUrls {
  38. ioutil.WriteFile(ServerConfigUrls[i], marshal, 0644)
  39. }
  40. //TODO 可能需要调用rcon功能,更新配置
  41. c.JSON(200, CreateResult())
  42. }
  43. // InstallArkApiZip 安装ArkApi
  44. func InstallArkApiZip(c *gin.Context) {
  45. value := c.Query("compulsion")
  46. //TODO 是否将最新的商店文件写入配置中
  47. //writeNow := c.Query("writeNow")
  48. //是否强制安装
  49. compulsion := value == "true"
  50. urls := ReadArkBackupUrl(configs.ArkApiInstallUrl)
  51. var signal = make(chan int)
  52. for _, url := range urls {
  53. ServerConfigUrls = append(ServerConfigUrls, url+"/Plugins/ArkShop/config.json")
  54. go InstallZip(compulsion, url, signal)
  55. }
  56. for s := <-signal; s != len(urls); {
  57. time.Sleep(1 * time.Millisecond)
  58. }
  59. c.JSON(200, CreateResult())
  60. }
  61. // WriteFileConfig 备份实体的配置文件
  62. func WriteFileConfig(c *gin.Context) {
  63. err := BackupFile()
  64. if err != nil {
  65. fmt.Println(err)
  66. c.JSON(200, CreateResultError(500, "备份失败"))
  67. }
  68. //修改目标文件
  69. marshal, err := json.Marshal(ARKConfig)
  70. if err != nil {
  71. fmt.Println(err)
  72. c.JSON(200, CreateResultError(500, "写入失败"))
  73. }
  74. err = os.WriteFile(configs.ARKJsonFilePath, marshal, 0644)
  75. }
  76. // ReadBackupFileList 读取备份文件列表
  77. func ReadBackupFileList() {
  78. entities, err := os.ReadDir(configs.ARKBackupDir)
  79. if err != nil {
  80. fmt.Println(err)
  81. }
  82. //获取备份文件位置
  83. for i := range entities {
  84. BackupFileList = append(BackupFileList, configs.ARKBackupDir+"/"+entities[i].Name())
  85. }
  86. //获取实际的插件配置位置
  87. urls := ReadArkBackupUrl(configs.ArkApiInstallUrl)
  88. for _, url := range urls {
  89. ServerConfigUrls = append(ServerConfigUrls, url+"/Plugins/ArkShop/config.json")
  90. }
  91. }
  92. func BackupFile() error {
  93. //穿件备份文件夹
  94. os.MkdirAll(configs.ARKBackupDir, 0755)
  95. name := ""
  96. //创建备份文件
  97. split := strings.Split(configs.ARKJsonFilePath, "/")
  98. split = strings.Split(split[len(split)-1], ".")
  99. name = split[0] + "-" + time.Now().Format("20060102150405")
  100. for i := 1; i < len(split); i++ {
  101. name += "." + split[i]
  102. }
  103. return CopyFile(configs.ARKJsonFilePath, configs.ARKBackupDir+"/"+name)
  104. }
  105. // CopyFile 复制文件
  106. func CopyFile(src, dest string) error {
  107. // 打开源文件
  108. sourceFile, err := os.Open(src)
  109. if err != nil {
  110. return err
  111. }
  112. defer sourceFile.Close()
  113. // 创建目标文件
  114. split := strings.Split(dest, "/")
  115. str := ""
  116. for i := 0; i < len(split)-1; i++ {
  117. str += split[i] + "/"
  118. err := os.MkdirAll(str, 0755)
  119. if err != nil {
  120. fmt.Println(err)
  121. }
  122. }
  123. destinationFile, err := os.Create(dest)
  124. if err != nil {
  125. return err
  126. }
  127. defer destinationFile.Close()
  128. // 复制文件内容
  129. _, err = io.Copy(destinationFile, sourceFile)
  130. if err != nil {
  131. return err
  132. }
  133. // 确保数据写入目标文件
  134. err = destinationFile.Sync()
  135. if err != nil {
  136. return err
  137. }
  138. return nil
  139. }
  140. // InstallZip 安装服务器插件
  141. func InstallZip(compulsion bool, url string, signal chan int) {
  142. entries, err := os.ReadDir(url)
  143. if err != nil {
  144. fmt.Println(err)
  145. }
  146. if !compulsion {
  147. for i := range entries {
  148. if entries[i].IsDir() && entries[i].Name() == "ArkApi" {
  149. signal <- i + 1
  150. return
  151. }
  152. }
  153. } else {
  154. for i := range entries {
  155. if entries[i].IsDir() && entries[i].Name() == "ArkApi" {
  156. //删除
  157. os.RemoveAll(url + "/ArkApi")
  158. break
  159. }
  160. }
  161. }
  162. err = Unzip(configs.ARKAPiZipPath, url)
  163. i := <-signal
  164. signal <- i + 1
  165. }
  166. // ReadArkBackupUrl 读取服务器路径的实际位置
  167. func ReadArkBackupUrl(dir string) []string {
  168. resourcesDir := make([]string, 0)
  169. // 读取目录内容
  170. entries, err := os.ReadDir(dir)
  171. if err != nil {
  172. fmt.Println(err)
  173. return resourcesDir
  174. }
  175. // 遍历目录内容
  176. for _, entry := range entries {
  177. if entry.IsDir() {
  178. readDir, err := os.ReadDir(entry.Name())
  179. if err != nil {
  180. fmt.Println(err)
  181. return resourcesDir
  182. }
  183. existEngineDir := false
  184. existShooterGameDir := false
  185. existSteamapps := false
  186. for _, subentry := range readDir {
  187. if subentry.IsDir() && subentry.Name() == "Engine" {
  188. existEngineDir = true
  189. }
  190. if subentry.IsDir() && subentry.Name() == "ShooterGame" {
  191. existShooterGameDir = true
  192. }
  193. if subentry.IsDir() && subentry.Name() == "steamapps" {
  194. existSteamapps = true
  195. }
  196. }
  197. if existEngineDir && existShooterGameDir && existSteamapps {
  198. resourcesDir = append(resourcesDir, dir+"/"+entry.Name()+"/ShooterGame/Binaries/Win64")
  199. }
  200. }
  201. }
  202. return resourcesDir
  203. }
  204. // Unzip 解压缩ZIP文件到目标路径
  205. func Unzip(src, dest string) error {
  206. // 打开ZIP文件
  207. reader, err := zip.OpenReader(src)
  208. if err != nil {
  209. return err
  210. }
  211. defer reader.Close()
  212. // 创建目标路径
  213. if err := os.MkdirAll(dest, 0755); err != nil {
  214. return err
  215. }
  216. // 解压每个文件
  217. for _, file := range reader.File {
  218. filePath := filepath.Join(dest, file.Name)
  219. // 检查文件的目录结构
  220. if !strings.HasPrefix(filePath, filepath.Clean(dest)+string(os.PathSeparator)) {
  221. return fmt.Errorf("非法文件路径: %s", filePath)
  222. }
  223. if file.FileInfo().IsDir() {
  224. // 创建目录
  225. if err := os.MkdirAll(filePath, file.Mode()); err != nil {
  226. return err
  227. }
  228. } else {
  229. // 创建文件所在的目录
  230. if err := os.MkdirAll(filepath.Dir(filePath), file.Mode()); err != nil {
  231. return err
  232. }
  233. // 打开ZIP中的文件
  234. zipFile, err := file.Open()
  235. if err != nil {
  236. return err
  237. }
  238. defer zipFile.Close()
  239. // 创建输出文件
  240. outputFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
  241. if err != nil {
  242. return err
  243. }
  244. defer outputFile.Close()
  245. // 将内容拷贝到输出文件
  246. _, err = io.Copy(outputFile, zipFile)
  247. if err != nil {
  248. return err
  249. }
  250. }
  251. }
  252. return nil
  253. }