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 {