You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
11 KiB
369 lines
11 KiB
package lib
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
const sep = string(os.PathSeparator)
|
|
|
|
// RunServiceFuncCLI обраатываем параметры с консоли и вызываем переданую функцию
|
|
func RunServiceFuncCLI(ctx context.Context, funcCLI func(ctx context.Context, configfile, dir, port, mode, service, dc, param2, param3, sourcedb, action, version string) error) error {
|
|
var err error
|
|
|
|
appCLI := cli.NewApp()
|
|
appCLI.Usage = "Demon Buildbox Proxy started"
|
|
appCLI.Commands = []cli.Command{
|
|
{
|
|
Name: "webinit", ShortName: "",
|
|
Usage: "Start Web-UI from init infractractire LowCodePlatform-service",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "port, c",
|
|
Usage: "Порт запуска UI",
|
|
Value: "8088",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
port := c.String("port")
|
|
|
|
err = funcCLI(ctx, "", "", port, "", "", "", "", "", "", "webinit", "")
|
|
return err
|
|
},
|
|
},
|
|
{
|
|
Name: "update", ShortName: "",
|
|
Usage: "Update service",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "service, s",
|
|
Usage: "Обновить сервис",
|
|
Value: "lowcodebox",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "version, v",
|
|
Usage: "Версия, до которой обновляем",
|
|
Value: "latest",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "arch, a",
|
|
Usage: "386/amd64",
|
|
Value: "",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
service := c.String("service")
|
|
version := c.String("version")
|
|
arch := c.String("arch")
|
|
|
|
err = funcCLI(ctx, "", "", "", "", service, arch, "", "", "", "update", version)
|
|
return err
|
|
},
|
|
},
|
|
{
|
|
Name: "stop", ShortName: "",
|
|
Usage: "Stop service",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "service, s",
|
|
Usage: "Остановить сервисы (через запятую). '-s systems' - остановить системные сервисы; '-s custom' - остановить рабочие пользовательские сервисы ",
|
|
Value: "all",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
service := c.String("service")
|
|
|
|
err = funcCLI(ctx, "", "", "", "", service, "", "", "", "", "stop", "")
|
|
return err
|
|
},
|
|
},
|
|
{
|
|
Name: "start", ShortName: "",
|
|
Usage: "Start single Buildbox-service process",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "config, c",
|
|
Usage: "Название файла конфигурации, с которым будет запущен сервис",
|
|
Value: "lowcodebox",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "dir, d",
|
|
Usage: "Путь к шаблонам",
|
|
Value: "",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "port, p",
|
|
Usage: "Порт, на котором запустить процесс",
|
|
Value: "",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "mode, m",
|
|
Usage: "Доп.режимы запуска: debug (логирования stdout в файл)",
|
|
Value: "",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "dc",
|
|
Usage: "Дата-центр, в котором запущен сервис",
|
|
Value: "false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "service, s",
|
|
Usage: "Запуск сервиса (для запуска нескольких сервисов укажите их через запятую)",
|
|
Value: "systems",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
configfile := c.String("config")
|
|
port := c.String("port")
|
|
dir := c.String("dir")
|
|
dc := c.String("dc")
|
|
mode := c.String("mode")
|
|
|
|
service := c.String("service")
|
|
|
|
if dir == "default" {
|
|
dir, err = RootDir()
|
|
}
|
|
|
|
err = funcCLI(ctx, configfile, dir, port, mode, service, dc, "", "", "", "start", "")
|
|
return err
|
|
},
|
|
},
|
|
{
|
|
Name: "init", ShortName: "",
|
|
Usage: "Init single LowCodePlatform-service process",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "service, s",
|
|
Usage: "Инициализация сервиса",
|
|
Value: "false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "version, v",
|
|
Usage: "До какой версии обновить выбранный сервис",
|
|
Value: "latest",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "dc",
|
|
Usage: "Зарезервировано",
|
|
Value: "false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "param2, p2",
|
|
Usage: "Зарезервировано",
|
|
Value: "false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "param3, p3",
|
|
Usage: "Зарезервировано",
|
|
Value: "false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "dir, d",
|
|
Usage: "Директория создания проекта (по-умолчанию - текущая директория)",
|
|
Value: "",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "sourcedb, db",
|
|
Usage: "База данных, где будет развернута фабрика (поддерживается SQLite, MySQL, Postgres, CocckroachDB) (по-умолчанию: SQLite)",
|
|
Value: "./default.db",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
service := c.String("service")
|
|
dc := c.String("dc")
|
|
param2 := c.String("param2")
|
|
param3 := c.String("param3")
|
|
dir := c.String("dir")
|
|
version := c.String("version")
|
|
sourcedb := c.String("sourcedb")
|
|
|
|
if dir == "default" {
|
|
dir, err = RootDir()
|
|
}
|
|
|
|
err = funcCLI(ctx, "", dir, "", "", service, dc, param2, param3, sourcedb, "init", version)
|
|
return err
|
|
},
|
|
},
|
|
{
|
|
Name: "secrets", ShortName: "",
|
|
Usage: "Get or set secrets for service",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "action, a",
|
|
Usage: "Действие для секрета. get или set",
|
|
Value: "get",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "key, k",
|
|
Usage: "Название секрета",
|
|
Value: "nokey",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "value, v",
|
|
Usage: "Значение секрета для ключа k",
|
|
Value: "novalue",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
configfile := c.String("config")
|
|
action := c.String("action")
|
|
key := c.String("key")
|
|
value := c.String("value")
|
|
|
|
return funcCLI(ctx, configfile, "", "", "", "", action, key, value, "", "secrets", "")
|
|
},
|
|
},
|
|
}
|
|
err = appCLI.Run(os.Args)
|
|
|
|
return err
|
|
}
|
|
|
|
// Stop завершение процесса
|
|
func Stop(pid int) (err error) {
|
|
var sig os.Signal
|
|
sig = os.Kill
|
|
p, err := os.FindProcess(pid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = p.Signal(sig)
|
|
return err
|
|
}
|
|
|
|
// завершение всех процессов для текущей конфигурации
|
|
// config - ид-конфигурации
|
|
//func PidsByConfig(config, portProxy string) (result []string, err error) {
|
|
// _, fullresult, _, _ := Ps("full", portProxy)
|
|
//
|
|
// // получаем pid для переданной конфигурации
|
|
// for _, v1 := range fullresult {
|
|
// for _, v := range v1 {
|
|
// configfile := v[1] // файл
|
|
// idProcess := v[0] // pid
|
|
//
|
|
// if config == configfile {
|
|
// result = append(result, idProcess)
|
|
// }
|
|
//
|
|
// if err != nil {
|
|
// fmt.Println("Error stopped process config:", config, ", err:", err)
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// return
|
|
//}
|
|
|
|
// получаем строки пидов подходящих под условия, в котором:
|
|
// domain - название проекта (домен)
|
|
// alias - название алиас-сервиса (gui/api/proxy и тд - то, что в мап-прокси идет второй частью адреса)
|
|
// если алиас явно не задан, то он может быть получен из домена
|
|
//func PidsByAlias(domain, alias, portProxy string) (result []string, err error) {
|
|
//
|
|
// if domain == "" {
|
|
// domain = "all"
|
|
// }
|
|
// if alias == "" {
|
|
// alias = "all"
|
|
// }
|
|
//
|
|
// // можем в домене передать полный путь с учетом алиаса типа buildbox/gui
|
|
// // в этом случае алиас если он явно не задан заполним значением алиаса полученного из домена
|
|
// splitDomain := strings.Split(domain, "/")
|
|
// if len(splitDomain) == 2 {
|
|
// domain = splitDomain[0]
|
|
// alias = splitDomain[1]
|
|
// }
|
|
// _, _, raw, _ := Ps("full", portProxy)
|
|
//
|
|
// // получаем pid для переданной конфигурации
|
|
// for _, pidRegistry := range raw {
|
|
// for d, v1 := range pidRegistry {
|
|
// // пропускаем если точное сравнение и не подоходит
|
|
// if domain != "all" && d != domain {
|
|
// continue
|
|
// }
|
|
//
|
|
// for a, v2 := range v1 {
|
|
// // пропускаем если точное сравнение и не подоходит
|
|
// if alias != "all" && a != alias {
|
|
// continue
|
|
// }
|
|
//
|
|
// for _, v3 := range v2 {
|
|
// k3 := strings.Split(v3, ":")
|
|
// idProcess := k3[0] // pid
|
|
// // дополняем результат значениями домена и алиаса (для возврата их при остановке если не переданы алиас явно)
|
|
// // бывают значения, когда мы останавлитваем процесс тошько по домену и тогда мы не можем возврашить алиас остановленного процесса
|
|
// // а алиас нужен для поиска в прокси в картах /Pid и /Мар для удаления из активных сервисов по домену и алиасу
|
|
// // если алиаса нет (не приходит в ответе от лоадера, то не находим и прибитые процессы залипают в мапах)
|
|
// result = append(result, v3+":"+ d + ":" + a)
|
|
//
|
|
// if err != nil {
|
|
// fmt.Println("Error stopped process: pid:", idProcess, ", err:", err)
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// return
|
|
//}
|
|
|
|
// уничтожить все процессы
|
|
//func Destroy(portProxy string) (err error) {
|
|
// pids, _, _, _ := Ps("pid", portProxy)
|
|
// for _, v := range pids {
|
|
// pi, err := strconv.Atoi(v)
|
|
// if err == nil {
|
|
// Stop(pi)
|
|
// }
|
|
// }
|
|
// return err
|
|
//}
|
|
|
|
// инициализация приложения
|
|
//func Install() (err error) {
|
|
//
|
|
// // 1. задание переменных окружения
|
|
// currentDir, err := CurrentDir()
|
|
// if err != nil {
|
|
// return
|
|
// }
|
|
// os.Setenv("BBPATH", currentDir)
|
|
//
|
|
// //var rootPath = os.Getenv("BBPATH")
|
|
//
|
|
// //fmt.Println(rootPath)
|
|
// //path, _ := os.LookupEnv("BBPATH")
|
|
// //fmt.Print("BBPATH: ", path)
|
|
//
|
|
// // 2. копирование файла запуска в /etc/bin
|
|
// //src := "./buildbox"
|
|
// //dst := "/usr/bin/buildbox"
|
|
// //
|
|
// //in, err := os.Open(src)
|
|
// //if err != nil {
|
|
// // return err
|
|
// //}
|
|
// //defer in.Close()
|
|
// //
|
|
// //out, err := os.Create(dst)
|
|
// //if err != nil {
|
|
// // return err
|
|
// //}
|
|
// //defer out.Close()
|
|
// //
|
|
// //_, err = io.Copy(out, in)
|
|
// //if err != nil {
|
|
// // return err
|
|
// //}
|
|
// //return out.Close()
|
|
//
|
|
// return err
|
|
//}
|
|
|