Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions agent/cmd/server/cmd/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package cmd

import (
"bytes"
"fmt"
"github.com/1Panel-dev/1Panel/agent/cmd/server/app"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/1Panel-dev/1Panel/agent/utils/files"
"io"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

var (
appKey string
appVersion string
)

func init() {
appCmd.SetHelpFunc(func(c *cobra.Command, s []string) {
i18n.UseI18nForCmd(language)
loadAppHelper()
})
initCmd.SetHelpFunc(func(c *cobra.Command, s []string) {
i18n.UseI18nForCmd(language)
loadAppInitHelper()
})

initCmd.Flags().StringVarP(&appKey, "key", "k", "", "")
initCmd.Flags().StringVarP(&appVersion, "version", "v", "", "")
appCmd.AddCommand(initCmd)
RootCmd.AddCommand(appCmd)
}

var appCmd = &cobra.Command{
Use: "app",
}

var initCmd = &cobra.Command{
Use: "init",
RunE: func(cmd *cobra.Command, args []string) error {
i18n.UseI18nForCmd(language)
if !isRoot() {
fmt.Println(i18n.GetMsgWithMapForCmd("SudoHelper", map[string]interface{}{"cmd": "sudo 1pctl app init"}))
return nil
}
if len(args) > 0 {
appKey = args[0]
if len(args) > 1 {
appVersion = args[1]
}
}
if appKey == "" {
fmt.Println(i18n.GetMsgByKeyForCmd("AppMissKey"))
return nil
}
if appVersion == "" {
fmt.Println(i18n.GetMsgByKeyForCmd("AppMissVersion"))
return nil
}
fileOp := files.NewFileOp()
appKeyPath := fmt.Sprintf("./%s", appKey)
if err := createFolder(fileOp, appKeyPath); err != nil {
return err
}
configYamlPath := fmt.Sprintf("%s/data.yml", appKeyPath)
if err := createFile(fileOp, configYamlPath); err != nil {
return err
}
if err := writeFile(fileOp, configYamlPath, bytes.NewReader(app.Config)); err != nil {
return err
}
readMePath := fmt.Sprintf("%s/README.md", appKeyPath)
if err := createFile(fileOp, readMePath); err != nil {
return err
}
logoPath := fmt.Sprintf("%s/logo.png", appKeyPath)
if err := createFile(fileOp, logoPath); err != nil {
return err
}
if err := writeFile(fileOp, logoPath, bytes.NewReader(app.Logo)); err != nil {
return err
}
versionPath := fmt.Sprintf("%s/%s", appKeyPath, appVersion)
if fileOp.Stat(versionPath) {
return errors.New(i18n.GetMsgByKeyForCmd("AppVersionExist"))
}
if err := createFolder(fileOp, versionPath); err != nil {
return err
}
versionParamPath := fmt.Sprintf("%s/%s", versionPath, "data.yml")
if err := createFile(fileOp, versionParamPath); err != nil {
return err
}
if err := writeFile(fileOp, versionParamPath, bytes.NewReader(app.Param)); err != nil {
return err
}
dockerComposeYamlPath := fmt.Sprintf("%s/%s", versionPath, "docker-compose.yml")
if err := createFile(fileOp, dockerComposeYamlPath); err != nil {
return err
}
fmt.Println(i18n.GetMsgByKeyForCmd("AppCreateSuccessful"))
return nil
},
}

func createFile(fileOp files.FileOp, filePath string) error {
if fileOp.Stat(filePath) {
return nil
}
if err := fileOp.CreateFile(filePath); err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppCreateFileErr", map[string]interface{}{"name": filePath, "err": err.Error()}))
return err
}
return nil
}

func createFolder(fileOp files.FileOp, dirPath string) error {
if fileOp.Stat(dirPath) {
return nil
}
if err := fileOp.CreateDir(dirPath, 0755); err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppCreateDirErr", map[string]interface{}{"name": dirPath, "err": err.Error()}))
return err
}
return nil
}

func writeFile(fileOp files.FileOp, filePath string, in io.Reader) error {
if err := fileOp.WriteFile(filePath, in, 0755); err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppWriteErr", map[string]interface{}{"name": filePath, "err": err.Error()}))
return err
}
return nil
}

func loadAppHelper() {
fmt.Println(i18n.GetMsgByKeyForCmd("AppCommands"))
fmt.Println("\nUsage:\n 1panel app [command]\n\nAvailable Commands:")
fmt.Println("\n init " + i18n.GetMsgByKeyForCmd("AppInit"))
fmt.Println("\nFlags:\n -h, --help help for app")
fmt.Println(" -k, --key string " + i18n.GetMsgByKeyForCmd("AppKeyVal"))
fmt.Println(" -v, --version string " + i18n.GetMsgByKeyForCmd("AppVersion"))
fmt.Println("\nUse \"1panel app [command] --help\" for more information about a command.")
}

func loadAppInitHelper() {
fmt.Println(i18n.GetMsgByKeyForCmd("AppInit"))
fmt.Println("\nUsage:\n 1panel app init [flags]")
fmt.Println("\nFlags:\n -h, --help help for app")
fmt.Println(" -k, --key string " + i18n.GetMsgByKeyForCmd("AppKeyVal"))
fmt.Println(" -v, --version string " + i18n.GetMsgByKeyForCmd("AppVersion"))
}
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ additionalProperties:
limit: #应用安装数量限制,0 代表无限制
website: #官网地址
github: #github 地址
document: #文档地址
description:
en:
zh: #应用中文描述,不要超过30个字
zh-Hant:
ja:
ms:
pt-br:
ru:
ko:
File renamed without changes.
File renamed without changes
159 changes: 159 additions & 0 deletions core/cmd/server/cmd/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
package cmd

