diff --git a/assets/coverage-badge.svg b/assets/coverage-badge.svg index 51c5462..f725e1b 100644 --- a/assets/coverage-badge.svg +++ b/assets/coverage-badge.svg @@ -11,7 +11,7 @@ coverage coverage - 16.1% - 16.1% + 16.0% + 16.0% diff --git a/assets/i18n-ru-badge.svg b/assets/i18n-ru-badge.svg index b5c7350..b447b28 100644 --- a/assets/i18n-ru-badge.svg +++ b/assets/i18n-ru-badge.svg @@ -12,7 +12,7 @@ ru translate ru translate - 99.00% - 99.00% + 97.00% + 97.00% diff --git a/build.go b/build.go index 5955d95..162cc88 100644 --- a/build.go +++ b/build.go @@ -66,16 +66,20 @@ func BuildCmd() *cli.Command { }, }, Action: func(c *cli.Context) error { + if err := utils.EnuseIsPrivilegedGroupMember(); err != nil { + return nil + } + wd, err := os.Getwd() if err != nil { return cliutils.FormatCliExit(gotext.Get("Error getting working directory"), err) } - wd, cleanup, err := Mount(wd) + wd, wdCleanup, err := Mount(wd) if err != nil { return err } - defer cleanup() + defer wdCleanup() ctx := c.Context @@ -105,42 +109,31 @@ func BuildCmd() *cli.Command { return cliutils.FormatCliExit(gotext.Get("Error parsing os release"), err) } - if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil { - return err - } - - builder, err := build.NewMainBuilder( - deps.Cfg, - deps.Repos, - ) - if err != nil { - return err - } - var res *build.BuildResult + var scriptArgs *build.BuildPackageFromScriptArgs + var dbArgs *build.BuildPackageFromDbArgs + switch { case c.IsSet("script"): - script = c.String("script") + script, err = filepath.Abs(c.String("script")) + if err != nil { + return cliutils.FormatCliExit(gotext.Get("Cannot get absolute script path"), err) + } + packages = append(packages, c.String("script-package")) - res, err = builder.BuildPackageFromScript( - ctx, - &build.BuildPackageFromScriptArgs{ - Script: script, - Packages: packages, - BuildArgs: build.BuildArgs{ - Opts: &types.BuildOpts{ - Clean: c.Bool("clean"), - Interactive: c.Bool("interactive"), - }, - PkgFormat_: build.GetPkgFormat(mgr), - Info: info, + scriptArgs = &build.BuildPackageFromScriptArgs{ + Script: script, + Packages: packages, + BuildArgs: build.BuildArgs{ + Opts: &types.BuildOpts{ + Clean: c.Bool("clean"), + Interactive: c.Bool("interactive"), }, + PkgFormat_: build.GetPkgFormat(mgr), + Info: info, }, - ) - if err != nil { - return cliutils.FormatCliExit(gotext.Get("Error building package"), err) } case c.IsSet("package"): // TODO: handle multiple packages @@ -165,27 +158,58 @@ func BuildCmd() *cli.Command { packages = append(packages, pkg[0].Name) } - res, err = builder.BuildPackageFromDb( - ctx, - &build.BuildPackageFromDbArgs{ - Package: &pkg[0], - Packages: packages, - BuildArgs: build.BuildArgs{ - Opts: &types.BuildOpts{ - Clean: c.Bool("clean"), - Interactive: c.Bool("interactive"), - }, - PkgFormat_: build.GetPkgFormat(mgr), - Info: info, + dbArgs = &build.BuildPackageFromDbArgs{ + Package: &pkg[0], + Packages: packages, + BuildArgs: build.BuildArgs{ + Opts: &types.BuildOpts{ + Clean: c.Bool("clean"), + Interactive: c.Bool("interactive"), }, + PkgFormat_: build.GetPkgFormat(mgr), + Info: info, }, - ) - if err != nil { - return cliutils.FormatCliExit(gotext.Get("Error building package"), err) } default: - slog.Error(gotext.Get("Nothing to build")) - os.Exit(1) + return cliutils.FormatCliExit(gotext.Get("Nothing to build"), nil) + } + + if scriptArgs != nil { + scriptFile := filepath.Base(scriptArgs.Script) + newScriptDir, scriptDirCleanup, err := Mount(filepath.Dir(scriptArgs.Script)) + if err != nil { + return err + } + defer scriptDirCleanup() + scriptArgs.Script = filepath.Join(newScriptDir, scriptFile) + } + + if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil { + return err + } + + builder, err := build.NewMainBuilder( + deps.Cfg, + deps.Repos, + ) + if err != nil { + return err + } + + if scriptArgs != nil { + res, err = builder.BuildPackageFromScript( + ctx, + scriptArgs, + ) + } else if dbArgs != nil { + res, err = builder.BuildPackageFromDb( + ctx, + dbArgs, + ) + } + + if err != nil { + return cliutils.FormatCliExit(gotext.Get("Error building package"), err) } // Перемещение собранных пакетов в рабочую директорию @@ -197,6 +221,8 @@ func BuildCmd() *cli.Command { } } + slog.Info(gotext.Get("Done")) + return nil }, } diff --git a/internal.go b/internal.go index 7546d87..b6646f5 100644 --- a/internal.go +++ b/internal.go @@ -198,10 +198,21 @@ func InternalMountCmd() *cli.Command { sourceDir := c.Args().First() - u, _ := user.Current() - _, alrGid, _ := utils.GetUidGidAlrUser() + u, err := user.Current() + if err != nil { + return cliutils.FormatCliExit("cannot get current user", err) + } - if err := utils.EnuseIsWheelMember(); err != nil { + _, alrGid, err := utils.GetUidGidAlrUser() + if err != nil { + return cliutils.FormatCliExit("cannot get alr user", err) + } + + if _, err := os.Stat(sourceDir); err != nil { + return cliutils.FormatCliExit(fmt.Sprintf("cannot read %s", sourceDir), err) + } + + if err := utils.EnuseIsPrivilegedGroupMember(); err != nil { return err } diff --git a/internal/constants/constants.go b/internal/constants/constants.go index 0ab0bfc..f113d59 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -20,4 +20,5 @@ const ( SystemConfigPath = "/etc/alr/alr.toml" SystemCachePath = "/var/cache/alr" AlrRunDir = "/var/run/alr" + PrivilegedGroup = "wheel" ) diff --git a/internal/translations/default.pot b/internal/translations/default.pot index a94ccb8..7f37aeb 100644 --- a/internal/translations/default.pot +++ b/internal/translations/default.pot @@ -30,34 +30,42 @@ msgid "" "Build package from scratch even if there's an already built package available" msgstr "" -#: build.go:71 +#: build.go:75 msgid "Error getting working directory" msgstr "" -#: build.go:99 +#: build.go:103 msgid "Unable to detect a supported package manager on the system" msgstr "" -#: build.go:105 +#: build.go:109 msgid "Error parsing os release" msgstr "" -#: build.go:143 build.go:184 -msgid "Error building package" +#: build.go:121 +msgid "Cannot get absolute script path" msgstr "" -#: build.go:160 +#: build.go:153 msgid "Package not found" msgstr "" -#: build.go:187 +#: build.go:174 msgid "Nothing to build" msgstr "" -#: build.go:196 +#: build.go:212 +msgid "Error building package" +msgstr "" + +#: build.go:220 msgid "Error moving the package" msgstr "" +#: build.go:224 +msgid "Done" +msgstr "" + #: fix.go:38 msgid "Attempt to fix problems with ALR" msgstr "" @@ -86,10 +94,6 @@ msgstr "" msgid "Unable to create new cache directory" msgstr "" -#: fix.go:98 -msgid "Done" -msgstr "" - #: gen.go:34 msgid "Generate a ALR script from a template" msgstr "" @@ -307,14 +311,18 @@ msgstr "" msgid "ERROR" msgstr "" -#: internal/utils/cmd.go:86 +#: internal/utils/cmd.go:87 msgid "Error dropping capabilities" msgstr "" -#: internal/utils/cmd.go:93 +#: internal/utils/cmd.go:94 msgid "You need to be root to perform this action" msgstr "" +#: internal/utils/cmd.go:136 +msgid "You need to be a %s member to perform this action" +msgstr "" + #: list.go:41 msgid "List ALR repo packages" msgstr "" diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index 16287b5..37fa919 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -37,35 +37,43 @@ msgid "" "Build package from scratch even if there's an already built package available" msgstr "Создайте пакет с нуля, даже если уже имеется готовый пакет" -#: build.go:71 +#: build.go:75 msgid "Error getting working directory" msgstr "Ошибка при получении рабочего каталога" -#: build.go:99 +#: build.go:103 msgid "Unable to detect a supported package manager on the system" msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе" -#: build.go:105 +#: build.go:109 msgid "Error parsing os release" msgstr "Ошибка при разборе файла выпуска операционной системы" -#: build.go:143 build.go:184 -msgid "Error building package" -msgstr "Ошибка при сборке пакета" +#: build.go:121 +msgid "Cannot get absolute script path" +msgstr "" -#: build.go:160 +#: build.go:153 msgid "Package not found" msgstr "Пакет не найден" -#: build.go:187 +#: build.go:174 #, fuzzy msgid "Nothing to build" msgstr "Исполнение build()" -#: build.go:196 +#: build.go:212 +msgid "Error building package" +msgstr "Ошибка при сборке пакета" + +#: build.go:220 msgid "Error moving the package" msgstr "Ошибка при перемещении пакета" +#: build.go:224 +msgid "Done" +msgstr "Сделано" + #: fix.go:38 msgid "Attempt to fix problems with ALR" msgstr "Попытка устранить проблемы с ALR" @@ -98,10 +106,6 @@ msgstr "Восстановление кэша" msgid "Unable to create new cache directory" msgstr "Не удалось создать новый каталог кэша" -#: fix.go:98 -msgid "Done" -msgstr "Сделано" - #: gen.go:34 msgid "Generate a ALR script from a template" msgstr "Генерация скрипта ALR из шаблона" @@ -322,15 +326,19 @@ msgstr "%s %s загружается — %s/с\n" msgid "ERROR" msgstr "ОШИБКА" -#: internal/utils/cmd.go:86 +#: internal/utils/cmd.go:87 #, fuzzy msgid "Error dropping capabilities" msgstr "Ошибка при открытии базы данных" -#: internal/utils/cmd.go:93 +#: internal/utils/cmd.go:94 msgid "You need to be root to perform this action" msgstr "" +#: internal/utils/cmd.go:136 +msgid "You need to be a %s member to perform this action" +msgstr "" + #: list.go:41 msgid "List ALR repo packages" msgstr "Список пакетов репозитория ALR" diff --git a/internal/utils/cmd.go b/internal/utils/cmd.go index c084d94..1698312 100644 --- a/internal/utils/cmd.go +++ b/internal/utils/cmd.go @@ -27,6 +27,7 @@ import ( "github.com/urfave/cli/v2" "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils" + "gitea.plemya-x.ru/Plemya-x/ALR/internal/constants" ) func GetUidGidAlrUserString() (string, string, error) { @@ -111,13 +112,13 @@ func EnuseIsAlrUser() error { return nil } -func EnuseIsWheelMember() error { +func EnuseIsPrivilegedGroupMember() error { currentUser, err := user.Current() if err != nil { return err } - group, err := user.LookupGroup("wheel") + group, err := user.LookupGroup(constants.PrivilegedGroup) if err != nil { return err } @@ -132,7 +133,7 @@ func EnuseIsWheelMember() error { return nil } } - return errors.New("looks like is not wheel member") + return cliutils.FormatCliExit(gotext.Get("You need to be a %s member to perform this action", constants.PrivilegedGroup), nil) } func EscalateToRootGid() error {