forked from Plemya-x/ALR
wip
This commit is contained in:
parent
6df5baa457
commit
57225e05bd
21
build.go
21
build.go
@ -175,15 +175,32 @@ func BuildCmd() *cli.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
builder, cleanup, err := build.NewMainBuilder(
|
installer, installerClose, err := build.GetSafeInstaller()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer installerClose()
|
||||||
|
|
||||||
|
if err := utils.ExitIfCantSetNoNewPrivs(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
scripter, scripterClose, err := build.GetSafeScriptExecutor()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer scripterClose()
|
||||||
|
|
||||||
|
builder, err := build.NewMainBuilder(
|
||||||
deps.Cfg,
|
deps.Cfg,
|
||||||
deps.Manager,
|
deps.Manager,
|
||||||
deps.Repos,
|
deps.Repos,
|
||||||
|
scripter,
|
||||||
|
installer,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer cleanup()
|
|
||||||
|
|
||||||
if scriptArgs != nil {
|
if scriptArgs != nil {
|
||||||
res, err = builder.BuildPackageFromScript(
|
res, err = builder.BuildPackageFromScript(
|
||||||
|
2
fix.go
2
fix.go
@ -37,7 +37,7 @@ func FixCmd() *cli.Command {
|
|||||||
Name: "fix",
|
Name: "fix",
|
||||||
Usage: gotext.Get("Attempt to fix problems with ALR"),
|
Usage: gotext.Get("Attempt to fix problems with ALR"),
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
if err := utils.ExitIfCantDropCapsToAlrUserNoPrivs(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
55
install.go
55
install.go
@ -51,17 +51,33 @@ func InstallCmd() *cli.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := c.Context
|
|
||||||
|
|
||||||
args := c.Args()
|
args := c.Args()
|
||||||
if args.Len() < 1 {
|
if args.Len() < 1 {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Command install expected at least 1 argument, got %d", args.Len()), nil)
|
return cliutils.FormatCliExit(gotext.Get("Command install expected at least 1 argument, got %d", args.Len()), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
installer, installerClose, err := build.GetSafeInstaller()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer installerClose()
|
||||||
|
|
||||||
|
if err := utils.ExitIfCantSetNoNewPrivs(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
scripter, scripterClose, err := build.GetSafeScriptExecutor()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer scripterClose()
|
||||||
|
|
||||||
|
ctx := c.Context
|
||||||
|
|
||||||
deps, err := appbuilder.
|
deps, err := appbuilder.
|
||||||
New(ctx).
|
New(ctx).
|
||||||
WithConfig().
|
WithConfig().
|
||||||
@ -75,15 +91,16 @@ func InstallCmd() *cli.Command {
|
|||||||
}
|
}
|
||||||
defer deps.Defer()
|
defer deps.Defer()
|
||||||
|
|
||||||
builder, cleanup, err := build.NewMainBuilder(
|
builder, err := build.NewMainBuilder(
|
||||||
deps.Cfg,
|
deps.Cfg,
|
||||||
deps.Manager,
|
deps.Manager,
|
||||||
deps.Repos,
|
deps.Repos,
|
||||||
|
scripter,
|
||||||
|
installer,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer cleanup()
|
|
||||||
|
|
||||||
err = builder.InstallPkgs(
|
err = builder.InstallPkgs(
|
||||||
ctx,
|
ctx,
|
||||||
@ -152,6 +169,7 @@ func RemoveCmd() *cli.Command {
|
|||||||
New(ctx).
|
New(ctx).
|
||||||
WithConfig().
|
WithConfig().
|
||||||
WithDB().
|
WithDB().
|
||||||
|
WithManager().
|
||||||
Build()
|
Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.Exit(err, 1)
|
return cli.Exit(err, 1)
|
||||||
@ -159,11 +177,7 @@ func RemoveCmd() *cli.Command {
|
|||||||
defer deps.Defer()
|
defer deps.Defer()
|
||||||
|
|
||||||
installedAlrPackages := map[string]string{}
|
installedAlrPackages := map[string]string{}
|
||||||
mgr := manager.Detect()
|
installed, err := deps.Manager.ListInstalled(&manager.Opts{AsRoot: false})
|
||||||
if mgr == nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
|
||||||
}
|
|
||||||
installed, err := mgr.ListInstalled(&manager.Opts{AsRoot: false})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error listing installed packages"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error listing installed packages"), err)
|
||||||
}
|
}
|
||||||
@ -209,16 +223,19 @@ func RemoveCmd() *cli.Command {
|
|||||||
return cliutils.FormatCliExit(gotext.Get("Command remove expected at least 1 argument, got %d", args.Len()), nil)
|
return cliutils.FormatCliExit(gotext.Get("Command remove expected at least 1 argument, got %d", args.Len()), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
mgr := manager.Detect()
|
deps, err := appbuilder.
|
||||||
if mgr == nil {
|
New(c.Context).
|
||||||
return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
WithManager().
|
||||||
|
Build()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
defer deps.Defer()
|
||||||
|
|
||||||
err := mgr.Remove(&manager.Opts{
|
if err := deps.Manager.Remove(&manager.Opts{
|
||||||
AsRoot: true,
|
AsRoot: true,
|
||||||
NoConfirm: !c.Bool("interactive"),
|
NoConfirm: !c.Bool("interactive"),
|
||||||
}, c.Args().Slice()...)
|
}, c.Args().Slice()...); err != nil {
|
||||||
if err != nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error removing packages"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error removing packages"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,15 +46,15 @@ msgstr ""
|
|||||||
msgid "Nothing to build"
|
msgid "Nothing to build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:201
|
#: build.go:218
|
||||||
msgid "Error building package"
|
msgid "Error building package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:208
|
#: build.go:225
|
||||||
msgid "Error moving the package"
|
msgid "Error moving the package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:212
|
#: build.go:229
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -154,31 +154,27 @@ msgstr ""
|
|||||||
msgid "Install a new package"
|
msgid "Install a new package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:62
|
#: install.go:56
|
||||||
msgid "Command install expected at least 1 argument, got %d"
|
msgid "Command install expected at least 1 argument, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:101
|
#: install.go:118
|
||||||
msgid "Error parsing os release"
|
msgid "Error parsing os release"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:146
|
#: install.go:163
|
||||||
msgid "Remove an installed package"
|
msgid "Remove an installed package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:164 install.go:214
|
#: install.go:182
|
||||||
msgid "Unable to detect a supported package manager on the system"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: install.go:168
|
|
||||||
msgid "Error listing installed packages"
|
msgid "Error listing installed packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:209
|
#: install.go:223
|
||||||
msgid "Command remove expected at least 1 argument, got %d"
|
msgid "Command remove expected at least 1 argument, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:222
|
#: install.go:239
|
||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -194,6 +190,10 @@ msgstr ""
|
|||||||
msgid "Error pulling repositories"
|
msgid "Error pulling repositories"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/cliutils/app_builder/builder.go:165
|
||||||
|
msgid "Unable to detect a supported package manager on the system"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: internal/cliutils/prompt.go:60
|
#: internal/cliutils/prompt.go:60
|
||||||
msgid "Would you like to view the build script for %s"
|
msgid "Would you like to view the build script for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -311,15 +311,15 @@ msgstr ""
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:83
|
#: internal/utils/cmd.go:95
|
||||||
msgid "Error dropping capabilities"
|
msgid "Error dropping capabilities"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:103
|
#: internal/utils/cmd.go:123
|
||||||
msgid "You need to be root to perform this action"
|
msgid "You need to be root to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:145
|
#: internal/utils/cmd.go:165
|
||||||
msgid "You need to be a %s member to perform this action"
|
msgid "You need to be a %s member to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -507,14 +507,14 @@ msgstr ""
|
|||||||
msgid "Error executing template"
|
msgid "Error executing template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:50
|
#: upgrade.go:47
|
||||||
msgid "Upgrade all installed packages"
|
msgid "Upgrade all installed packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:99 upgrade.go:116
|
#: upgrade.go:109 upgrade.go:126
|
||||||
msgid "Error checking for updates"
|
msgid "Error checking for updates"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:119
|
#: upgrade.go:129
|
||||||
msgid "There is nothing to do."
|
msgid "There is nothing to do."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -54,15 +54,15 @@ msgstr "Пакет не найден"
|
|||||||
msgid "Nothing to build"
|
msgid "Nothing to build"
|
||||||
msgstr "Исполнение build()"
|
msgstr "Исполнение build()"
|
||||||
|
|
||||||
#: build.go:201
|
#: build.go:218
|
||||||
msgid "Error building package"
|
msgid "Error building package"
|
||||||
msgstr "Ошибка при сборке пакета"
|
msgstr "Ошибка при сборке пакета"
|
||||||
|
|
||||||
#: build.go:208
|
#: build.go:225
|
||||||
msgid "Error moving the package"
|
msgid "Error moving the package"
|
||||||
msgstr "Ошибка при перемещении пакета"
|
msgstr "Ошибка при перемещении пакета"
|
||||||
|
|
||||||
#: build.go:212
|
#: build.go:229
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr "Сделано"
|
msgstr "Сделано"
|
||||||
|
|
||||||
@ -167,31 +167,27 @@ msgstr "Ошибка кодирования переменных скрита"
|
|||||||
msgid "Install a new package"
|
msgid "Install a new package"
|
||||||
msgstr "Установить новый пакет"
|
msgstr "Установить новый пакет"
|
||||||
|
|
||||||
#: install.go:62
|
#: install.go:56
|
||||||
msgid "Command install expected at least 1 argument, got %d"
|
msgid "Command install expected at least 1 argument, got %d"
|
||||||
msgstr "Для команды install ожидался хотя бы 1 аргумент, получено %d"
|
msgstr "Для команды install ожидался хотя бы 1 аргумент, получено %d"
|
||||||
|
|
||||||
#: install.go:101
|
#: install.go:118
|
||||||
msgid "Error parsing os release"
|
msgid "Error parsing os release"
|
||||||
msgstr "Ошибка при разборе файла выпуска операционной системы"
|
msgstr "Ошибка при разборе файла выпуска операционной системы"
|
||||||
|
|
||||||
#: install.go:146
|
#: install.go:163
|
||||||
msgid "Remove an installed package"
|
msgid "Remove an installed package"
|
||||||
msgstr "Удалить установленный пакет"
|
msgstr "Удалить установленный пакет"
|
||||||
|
|
||||||
#: install.go:164 install.go:214
|
#: install.go:182
|
||||||
msgid "Unable to detect a supported package manager on the system"
|
|
||||||
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
|
|
||||||
|
|
||||||
#: install.go:168
|
|
||||||
msgid "Error listing installed packages"
|
msgid "Error listing installed packages"
|
||||||
msgstr "Ошибка при составлении списка установленных пакетов"
|
msgstr "Ошибка при составлении списка установленных пакетов"
|
||||||
|
|
||||||
#: install.go:209
|
#: install.go:223
|
||||||
msgid "Command remove expected at least 1 argument, got %d"
|
msgid "Command remove expected at least 1 argument, got %d"
|
||||||
msgstr "Для команды remove ожидался хотя бы 1 аргумент, получено %d"
|
msgstr "Для команды remove ожидался хотя бы 1 аргумент, получено %d"
|
||||||
|
|
||||||
#: install.go:222
|
#: install.go:239
|
||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr "Ошибка при удалении пакетов"
|
msgstr "Ошибка при удалении пакетов"
|
||||||
|
|
||||||
@ -208,6 +204,10 @@ msgstr "Ошибка инициализации базы данных"
|
|||||||
msgid "Error pulling repositories"
|
msgid "Error pulling repositories"
|
||||||
msgstr "Ошибка при извлечении репозиториев"
|
msgstr "Ошибка при извлечении репозиториев"
|
||||||
|
|
||||||
|
#: internal/cliutils/app_builder/builder.go:165
|
||||||
|
msgid "Unable to detect a supported package manager on the system"
|
||||||
|
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
|
||||||
|
|
||||||
#: internal/cliutils/prompt.go:60
|
#: internal/cliutils/prompt.go:60
|
||||||
msgid "Would you like to view the build script for %s"
|
msgid "Would you like to view the build script for %s"
|
||||||
msgstr "Показать скрипт для пакета %s"
|
msgstr "Показать скрипт для пакета %s"
|
||||||
@ -326,16 +326,16 @@ msgstr "%s %s загружается — %s/с\n"
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr "ОШИБКА"
|
msgstr "ОШИБКА"
|
||||||
|
|
||||||
#: internal/utils/cmd.go:83
|
#: internal/utils/cmd.go:95
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Error dropping capabilities"
|
msgid "Error dropping capabilities"
|
||||||
msgstr "Ошибка при открытии базы данных"
|
msgstr "Ошибка при открытии базы данных"
|
||||||
|
|
||||||
#: internal/utils/cmd.go:103
|
#: internal/utils/cmd.go:123
|
||||||
msgid "You need to be root to perform this action"
|
msgid "You need to be root to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:145
|
#: internal/utils/cmd.go:165
|
||||||
msgid "You need to be a %s member to perform this action"
|
msgid "You need to be a %s member to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -533,15 +533,15 @@ msgstr "Ошибка при разборе шаблона"
|
|||||||
msgid "Error executing template"
|
msgid "Error executing template"
|
||||||
msgstr "Ошибка при выполнении шаблона"
|
msgstr "Ошибка при выполнении шаблона"
|
||||||
|
|
||||||
#: upgrade.go:50
|
#: upgrade.go:47
|
||||||
msgid "Upgrade all installed packages"
|
msgid "Upgrade all installed packages"
|
||||||
msgstr "Обновить все установленные пакеты"
|
msgstr "Обновить все установленные пакеты"
|
||||||
|
|
||||||
#: upgrade.go:99 upgrade.go:116
|
#: upgrade.go:109 upgrade.go:126
|
||||||
msgid "Error checking for updates"
|
msgid "Error checking for updates"
|
||||||
msgstr "Ошибка при проверке обновлений"
|
msgstr "Ошибка при проверке обновлений"
|
||||||
|
|
||||||
#: upgrade.go:119
|
#: upgrade.go:129
|
||||||
msgid "There is nothing to do."
|
msgid "There is nothing to do."
|
||||||
msgstr "Здесь нечего делать."
|
msgstr "Здесь нечего делать."
|
||||||
|
|
||||||
|
@ -73,6 +73,18 @@ func DropCapsToAlrUser() error {
|
|||||||
return EnsureIsAlrUser()
|
return EnsureIsAlrUser()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExitIfCantDropGidToAlr() cli.ExitCoder {
|
||||||
|
_, gid, err := GetUidGidAlrUser()
|
||||||
|
if err != nil {
|
||||||
|
return cliutils.FormatCliExit("cannot get gid alr", err)
|
||||||
|
}
|
||||||
|
err = syscall.Setgid(gid)
|
||||||
|
if err != nil {
|
||||||
|
return cliutils.FormatCliExit("cannot get setgid alr", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ExitIfCantDropCapsToAlrUser attempts to drop capabilities to the already
|
// ExitIfCantDropCapsToAlrUser attempts to drop capabilities to the already
|
||||||
// running user. Returns a cli.ExitCoder with an error if the operation fails.
|
// running user. Returns a cli.ExitCoder with an error if the operation fails.
|
||||||
// See also [ExitIfCantDropCapsToAlrUserNoPrivs] for a version that also applies
|
// See also [ExitIfCantDropCapsToAlrUserNoPrivs] for a version that also applies
|
||||||
@ -85,14 +97,22 @@ func ExitIfCantDropCapsToAlrUser() cli.ExitCoder {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExitIfCantDropCapsToAlrUserNoPrivs combines [ExitIfCantDropCapsToAlrUser] with [NoNewPrivs]
|
func ExitIfCantSetNoNewPrivs() cli.ExitCoder {
|
||||||
|
if err := NoNewPrivs(); err != nil {
|
||||||
|
return cliutils.FormatCliExit("error no new privs", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExitIfCantDropCapsToAlrUserNoPrivs combines [ExitIfCantDropCapsToAlrUser] with [ExitIfCantSetNoNewPrivs]
|
||||||
func ExitIfCantDropCapsToAlrUserNoPrivs() cli.ExitCoder {
|
func ExitIfCantDropCapsToAlrUserNoPrivs() cli.ExitCoder {
|
||||||
if err := ExitIfCantDropCapsToAlrUser(); err != nil {
|
if err := ExitIfCantDropCapsToAlrUser(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := NoNewPrivs(); err != nil {
|
if err := ExitIfCantSetNoNewPrivs(); err != nil {
|
||||||
return cliutils.FormatCliExit("error no new privs", err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
2
list.go
2
list.go
@ -47,7 +47,7 @@ func ListCmd() *cli.Command {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
if err := utils.ExitIfCantDropCapsToAlrUserNoPrivs(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,10 +17,6 @@
|
|||||||
package build
|
package build
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log/slog"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -28,48 +24,11 @@ func NewMainBuilder(
|
|||||||
cfg Config,
|
cfg Config,
|
||||||
mgr manager.Manager,
|
mgr manager.Manager,
|
||||||
repos PackageFinder,
|
repos PackageFinder,
|
||||||
) (*Builder, func(), error) {
|
scriptExecutor ScriptExecutor,
|
||||||
var err error
|
installerExecutor InstallerExecutor,
|
||||||
|
) (*Builder, error) {
|
||||||
var safeInstallerClose, safeScriptExecutorClose func()
|
|
||||||
|
|
||||||
var cleanupOnce sync.Once
|
|
||||||
cleanup := func() {
|
|
||||||
cleanupOnce.Do(func() {
|
|
||||||
if safeScriptExecutorClose != nil {
|
|
||||||
safeScriptExecutorClose()
|
|
||||||
}
|
|
||||||
if safeInstallerClose != nil {
|
|
||||||
safeInstallerClose()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
slog.Debug("close executors")
|
|
||||||
cleanup()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
installerExecutor, safeInstallerClose, err := GetSafeInstaller()
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// It is very important!
|
|
||||||
// See https://stackoverflow.com/questions/47296408/cannot-open-uid-map-for-writing-from-an-app-with-cap-setuid-capability-set
|
|
||||||
if err = utils.NoNewPrivs(); err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
s, safeScriptExecutorClose, err := GetSafeScriptExecutor()
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
builder := &Builder{
|
builder := &Builder{
|
||||||
scriptExecutor: s,
|
scriptExecutor: scriptExecutor,
|
||||||
cacheExecutor: &Cache{
|
cacheExecutor: &Cache{
|
||||||
cfg,
|
cfg,
|
||||||
},
|
},
|
||||||
@ -89,5 +48,5 @@ func NewMainBuilder(
|
|||||||
repos: repos,
|
repos: repos,
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder, cleanup, nil
|
return builder, nil
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,6 @@ import (
|
|||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type InstallerPlugin struct {
|
type InstallerPlugin struct {
|
||||||
@ -99,17 +98,20 @@ func GetSafeInstaller() (InstallerExecutor, func(), error) {
|
|||||||
"ALR_LOG_LEVEL=DEBUG",
|
"ALR_LOG_LEVEL=DEBUG",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
uid, gid, err := utils.GetUidGidAlrUser()
|
uid, gid, err := utils.GetUidGidAlrUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||||
Credential: &syscall.Credential{
|
Credential: &syscall.Credential{
|
||||||
Uid: uint32(uid),
|
Uid: uint32(uid),
|
||||||
Gid: uint32(gid),
|
Gid: uint32(gid),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
||||||
|
|
||||||
|
@ -24,13 +24,11 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var HandshakeConfig = plugin.HandshakeConfig{
|
var HandshakeConfig = plugin.HandshakeConfig{
|
||||||
@ -235,16 +233,19 @@ func GetSafeScriptExecutor() (ScriptExecutor, func(), error) {
|
|||||||
"PATH=/usr/bin:/bin:/usr/local/bin",
|
"PATH=/usr/bin:/bin:/usr/local/bin",
|
||||||
"ALR_LOG_LEVEL=DEBUG",
|
"ALR_LOG_LEVEL=DEBUG",
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
uid, gid, err := utils.GetUidGidAlrUser()
|
uid, gid, err := utils.GetUidGidAlrUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||||
Credential: &syscall.Credential{
|
Credential: &syscall.Credential{
|
||||||
Uid: uint32(uid),
|
Uid: uint32(uid),
|
||||||
Gid: uint32(gid),
|
Gid: uint32(gid),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
client := plugin.NewClient(&plugin.ClientConfig{
|
client := plugin.NewClient(&plugin.ClientConfig{
|
||||||
HandshakeConfig: HandshakeConfig,
|
HandshakeConfig: HandshakeConfig,
|
||||||
|
2
repo.go
2
repo.go
@ -90,7 +90,7 @@ func AddRepoCmd() *cli.Command {
|
|||||||
return cliutils.FormatCliExit(gotext.Get("Error saving config"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error saving config"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
if err := utils.ExitIfCantDropCapsToAlrUserNoPrivs(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func SearchCmd() *cli.Command {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
if err := utils.ExitIfCantDropCapsToAlrUserNoPrivs(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
42
upgrade.go
42
upgrade.go
@ -23,7 +23,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
@ -32,7 +31,6 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
||||||
@ -40,7 +38,6 @@ import (
|
|||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -61,13 +58,33 @@ func UpgradeCmd() *cli.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
installer, installerClose, err := build.GetSafeInstaller()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer installerClose()
|
||||||
|
|
||||||
|
if err := utils.ExitIfCantSetNoNewPrivs(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
scripter, scripterClose, err := build.GetSafeScriptExecutor()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer scripterClose()
|
||||||
|
|
||||||
ctx := c.Context
|
ctx := c.Context
|
||||||
|
|
||||||
deps, err := appbuilder.
|
deps, err := appbuilder.
|
||||||
New(ctx).
|
New(ctx).
|
||||||
WithConfig().
|
WithConfig().
|
||||||
WithDB().
|
WithDB().
|
||||||
WithReposNoPull().
|
WithRepos().
|
||||||
WithDistroInfo().
|
WithDistroInfo().
|
||||||
WithManager().
|
WithManager().
|
||||||
Build()
|
Build()
|
||||||
@ -76,25 +93,18 @@ func UpgradeCmd() *cli.Command {
|
|||||||
}
|
}
|
||||||
defer deps.Defer()
|
defer deps.Defer()
|
||||||
|
|
||||||
builder, cleanup, err := build.NewMainBuilder(
|
builder, err := build.NewMainBuilder(
|
||||||
deps.Cfg,
|
deps.Cfg,
|
||||||
deps.Manager,
|
deps.Manager,
|
||||||
deps.Repos,
|
deps.Repos,
|
||||||
|
scripter,
|
||||||
|
installer,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer cleanup()
|
|
||||||
|
|
||||||
slog.Warn("", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
updates, err := checkForUpdates(ctx, deps.Manager, deps.DB, deps.Info)
|
||||||
|
|
||||||
if deps.Cfg.AutoPull() {
|
|
||||||
if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error pulling repositories"), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updates, err := checkForUpdates(ctx, deps.Manager, deps.Cfg, deps.DB, deps.Repos, deps.Info)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error checking for updates"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error checking for updates"), err)
|
||||||
}
|
}
|
||||||
@ -127,9 +137,7 @@ func UpgradeCmd() *cli.Command {
|
|||||||
func checkForUpdates(
|
func checkForUpdates(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
mgr manager.Manager,
|
mgr manager.Manager,
|
||||||
cfg *config.ALRConfig,
|
|
||||||
db *database.Database,
|
db *database.Database,
|
||||||
rs *repos.Repos,
|
|
||||||
info *distro.OSRelease,
|
info *distro.OSRelease,
|
||||||
) ([]database.Package, error) {
|
) ([]database.Package, error) {
|
||||||
installed, err := mgr.ListInstalled(nil)
|
installed, err := mgr.ListInstalled(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user