From 83b8f3b047ef1d57037708f0cfe0442354aec2c6 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Wed, 16 Apr 2025 08:33:40 +0300 Subject: [PATCH 1/2] fix(i18n): pass LANG vars to _internal --- pkg/build/safe_common.go | 40 +++++++++++++++++++++++++++++++ pkg/build/safe_installer.go | 23 +----------------- pkg/build/safe_script_executor.go | 21 +--------------- 3 files changed, 42 insertions(+), 42 deletions(-) create mode 100644 pkg/build/safe_common.go diff --git a/pkg/build/safe_common.go b/pkg/build/safe_common.go new file mode 100644 index 0000000..7f1ec0b --- /dev/null +++ b/pkg/build/safe_common.go @@ -0,0 +1,40 @@ +// ALR - Any Linux Repository +// Copyright (C) 2025 Евгений Храмов +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package build + +import ( + "os" + "os/exec" + "strings" +) + +func setCommonCmdEnv(cmd *exec.Cmd) { + cmd.Env = []string{ + "HOME=/var/cache/alr", + "LOGNAME=alr", + "USER=alr", + "PATH=/usr/bin:/bin:/usr/local/bin", + } + for _, env := range os.Environ() { + if strings.HasPrefix(env, "LANG=") || + strings.HasPrefix(env, "LANGUAGE=") || + strings.HasPrefix(env, "LC_") || + strings.HasPrefix(env, "ALR_LOG_LEVEL=") { + cmd.Env = append(cmd.Env, env) + } + } +} diff --git a/pkg/build/safe_installer.go b/pkg/build/safe_installer.go index 2d143e4..2305131 100644 --- a/pkg/build/safe_installer.go +++ b/pkg/build/safe_installer.go @@ -90,28 +90,7 @@ func GetSafeInstaller() (InstallerExecutor, func(), error) { return nil, nil, err } cmd := exec.Command(executable, "_internal-installer") - cmd.Env = []string{ - "HOME=/var/cache/alr", - "LOGNAME=alr", - "USER=alr", - "PATH=/usr/bin:/bin:/usr/local/bin", - "ALR_LOG_LEVEL=DEBUG", - } - - /* - uid, gid, err := utils.GetUidGidAlrUser() - if err != nil { - return nil, nil, err - } - - - cmd.SysProcAttr = &syscall.SysProcAttr{ - Credential: &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), - }, - } - */ + setCommonCmdEnv(cmd) slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid()) diff --git a/pkg/build/safe_script_executor.go b/pkg/build/safe_script_executor.go index a9b1cb7..49d4281 100644 --- a/pkg/build/safe_script_executor.go +++ b/pkg/build/safe_script_executor.go @@ -226,26 +226,7 @@ func GetSafeScriptExecutor() (ScriptExecutor, func(), error) { } cmd := exec.Command(executable, "_internal-safe-script-executor") - cmd.Env = []string{ - "HOME=/var/cache/alr", - "LOGNAME=alr", - "USER=alr", - "PATH=/usr/bin:/bin:/usr/local/bin", - "ALR_LOG_LEVEL=DEBUG", - } - /* - uid, gid, err := utils.GetUidGidAlrUser() - if err != nil { - return nil, nil, err - } - - cmd.SysProcAttr = &syscall.SysProcAttr{ - Credential: &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), - }, - } - */ + setCommonCmdEnv(cmd) client := plugin.NewClient(&plugin.ClientConfig{ HandshakeConfig: HandshakeConfig, From 0d917190abdcff8dcd74e093913106b1f00488c7 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Thu, 17 Apr 2025 10:15:51 +0300 Subject: [PATCH 2/2] fix non-interactive install and add fallback in HandleExitCoder --- e2e-tests/issue_32_interactive_test.go | 17 ++++++++++++--- internal/cliutils/utils.go | 3 +++ internal/translations/default.pot | 8 +++---- internal/translations/po/ru/default.po | 8 +++---- pkg/build/build.go | 20 +++++++++++++----- pkg/build/installer.go | 8 +++---- pkg/build/safe_installer.go | 29 ++++++++++++++++++-------- 7 files changed, 64 insertions(+), 29 deletions(-) diff --git a/e2e-tests/issue_32_interactive_test.go b/e2e-tests/issue_32_interactive_test.go index 389a7a9..2f12fb5 100644 --- a/e2e-tests/issue_32_interactive_test.go +++ b/e2e-tests/issue_32_interactive_test.go @@ -31,10 +31,21 @@ func TestE2EIssue32Interactive(t *testing.T) { "issue-32-interactive", COMMON_SYSTEMS, func(t *testing.T, r e2e.Runnable) { - err := r.Exec(e2e.NewCommand( + assert.NoError(t, r.Exec(e2e.NewCommand( "sudo", "alr", "--interactive=false", "remove", "ca-certificates", - )) - assert.NoError(t, err) + ))) + + assert.NoError(t, r.Exec(e2e.NewCommand( + "sudo", "alr", "--interactive=false", "remove", "openssl", + ))) + + assert.NoError(t, r.Exec(e2e.NewCommand( + "alr", "fix", + ))) + + assert.NoError(t, r.Exec(e2e.NewCommand( + "sudo", "alr", "--interactive=false", "install", "ca-certificates", + ))) }, ) } diff --git a/internal/cliutils/utils.go b/internal/cliutils/utils.go index afd7a04..3828830 100644 --- a/internal/cliutils/utils.go +++ b/internal/cliutils/utils.go @@ -46,6 +46,9 @@ func HandleExitCoder(err error) { cli.OsExiter(exitErr.ExitCode()) return } + + slog.Error(err.Error()) + cli.OsExiter(1) } func FormatCliExit(msg string, err error) cli.ExitCoder { diff --git a/internal/translations/default.pot b/internal/translations/default.pot index cd23fb8..1555f81 100644 --- a/internal/translations/default.pot +++ b/internal/translations/default.pot @@ -347,19 +347,19 @@ msgstr "" msgid "Error while running app" msgstr "" -#: pkg/build/build.go:394 +#: pkg/build/build.go:395 msgid "Building package" msgstr "" -#: pkg/build/build.go:423 +#: pkg/build/build.go:424 msgid "The checksums array must be the same length as sources" msgstr "" -#: pkg/build/build.go:454 +#: pkg/build/build.go:455 msgid "Downloading sources" msgstr "" -#: pkg/build/build.go:543 +#: pkg/build/build.go:549 msgid "Installing dependencies" msgstr "" diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index 2714217..d553d07 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -363,19 +363,19 @@ msgstr "Показать справку" msgid "Error while running app" msgstr "Ошибка при запуске приложения" -#: pkg/build/build.go:394 +#: pkg/build/build.go:395 msgid "Building package" msgstr "Сборка пакета" -#: pkg/build/build.go:423 +#: pkg/build/build.go:424 msgid "The checksums array must be the same length as sources" msgstr "Массив контрольных сумм должен быть той же длины, что и источники" -#: pkg/build/build.go:454 +#: pkg/build/build.go:455 msgid "Downloading sources" msgstr "Скачивание источников" -#: pkg/build/build.go:543 +#: pkg/build/build.go:549 msgid "Installing dependencies" msgstr "Установка зависимостей" diff --git a/pkg/build/build.go b/pkg/build/build.go index 31c9e93..2137e98 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -35,6 +35,7 @@ import ( "gitea.plemya-x.ru/Plemya-x/ALR/internal/db" "gitea.plemya-x.ru/Plemya-x/ALR/internal/types" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" ) type BuildInput struct { @@ -233,8 +234,8 @@ type CheckerExecutor interface { } type InstallerExecutor interface { - InstallLocal(paths []string) error - Install(pkgs []string) error + InstallLocal(paths []string, opts *manager.Opts) error + Install(pkgs []string, opts *manager.Opts) error RemoveAlreadyInstalled(pkgs []string) ([]string, error) } @@ -521,7 +522,12 @@ func (b *Builder) InstallALRPackages( return err } - err = b.installerExecutor.InstallLocal(res.PackagePaths) + err = b.installerExecutor.InstallLocal( + res.PackagePaths, + &manager.Opts{ + NoConfirm: !input.BuildOpts().Interactive, + }, + ) if err != nil { return err } @@ -681,14 +687,18 @@ func (i *Builder) InstallPkgs( } if len(builtPaths) > 0 { - err = i.installerExecutor.InstallLocal(builtPaths) + err = i.installerExecutor.InstallLocal(builtPaths, &manager.Opts{ + NoConfirm: !input.BuildOpts().Interactive, + }) if err != nil { return err } } if len(repoDeps) > 0 { - err = i.installerExecutor.Install(repoDeps) + err = i.installerExecutor.Install(repoDeps, &manager.Opts{ + NoConfirm: !input.BuildOpts().Interactive, + }) if err != nil { return err } diff --git a/pkg/build/installer.go b/pkg/build/installer.go index d4e86ad..1522e73 100644 --- a/pkg/build/installer.go +++ b/pkg/build/installer.go @@ -28,12 +28,12 @@ func NewInstaller(mgr manager.Manager) *Installer { type Installer struct{ mgr manager.Manager } -func (i *Installer) InstallLocal(paths []string) error { - return i.mgr.InstallLocal(nil, paths...) +func (i *Installer) InstallLocal(paths []string, opts *manager.Opts) error { + return i.mgr.InstallLocal(opts, paths...) } -func (i *Installer) Install(pkgs []string) error { - return i.mgr.Install(nil, pkgs...) +func (i *Installer) Install(pkgs []string, opts *manager.Opts) error { + return i.mgr.Install(opts, pkgs...) } func (i *Installer) RemoveAlreadyInstalled(pkgs []string) ([]string, error) { diff --git a/pkg/build/safe_installer.go b/pkg/build/safe_installer.go index 2305131..feec190 100644 --- a/pkg/build/safe_installer.go +++ b/pkg/build/safe_installer.go @@ -28,6 +28,7 @@ import ( "github.com/hashicorp/go-plugin" "gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" ) type InstallerPlugin struct { @@ -42,21 +43,31 @@ type InstallerRPCServer struct { Impl InstallerExecutor } -func (r *InstallerRPC) InstallLocal(paths []string) error { - return r.client.Call("Plugin.InstallLocal", paths, nil) +type InstallArgs struct { + PackagesOrPaths []string + Opts *manager.Opts } -func (s *InstallerRPCServer) InstallLocal(paths []string, reply *struct{}) error { - return s.Impl.InstallLocal(paths) +func (r *InstallerRPC) InstallLocal(paths []string, opts *manager.Opts) error { + return r.client.Call("Plugin.InstallLocal", &InstallArgs{ + PackagesOrPaths: paths, + Opts: opts, + }, nil) } -func (r *InstallerRPC) Install(pkgs []string) error { - return r.client.Call("Plugin.Install", pkgs, nil) +func (s *InstallerRPCServer) InstallLocal(args *InstallArgs, reply *struct{}) error { + return s.Impl.InstallLocal(args.PackagesOrPaths, args.Opts) } -func (s *InstallerRPCServer) Install(pkgs []string, reply *struct{}) error { - slog.Debug("install", "pkgs", pkgs) - return s.Impl.Install(pkgs) +func (r *InstallerRPC) Install(pkgs []string, opts *manager.Opts) error { + return r.client.Call("Plugin.Install", &InstallArgs{ + PackagesOrPaths: pkgs, + Opts: opts, + }, nil) +} + +func (s *InstallerRPCServer) Install(args *InstallArgs, reply *struct{}) error { + return s.Impl.Install(args.PackagesOrPaths, args.Opts) } func (r *InstallerRPC) RemoveAlreadyInstalled(paths []string) ([]string, error) {