forked from Plemya-x/ALR
		
	wip
This commit is contained in:
		| @@ -11,7 +11,7 @@ | |||||||
|     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> |     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> | ||||||
|         <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> |         <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> | ||||||
|         <text x="33.5" y="14">coverage</text> |         <text x="33.5" y="14">coverage</text> | ||||||
|         <text x="86" y="15" fill="#010101" fill-opacity=".3">16.0%</text> |         <text x="86" y="15" fill="#010101" fill-opacity=".3">15.9%</text> | ||||||
|         <text x="86" y="14">16.0%</text> |         <text x="86" y="14">15.9%</text> | ||||||
|     </g> |     </g> | ||||||
| </svg> | </svg> | ||||||
|   | |||||||
| Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B | 
							
								
								
									
										4
									
								
								build.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								build.go
									
									
									
									
									
								
							| @@ -175,13 +175,15 @@ func BuildCmd() *cli.Command { | |||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			builder, err := build.NewMainBuilder( | 			builder, cleanup, err := build.NewMainBuilder( | ||||||
| 				deps.Cfg, | 				deps.Cfg, | ||||||
|  | 				deps.Manager, | ||||||
| 				deps.Repos, | 				deps.Repos, | ||||||
| 			) | 			) | ||||||
| 			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( | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								install.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								install.go
									
									
									
									
									
								
							| @@ -58,30 +58,28 @@ func InstallCmd() *cli.Command { | |||||||
| 				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) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			mgr := manager.Detect() |  | ||||||
| 			if mgr == nil { |  | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			deps, err := appbuilder. | 			deps, err := appbuilder. | ||||||
| 				New(ctx). | 				New(ctx). | ||||||
| 				WithConfig(). | 				WithConfig(). | ||||||
| 				WithDB(). | 				WithDB(). | ||||||
| 				WithReposNoPull(). | 				WithReposNoPull(). | ||||||
| 				WithDistroInfo(). | 				WithDistroInfo(). | ||||||
|  | 				WithManager(). | ||||||
| 				Build() | 				Build() | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			defer deps.Defer() | 			defer deps.Defer() | ||||||
|  |  | ||||||
| 			builder, err := build.NewMainBuilder( | 			builder, cleanup, err := build.NewMainBuilder( | ||||||
| 				deps.Cfg, | 				deps.Cfg, | ||||||
|  | 				deps.Manager, | ||||||
| 				deps.Repos, | 				deps.Repos, | ||||||
| 			) | 			) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  | 			defer cleanup() | ||||||
|  |  | ||||||
| 			if deps.Cfg.AutoPull() { | 			if deps.Cfg.AutoPull() { | ||||||
| 				if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil { | 				if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil { | ||||||
| @@ -89,10 +87,6 @@ func InstallCmd() *cli.Command { | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			err = builder.InstallPkgs( | 			err = builder.InstallPkgs( | ||||||
| 				ctx, | 				ctx, | ||||||
| 				&build.BuildArgs{ | 				&build.BuildArgs{ | ||||||
| @@ -101,7 +95,7 @@ func InstallCmd() *cli.Command { | |||||||
| 						Interactive: c.Bool("interactive"), | 						Interactive: c.Bool("interactive"), | ||||||
| 					}, | 					}, | ||||||
| 					Info:       deps.Info, | 					Info:       deps.Info, | ||||||
| 					PkgFormat_: build.GetPkgFormat(mgr), | 					PkgFormat_: build.GetPkgFormat(deps.Manager), | ||||||
| 				}, | 				}, | ||||||
| 				args.Slice(), | 				args.Slice(), | ||||||
| 			) | 			) | ||||||
|   | |||||||
| @@ -160,8 +160,8 @@ func (b *AppBuilder) WithManager() *AppBuilder { | |||||||
| 		return b | 		return b | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mgr := manager.Detect() | 	b.deps.Manager = manager.Detect() | ||||||
| 	if mgr == nil { | 	if b.deps.Manager == nil { | ||||||
| 		b.err = cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil) | 		b.err = cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ package logger | |||||||
| import ( | import ( | ||||||
| 	"io" | 	"io" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	chLog "github.com/charmbracelet/log" | 	chLog "github.com/charmbracelet/log" | ||||||
| 	"github.com/hashicorp/go-hclog" | 	"github.com/hashicorp/go-hclog" | ||||||
| @@ -55,7 +56,18 @@ func (a *HCLoggerAdapter) Log(level hclog.Level, msg string, args ...interface{} | |||||||
| 			filteredArgs = append(filteredArgs, args[i], args[i+1]) | 			filteredArgs = append(filteredArgs, args[i], args[i+1]) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	a.logger.l.Log(hclogLevelTochLog(level), msg, filteredArgs...) |  | ||||||
|  | 	/* | ||||||
|  | 	 * Start ugly hacks | ||||||
|  | 	 */ | ||||||
|  | 	var chLogLevel chLog.Level | ||||||
|  | 	if msg == "plugin process exited" || strings.HasPrefix(msg, "[DEBUG] plugin") { | ||||||
|  | 		chLogLevel = chLog.DebugLevel | ||||||
|  | 	} else { | ||||||
|  | 		chLogLevel = hclogLevelTochLog(level) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	a.logger.l.Log(chLogLevel, msg, filteredArgs...) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (a *HCLoggerAdapter) Trace(msg string, args ...interface{}) { | func (a *HCLoggerAdapter) Trace(msg string, args ...interface{}) { | ||||||
|   | |||||||
| @@ -46,15 +46,15 @@ msgstr "" | |||||||
| msgid "Nothing to build" | msgid "Nothing to build" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: build.go:199 | #: build.go:201 | ||||||
| msgid "Error building package" | msgid "Error building package" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: build.go:206 | #: build.go:208 | ||||||
| msgid "Error moving the package" | msgid "Error moving the package" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: build.go:210 | #: build.go:212 | ||||||
| msgid "Done" | msgid "Done" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -158,31 +158,31 @@ msgstr "" | |||||||
| msgid "Command install expected at least 1 argument, got %d" | msgid "Command install expected at least 1 argument, got %d" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:63 install.go:172 install.go:222 | #: install.go:86 | ||||||
| msgid "Unable to detect a supported package manager on the system" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: install.go:88 |  | ||||||
| msgid "Error pulling repositories" | msgid "Error pulling repositories" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:109 | #: install.go:103 | ||||||
| msgid "Error parsing os release" | msgid "Error parsing os release" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:154 | #: install.go:148 | ||||||
| msgid "Remove an installed package" | msgid "Remove an installed package" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:176 | #: install.go:166 install.go:216 | ||||||
|  | msgid "Unable to detect a supported package manager on the system" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: install.go:170 | ||||||
| msgid "Error listing installed packages" | msgid "Error listing installed packages" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:217 | #: install.go:211 | ||||||
| msgid "Command remove expected at least 1 argument, got %d" | msgid "Command remove expected at least 1 argument, got %d" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: install.go:230 | #: install.go:224 | ||||||
| msgid "Error removing packages" | msgid "Error removing packages" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -311,15 +311,15 @@ msgstr "" | |||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/utils/cmd.go:87 | #: internal/utils/cmd.go:79 | ||||||
| msgid "Error dropping capabilities" | msgid "Error dropping capabilities" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: internal/utils/cmd.go:94 | #: internal/utils/cmd.go:86 | ||||||
| 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:136 | #: internal/utils/cmd.go:128 | ||||||
| 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,18 +507,14 @@ msgstr "" | |||||||
| msgid "Error executing template" | msgid "Error executing template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: upgrade.go:48 | #: upgrade.go:50 | ||||||
| msgid "Upgrade all installed packages" | msgid "Upgrade all installed packages" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: upgrade.go:100 | #: upgrade.go:99 upgrade.go:116 | ||||||
| msgid "Error pulling repos" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: upgrade.go:106 upgrade.go:123 |  | ||||||
| msgid "Error checking for updates" | msgid "Error checking for updates" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: upgrade.go:126 | #: upgrade.go:119 | ||||||
| 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:199 | #: build.go:201 | ||||||
| msgid "Error building package" | msgid "Error building package" | ||||||
| msgstr "Ошибка при сборке пакета" | msgstr "Ошибка при сборке пакета" | ||||||
|  |  | ||||||
| #: build.go:206 | #: build.go:208 | ||||||
| msgid "Error moving the package" | msgid "Error moving the package" | ||||||
| msgstr "Ошибка при перемещении пакета" | msgstr "Ошибка при перемещении пакета" | ||||||
|  |  | ||||||
| #: build.go:210 | #: build.go:212 | ||||||
| msgid "Done" | msgid "Done" | ||||||
| msgstr "Сделано" | msgstr "Сделано" | ||||||
|  |  | ||||||
| @@ -171,31 +171,31 @@ msgstr "Установить новый пакет" | |||||||
| 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:63 install.go:172 install.go:222 | #: install.go:86 | ||||||
| msgid "Unable to detect a supported package manager on the system" |  | ||||||
| msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе" |  | ||||||
|  |  | ||||||
| #: install.go:88 |  | ||||||
| msgid "Error pulling repositories" | msgid "Error pulling repositories" | ||||||
| msgstr "Ошибка при извлечении репозиториев" | msgstr "Ошибка при извлечении репозиториев" | ||||||
|  |  | ||||||
| #: install.go:109 | #: install.go:103 | ||||||
| msgid "Error parsing os release" | msgid "Error parsing os release" | ||||||
| msgstr "Ошибка при разборе файла выпуска операционной системы" | msgstr "Ошибка при разборе файла выпуска операционной системы" | ||||||
|  |  | ||||||
| #: install.go:154 | #: install.go:148 | ||||||
| msgid "Remove an installed package" | msgid "Remove an installed package" | ||||||
| msgstr "Удалить установленный пакет" | msgstr "Удалить установленный пакет" | ||||||
|  |  | ||||||
| #: install.go:176 | #: install.go:166 install.go:216 | ||||||
|  | msgid "Unable to detect a supported package manager on the system" | ||||||
|  | msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе" | ||||||
|  |  | ||||||
|  | #: install.go:170 | ||||||
| msgid "Error listing installed packages" | msgid "Error listing installed packages" | ||||||
| msgstr "Ошибка при составлении списка установленных пакетов" | msgstr "Ошибка при составлении списка установленных пакетов" | ||||||
|  |  | ||||||
| #: install.go:217 | #: install.go:211 | ||||||
| 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:230 | #: install.go:224 | ||||||
| msgid "Error removing packages" | msgid "Error removing packages" | ||||||
| msgstr "Ошибка при удалении пакетов" | msgstr "Ошибка при удалении пакетов" | ||||||
|  |  | ||||||
| @@ -326,16 +326,16 @@ msgstr "%s %s загружается — %s/с\n" | |||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "ОШИБКА" | msgstr "ОШИБКА" | ||||||
|  |  | ||||||
| #: internal/utils/cmd.go:87 | #: internal/utils/cmd.go:79 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| msgid "Error dropping capabilities" | msgid "Error dropping capabilities" | ||||||
| msgstr "Ошибка при открытии базы данных" | msgstr "Ошибка при открытии базы данных" | ||||||
|  |  | ||||||
| #: internal/utils/cmd.go:94 | #: internal/utils/cmd.go:86 | ||||||
| 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:136 | #: internal/utils/cmd.go:128 | ||||||
| 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,22 +533,21 @@ msgstr "Ошибка при разборе шаблона" | |||||||
| msgid "Error executing template" | msgid "Error executing template" | ||||||
| msgstr "Ошибка при выполнении шаблона" | msgstr "Ошибка при выполнении шаблона" | ||||||
|  |  | ||||||
| #: upgrade.go:48 | #: upgrade.go:50 | ||||||
| msgid "Upgrade all installed packages" | msgid "Upgrade all installed packages" | ||||||
| msgstr "Обновить все установленные пакеты" | msgstr "Обновить все установленные пакеты" | ||||||
|  |  | ||||||
| #: upgrade.go:100 | #: upgrade.go:99 upgrade.go:116 | ||||||
| msgid "Error pulling repos" |  | ||||||
| msgstr "Ошибка при извлечении репозиториев" |  | ||||||
|  |  | ||||||
| #: upgrade.go:106 upgrade.go:123 |  | ||||||
| msgid "Error checking for updates" | msgid "Error checking for updates" | ||||||
| msgstr "Ошибка при проверке обновлений" | msgstr "Ошибка при проверке обновлений" | ||||||
|  |  | ||||||
| #: upgrade.go:126 | #: upgrade.go:119 | ||||||
| msgid "There is nothing to do." | msgid "There is nothing to do." | ||||||
| msgstr "Здесь нечего делать." | msgstr "Здесь нечего делать." | ||||||
|  |  | ||||||
|  | #~ msgid "Error pulling repos" | ||||||
|  | #~ msgstr "Ошибка при извлечении репозиториев" | ||||||
|  |  | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #~ msgid "Error getting current executable" | #~ msgid "Error getting current executable" | ||||||
| #~ msgstr "Ошибка при получении рабочего каталога" | #~ msgstr "Ошибка при получении рабочего каталога" | ||||||
|   | |||||||
| @@ -70,15 +70,7 @@ func DropCapsToAlrUser() error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	newUid := syscall.Getuid() | 	return EnuseIsAlrUser() | ||||||
| 	if newUid != uid { |  | ||||||
| 		return errors.New("new uid don't matches requested") |  | ||||||
| 	} |  | ||||||
| 	newGid := syscall.Getgid() |  | ||||||
| 	if newGid != gid { |  | ||||||
| 		return errors.New("new gid don't matches requested") |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func ExitIfCantDropCapsToAlrUser() cli.ExitCoder { | func ExitIfCantDropCapsToAlrUser() cli.ExitCoder { | ||||||
|   | |||||||
| @@ -18,6 +18,8 @@ package build | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
|  | 	"sync" | ||||||
|  | 	"syscall" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils" | 	"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" | ||||||
| @@ -25,28 +27,48 @@ import ( | |||||||
|  |  | ||||||
| func NewMainBuilder( | func NewMainBuilder( | ||||||
| 	cfg Config, | 	cfg Config, | ||||||
|  | 	mgr manager.Manager, | ||||||
| 	repos PackageFinder, | 	repos PackageFinder, | ||||||
| ) (*Builder, error) { | ) (*Builder, func(), error) { | ||||||
| 	installerExecutor, err := GetSafeInstaller() | 	var err 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 { | 	if err != nil { | ||||||
| 		slog.Error("i will panic GetSafeInstaller", "err", err) | 		return nil, nil, err | ||||||
| 		return nil, err |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// It is very important! | 	// It is very important! | ||||||
| 	// See https://stackoverflow.com/questions/47296408/cannot-open-uid-map-for-writing-from-an-app-with-cap-setuid-capability-set | 	// 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 { | 	if err = utils.NoNewPrivs(); err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	s, err := GetSafeScriptExecutor() | 	s, safeScriptExecutorClose, err := GetSafeScriptExecutor() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		slog.Error("i will panic GetSafeScriptExecutor", "err", err) | 		return nil, nil, err | ||||||
| 		return nil, err |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mgr := manager.Detect() |  | ||||||
|  |  | ||||||
| 	builder := &Builder{ | 	builder := &Builder{ | ||||||
| 		scriptExecutor: s, | 		scriptExecutor: s, | ||||||
| 		cacheExecutor: &Cache{ | 		cacheExecutor: &Cache{ | ||||||
| @@ -68,5 +90,7 @@ func NewMainBuilder( | |||||||
| 		repos: repos, | 		repos: repos, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return builder, nil | 	slog.Warn("uid", "uid", syscall.Getuid(), "gid", syscall.Getgid()) | ||||||
|  |  | ||||||
|  | 	return builder, cleanup, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,10 +18,12 @@ package build | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"fmt" | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
| 	"net/rpc" | 	"net/rpc" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
|  | 	"sync" | ||||||
| 	"syscall" | 	"syscall" | ||||||
|  |  | ||||||
| 	"github.com/hashicorp/go-plugin" | 	"github.com/hashicorp/go-plugin" | ||||||
| @@ -217,10 +219,12 @@ var pluginMap = map[string]plugin.Plugin{ | |||||||
| 	"installer":       &InstallerPlugin{}, | 	"installer":       &InstallerPlugin{}, | ||||||
| } | } | ||||||
|  |  | ||||||
| func GetSafeScriptExecutor() (ScriptExecutor, error) { | func GetSafeScriptExecutor() (ScriptExecutor, func(), error) { | ||||||
|  | 	var err error | ||||||
|  |  | ||||||
| 	executable, err := os.Executable() | 	executable, err := os.Executable() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := exec.Command(executable, "_internal-safe-script-executor") | 	cmd := exec.Command(executable, "_internal-safe-script-executor") | ||||||
| @@ -233,7 +237,7 @@ func GetSafeScriptExecutor() (ScriptExecutor, error) { | |||||||
| 	} | 	} | ||||||
| 	uid, gid, err := utils.GetUidGidAlrUser() | 	uid, gid, err := utils.GetUidGidAlrUser() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 	cmd.SysProcAttr = &syscall.SysProcAttr{ | 	cmd.SysProcAttr = &syscall.SysProcAttr{ | ||||||
| 		Credential: &syscall.Credential{ | 		Credential: &syscall.Credential{ | ||||||
| @@ -254,14 +258,33 @@ func GetSafeScriptExecutor() (ScriptExecutor, error) { | |||||||
| 	}) | 	}) | ||||||
| 	rpcClient, err := client.Client() | 	rpcClient, err := client.Client() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		slog.Info("1") | 		return nil, nil, err | ||||||
| 		return nil, err |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	raw1, err := rpcClient.Dispense("script-executor") | 	var cleanupOnce sync.Once | ||||||
|  | 	cleanup := func() { | ||||||
|  | 		cleanupOnce.Do(func() { | ||||||
|  | 			client.Kill() | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			slog.Debug("close script-executor") | ||||||
|  | 			cleanup() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	raw, err := rpcClient.Dispense("script-executor") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return raw1.(ScriptExecutor), nil | 	executor, ok := raw.(ScriptExecutor) | ||||||
|  | 	if !ok { | ||||||
|  | 		err = fmt.Errorf("dispensed object is not a ScriptExecutor (got %T)", raw) | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return executor, cleanup, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,15 +17,18 @@ | |||||||
| package build | package build | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
| 	"net/rpc" | 	"net/rpc" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
|  | 	"sync" | ||||||
| 	"syscall" | 	"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/utils" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type InstallerPlugin struct { | type InstallerPlugin struct { | ||||||
| @@ -80,10 +83,12 @@ func (p *InstallerPlugin) Server(*plugin.MuxBroker) (interface{}, error) { | |||||||
| 	return &InstallerRPCServer{Impl: p.Impl}, nil | 	return &InstallerRPCServer{Impl: p.Impl}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func GetSafeInstaller() (InstallerExecutor, error) { | func GetSafeInstaller() (InstallerExecutor, func(), error) { | ||||||
|  | 	var err error | ||||||
|  |  | ||||||
| 	executable, err := os.Executable() | 	executable, err := os.Executable() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 	cmd := exec.Command(executable, "_internal-installer") | 	cmd := exec.Command(executable, "_internal-installer") | ||||||
| 	cmd.Env = append(os.Environ(), | 	cmd.Env = append(os.Environ(), | ||||||
| @@ -94,6 +99,16 @@ func GetSafeInstaller() (InstallerExecutor, error) { | |||||||
| 		"ALR_LOG_LEVEL=DEBUG", | 		"ALR_LOG_LEVEL=DEBUG", | ||||||
| 		"XDG_SESSION_CLASS=user", | 		"XDG_SESSION_CLASS=user", | ||||||
| 	) | 	) | ||||||
|  | 	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), | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid()) | 	slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid()) | ||||||
|  |  | ||||||
| @@ -110,13 +125,33 @@ func GetSafeInstaller() (InstallerExecutor, error) { | |||||||
| 	}) | 	}) | ||||||
| 	rpcClient, err := client.Client() | 	rpcClient, err := client.Client() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	raw1, err := rpcClient.Dispense("installer") | 	var cleanupOnce sync.Once | ||||||
|  | 	cleanup := func() { | ||||||
|  | 		cleanupOnce.Do(func() { | ||||||
|  | 			client.Kill() | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			slog.Debug("close installer") | ||||||
|  | 			cleanup() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	raw, err := rpcClient.Dispense("installer") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return raw1.(InstallerExecutor), nil | 	executor, ok := raw.(InstallerExecutor) | ||||||
|  | 	if !ok { | ||||||
|  | 		err = fmt.Errorf("dispensed object is not a ScriptExecutor (got %T)", raw) | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return executor, cleanup, nil | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								upgrade.go
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								upgrade.go
									
									
									
									
									
								
							| @@ -23,6 +23,7 @@ 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" | ||||||
| @@ -30,6 +31,7 @@ import ( | |||||||
| 	"golang.org/x/exp/maps" | 	"golang.org/x/exp/maps" | ||||||
|  |  | ||||||
| 	"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" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"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" | ||||||
| @@ -55,53 +57,44 @@ func UpgradeCmd() *cli.Command { | |||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		Action: func(c *cli.Context) error { | 		Action: func(c *cli.Context) error { | ||||||
| 			err := utils.DropCapsToAlrUser() | 			if err := utils.ExitIfNotRoot(); err != nil { | ||||||
| 			if err != nil { | 				return err | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Error dropping capabilities"), err) |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			ctx := c.Context | 			ctx := c.Context | ||||||
|  |  | ||||||
| 			cfg := config.New() | 			deps, err := appbuilder. | ||||||
| 			err = cfg.Load() | 				New(ctx). | ||||||
|  | 				WithConfig(). | ||||||
|  | 				WithDB(). | ||||||
|  | 				WithReposNoPull(). | ||||||
|  | 				WithDistroInfo(). | ||||||
|  | 				WithManager(). | ||||||
|  | 				Build() | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Error loading config"), err) | 				return err | ||||||
| 			} | 			} | ||||||
|  | 			defer deps.Defer() | ||||||
|  |  | ||||||
| 			db := database.New(cfg) | 			builder, cleanup, err := build.NewMainBuilder( | ||||||
| 			rs := repos.New(cfg, db) | 				deps.Cfg, | ||||||
| 			err = db.Init(ctx) | 				deps.Manager, | ||||||
| 			if err != nil { | 				deps.Repos, | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Error initialization database"), err) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			builder, err := build.NewMainBuilder( |  | ||||||
| 				cfg, |  | ||||||
| 				rs, |  | ||||||
| 			) | 			) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  | 			defer cleanup() | ||||||
|  |  | ||||||
| 			info, err := distro.ParseOSRelease(ctx) | 			slog.Warn("", "uid", syscall.Getuid(), "gid", syscall.Getgid()) | ||||||
| 			slog.Debug("ParseOSRelease", "err", err) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Error parsing os-release file"), err) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			mgr := manager.Detect() | 			if deps.Cfg.AutoPull() { | ||||||
| 			if mgr == nil { | 				if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil { | ||||||
| 				return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil) | 					return cliutils.FormatCliExit(gotext.Get("Error pulling repositories"), err) | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			if cfg.AutoPull() { |  | ||||||
| 				err = rs.Pull(ctx, cfg.Repos()) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return cliutils.FormatCliExit(gotext.Get("Error pulling repos"), err) |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			updates, err := checkForUpdates(ctx, mgr, cfg, db, rs, info) | 			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) | ||||||
| 			} | 			} | ||||||
| @@ -114,8 +107,8 @@ func UpgradeCmd() *cli.Command { | |||||||
| 							Clean:       c.Bool("clean"), | 							Clean:       c.Bool("clean"), | ||||||
| 							Interactive: c.Bool("interactive"), | 							Interactive: c.Bool("interactive"), | ||||||
| 						}, | 						}, | ||||||
| 						Info:       info, | 						Info:       deps.Info, | ||||||
| 						PkgFormat_: build.GetPkgFormat(mgr), | 						PkgFormat_: build.GetPkgFormat(deps.Manager), | ||||||
| 					}, | 					}, | ||||||
| 					updates, | 					updates, | ||||||
| 				) | 				) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user