ecs/tools/publisher/main.go

184 lines
3.9 KiB
Go
Raw Normal View History

2025-06-04 18:17:39 +08:00
package main
import (
"flag"
"fmt"
"github.com/oylshe1314/framework/errors"
"github.com/oylshe1314/framework/server"
"github.com/oylshe1314/framework/ssh"
"github.com/oylshe1314/framework/util"
"os"
)
type SshConfig struct {
Address string `json:"address"`
User string `json:"user"`
Pass string `json:"pass"`
KeyFile string `json:"keyFile"`
}
type PublishConfig struct {
Platforms []string `json:"platforms"`
LocalPath string `json:"localPath"`
RemotePath string `json:"remotePath"`
}
type PublishClient struct {
sshConfig *SshConfig
publishConfig *PublishConfig
sshClient *ssh.Client
}
func (this *PublishClient) WithSshConfig(sshConfig *SshConfig) {
this.sshConfig = sshConfig
}
func (this *PublishClient) WithPublishConfig(publishConfig *PublishConfig) {
this.publishConfig = publishConfig
}
func (this *PublishClient) Init() (err error) {
if this.sshConfig == nil {
return errors.Error("'sshConfig' can not be nil")
}
if this.sshConfig.Address == "" {
return errors.Error("'sshConfig.Address' can not be empty")
}
if this.sshConfig.User == "" {
return errors.Error("'sshConfig.User' can not be empty")
}
if this.publishConfig == nil {
return errors.Error("'publishConfig' can not be nil")
}
if len(this.publishConfig.Platforms) == 0 {
return errors.Error("'publishConfig.Platforms' can not be empty")
}
if this.publishConfig.LocalPath == "" {
return errors.Error("'publishConfig.LocalPath' can not be empty")
}
if this.publishConfig.RemotePath == "" {
return errors.Error("'publishConfig.RemotePath' can not be empty")
}
if this.publishConfig.LocalPath[len(this.publishConfig.LocalPath)-1] != '/' {
this.publishConfig.LocalPath += "/"
}
if this.publishConfig.RemotePath[len(this.publishConfig.RemotePath)-1] != '/' {
this.publishConfig.RemotePath += "/"
}
return nil
}
func (this *PublishClient) Close() (err error) {
if this.sshClient != nil {
return this.sshClient.Close()
}
return nil
}
func (this *PublishClient) connect() (err error) {
var key []byte
if this.sshConfig.KeyFile != "" {
key, err = os.ReadFile(this.sshConfig.KeyFile)
if err != nil {
return err
}
this.sshConfig.Pass = ""
}
this.sshClient, err = ssh.Open(this.sshConfig.Address, this.sshConfig.User, this.sshConfig.Pass, key)
if err != nil {
return err
}
return nil
}
func (this *PublishClient) publish(platform string) (err error) {
if this.sshClient == nil {
return errors.Error("please connect the server first")
}
var platforms []string
if platform == "all" {
platforms = this.publishConfig.Platforms
} else {
platforms = []string{platform}
}
var pkgDir = "latest_packet"
for _, pp := range platforms {
var md = util.TimeFormat("0102")
_, err = this.sshClient.Exec("cd", this.publishConfig.RemotePath, "&&", "mv", pkgDir, fmt.Sprintf("%s.%s", pkgDir, md), "&&", "mkdir", pkgDir)
if err != nil {
return err
}
var pkgFile = fmt.Sprintf("%s.zip", pp)
err = this.sshClient.Upload(this.publishConfig.LocalPath+pkgDir+"/"+pkgFile, this.publishConfig.RemotePath+pkgDir+"/")
if err != nil {
return err
}
_, err = this.sshClient.Exec("cd", this.publishConfig.RemotePath+pkgDir, "&&", "unzip", pkgFile, "&&", "rm", "-f", pkgFile)
if err != nil {
return err
}
}
return nil
}
func main() {
var platform string
flag.StringVar(&platform, "p", "all", "Specify the platform to publish")
flag.Parse()
if platform == "" {
platform = "all"
}
opt, err := server.ReadOptions("./config.json")
if err != nil {
fmt.Println(err)
return
}
var client = &PublishClient{}
fmt.Println("init publisher client")
err = opt.Init(client)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("connect ssh server")
err = client.connect()
if err != nil {
fmt.Println(err)
return
}
defer client.Close()
fmt.Printf("publish %s package\n", platform)
err = client.publish(platform)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("publish finished")
}