import (
"bytes"
"fmt"
"github.com/1Panel-dev/1Panel/core/cmd/server/app"
"github.com/1Panel-dev/1Panel/core/i18n"
"io"
"os"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

var (
appKey string
appVersion string
)

func init() {
appCmd.SetHelpFunc(func(c *cobra.Command, s []string) {
i18n.UseI18nForCmd(language)
loadAppHelper()
})
initCmd.SetHelpFunc(func(c *cobra.Command, s []string) {
i18n.UseI18nForCmd(language)
loadAppInitHelper()
})
initCmd.Flags().StringVarP(&appKey, "key", "k", "", "")
initCmd.Flags().StringVarP(&appVersion, "version", "v", "", "")
appCmd.AddCommand(initCmd)
RootCmd.AddCommand(appCmd)
}

var appCmd = &cobra.Command{
Use: "app",
}

var initCmd = &cobra.Command{
Use: "init",
RunE: func(cmd *cobra.Command, args []string) error {
i18n.UseI18nForCmd(language)
if !isRoot() {
fmt.Println(i18n.GetMsgWithMapForCmd("SudoHelper", map[string]interface{}{"cmd": "sudo 1pctl app init"}))
return nil
}
if len(args) > 0 {
appKey = args[0]
if len(args) > 1 {
appVersion = args[1]
}
}
if appKey == "" {
fmt.Println(i18n.GetMsgByKeyForCmd("AppMissKey"))
return nil
}
if appVersion == "" {
fmt.Println(i18n.GetMsgByKeyForCmd("AppMissVersion"))
return nil
}
appKeyPath := fmt.Sprintf("./%s", appKey)
if err := createFolder(appKeyPath); err != nil {
return err
}
configYamlPath := fmt.Sprintf("%s/data.yml", appKeyPath)
if err := createFile(configYamlPath); err != nil {
return err
}
if err := writeFile(configYamlPath, bytes.NewReader(app.Config)); err != nil {
return err
}
readMePath := fmt.Sprintf("%s/README.md", appKeyPath)
if err := createFile(readMePath); err != nil {
return err
}
logoPath := fmt.Sprintf("%s/logo.png", appKeyPath)
if err := createFile(logoPath); err != nil {
return err
}
if err := writeFile(logoPath, bytes.NewReader(app.Logo)); err != nil {
return err
}
versionPath := fmt.Sprintf("%s/%s", appKeyPath, appVersion)
if _, err := os.Stat(versionPath); err == nil {
return errors.New(i18n.GetMsgByKeyForCmd("AppVersionExist"))
}
if err := createFolder(versionPath); err != nil {
return err
}
versionParamPath := fmt.Sprintf("%s/%s", versionPath, "data.yml")
if err := createFile(versionParamPath); err != nil {
return err
}
if err := writeFile(versionParamPath, bytes.NewReader(app.Param)); err != nil {
return err
}
dockerComposeYamlPath := fmt.Sprintf("%s/%s", versionPath, "docker-compose.yml")
if err := createFile(dockerComposeYamlPath); err != nil {
return err
}
fmt.Println(i18n.GetMsgByKeyForCmd("AppCreateSuccessful"))
return nil
},
}

func createFile(filePath string) error {
if _, err := os.Stat(filePath); err == nil {
return nil
}
file, err := os.Create(filePath)
if err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppCreateFileErr", map[string]interface{}{"name": filePath, "err": err.Error()}))
return err
}
defer file.Close()
return nil
}

func createFolder(dirPath string) error {
if _, err := os.Stat(dirPath); err == nil {
return nil
}
if err := os.MkdirAll(dirPath, 0755); err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppCreateDirErr", map[string]interface{}{"name": dirPath, "err": err.Error()}))
return err
}
return nil
}

func writeFile(filePath string, in io.Reader) error {
data, err := io.ReadAll(in)
if err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppWriteErr", map[string]interface{}{"name": filePath, "err": err.Error()}))
return err
}
if err := os.WriteFile(filePath, data, 0755); err != nil {
fmt.Println(i18n.GetMsgWithMapForCmd("AppWriteErr", map[string]interface{}{"name": filePath, "err": err.Error()}))
return err
}
return nil
}

func loadAppHelper() {
fmt.Println(i18n.GetMsgByKeyForCmd("AppCommands"))
fmt.Println("\nUsage:\n 1panel app [command]\n\nAvailable Commands:")
fmt.Println("\n init " + i18n.GetMsgByKeyForCmd("AppInit"))
fmt.Println("\nFlags:\n -h, --help help for app")
fmt.Println(" -k, --key string " + i18n.GetMsgByKeyForCmd("AppKeyVal"))
fmt.Println(" -v, --version string " + i18n.GetMsgByKeyForCmd("AppVersion"))
fmt.Println("\nUse \"1panel app [command] --help\" for more information about a command.")
}

func loadAppInitHelper() {
fmt.Println(i18n.GetMsgByKeyForCmd("AppInit"))
fmt.Println("\nUsage:\n 1panel app init [flags]")
fmt.Println("\nFlags:\n -h, --help help for app")
fmt.Println(" -k, --key string " + i18n.GetMsgByKeyForCmd("AppKeyVal"))
fmt.Println(" -v, --version string " + i18n.GetMsgByKeyForCmd("AppVersion"))
}
Loading