From 525691a22588a3c09349d41f6cb58aa6ec49fb00 Mon Sep 17 00:00:00 2001 From: Silke Hofstra Date: Wed, 20 Sep 2023 13:54:07 +0200 Subject: [PATCH] Replace waterlog by slog Replace waterlog by `log/slog` now that it's in the standard library. The output should be similar when using a TTY but log friendly when not. --- builder/build.go | 61 +++++++++++++++++----------------- builder/chroot.go | 9 +++--- builder/copy.go | 6 ++-- builder/eopkg.go | 12 +++---- builder/index.go | 16 ++++----- builder/manager.go | 32 +++++++++--------- builder/namespaces.go | 7 ++-- builder/overlay.go | 35 +++++++++++--------- builder/repos.go | 12 +++---- builder/source/git.go | 12 +++---- builder/source/simple.go | 6 ++-- builder/update.go | 22 ++++++------- builder/userinfo.go | 30 ++++++++--------- builder/util.go | 21 ++++++------ cli/build.go | 33 +++++++++---------- cli/chroot.go | 19 ++++++----- cli/delete_cache.go | 29 ++++++++--------- cli/index.go | 15 ++++----- cli/init.go | 39 ++++++++++++---------- cli/log/log.go | 70 ++++++++++++++++++++++++++++++++++++++++ cli/update.go | 15 ++++----- go.mod | 9 +++--- go.sum | 6 ++-- main.go | 20 ++++++------ 24 files changed, 307 insertions(+), 229 deletions(-) create mode 100644 cli/log/log.go diff --git a/builder/build.go b/builder/build.go index 46d1c64..d1fc59b 100644 --- a/builder/build.go +++ b/builder/build.go @@ -19,10 +19,10 @@ package builder import ( "errors" "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" ) @@ -106,17 +106,17 @@ func (p *Package) BindSources(o *Overlay) error { } // Find the target path in the chroot - log.Debugf("Exposing source to container %s\n", bindConfig.BindTarget) + slog.Debug("Exposing source to container", "target", bindConfig.BindTarget) if st, err := os.Stat(bindConfig.BindSource); err == nil && st != nil { if st.IsDir() { if err := os.MkdirAll(bindConfig.BindTarget, 0o0755); err != nil { - log.Errorf("Failed to create bind mount target %s, reason: %s\n", bindConfig.BindTarget, err) + slog.Error("Failed to create bind mount", "target", bindConfig.BindTarget, "reason", err) return nil } } else { if err := TouchFile(bindConfig.BindTarget); err != nil { - log.Errorf("Failed to create bind mount target %s, reason: %s\n", bindConfig.BindTarget, err) + slog.Error("Failed to create bind mount target", "target", bindConfig.BindTarget, "reason", err) return nil } } @@ -146,7 +146,7 @@ func (p *Package) BindCcache(o *Overlay) error { ccacheSource = CcacheDirectory } - log.Debugf("Exposing ccache to build %s\n", ccacheDir) + slog.Debug("Exposing ccache to build", "dir", ccacheDir) // Bind mount local ccache into chroot if err := mountMan.BindMount(ccacheSource, ccacheDir); err != nil { @@ -170,7 +170,7 @@ func (p *Package) BindSccache(o *Overlay) error { sccacheSource = SccacheDirectory } - log.Debugf("Exposing sccache to build %s\n", sccacheDir) + slog.Debug("Exposing sccache to build", "dir", sccacheDir) // Bind mount local sccache into chroot if err := mountMan.BindMount(sccacheSource, sccacheDir); err != nil { @@ -290,7 +290,7 @@ func (p *Package) CopyAssets(h *PackageHistory, o *Overlay) error { // PrepYpkg will do the initial leg work of preparing us for a ypkg build. func (p *Package) PrepYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager, overlay *Overlay, h *PackageHistory) error { - log.Debugln("Writing packager file") + slog.Debug("Writing packager file") fp := filepath.Join(overlay.MountPoint, BuildUserHome, ".config", "solus", "packager") fpd := filepath.Dir(fp) @@ -314,7 +314,7 @@ func (p *Package) PrepYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager, } // Install build dependencies - log.Debugf("Installing build dependencies %s\n", ymlFile) + slog.Debug("Installing build dependencies", "file", ymlFile) if err := ChrootExec(notif, overlay.MountPoint, cmd); err != nil { return fmt.Errorf("Failed to install build dependencies %s, reason: %w\n", ymlFile, err) @@ -323,7 +323,7 @@ func (p *Package) PrepYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager, notif.SetActivePID(0) // Cleanup now - log.Debugln("Stopping D-BUS") + slog.Debug("Stopping D-BUS") if err := pman.StopDBUS(); err != nil { return fmt.Errorf("Failed to stop d-bus, reason: %w\n", err) @@ -358,7 +358,7 @@ func (p *Package) BuildYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager return err } } else { - log.Warnln("Package has explicitly requested networking, sandboxing disabled") + slog.Warn("Package has explicitly requested networking, sandboxing disabled") } // Bring up sources @@ -399,7 +399,7 @@ func (p *Package) BuildYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager cmd += fmt.Sprintf(" -t %v", h.GetLastVersionTimestamp()) } - log.Infoln("Now starting build of package") + slog.Info("Now starting build of package") if err := ChrootExec(notif, overlay.MountPoint, cmd); err != nil { return fmt.Errorf("Failed to start build of package, reason: %w\n", err) @@ -407,10 +407,10 @@ func (p *Package) BuildYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager // Generate ABI Report if !DisableABIReport { - log.Debugln("Attempting to generate ABI report") + slog.Debug("Attempting to generate ABI report") if err := p.GenerateABIReport(notif, overlay); err != nil { - log.Warnf("Failed to generate ABI report, reason: %s\n", err) + slog.Warn("Failed to generate ABI report", "reason", err) return nil } } @@ -424,7 +424,7 @@ func (p *Package) BuildYpkg(notif PidNotifier, usr *UserInfo, pman *EopkgManager // by Build(). func (p *Package) BuildXML(notif PidNotifier, pman *EopkgManager, overlay *Overlay) error { // Just straight up build it with eopkg - log.Warnln("Full sandboxing is not possible with legacy format") + slog.Warn("Full sandboxing is not possible with legacy format") wdir := p.GetWorkDirInternal() xmlFile := filepath.Join(wdir, filepath.Base(p.Path)) @@ -450,10 +450,10 @@ func (p *Package) BuildXML(notif PidNotifier, pman *EopkgManager, overlay *Overl } // Now build the package, ignore-sandbox in case someone is stupid - // and activates it in eopkg.conf.. + // and activates it in eopkg.conf... cmd := eopkgCommand(fmt.Sprintf("eopkg build --ignore-sandbox --yes-all -O %s %s", wdir, xmlFile)) - log.Infof("Now starting build of package %s\n", p.Name) + slog.Info(fmt.Sprintf("Now starting build of package %s\n", p.Name)) if err := ChrootExec(notif, overlay.MountPoint, cmd); err != nil { return fmt.Errorf("Failed to start build of package.\n") @@ -461,8 +461,8 @@ func (p *Package) BuildXML(notif PidNotifier, pman *EopkgManager, overlay *Overl notif.SetActivePID(0) - // Now we can stop dbus.. - log.Debugln("Stopping D-BUS") + // Now we can stop dbus... + slog.Debug("Stopping D-BUS") if err := pman.StopDBUS(); err != nil { return fmt.Errorf("Failed to stop d-bus, reason: %w\n", err) @@ -479,7 +479,7 @@ func (p *Package) GenerateABIReport(notif PidNotifier, overlay *Overlay) error { cmd := fmt.Sprintf("cd %s; abi-wizard %s/YPKG/root/%s/install", wdir, BuildUserHome, p.Name) if err := ChrootExec(notif, overlay.MountPoint, cmd); err != nil { - log.Warnf("Failed to generate abi report %s\n", err) + slog.Warn("Failed to generate abi report", "reason", err) return nil } @@ -496,8 +496,8 @@ func (p *Package) CollectAssets(overlay *Overlay, usr *UserInfo, manifestTarget collections, _ := filepath.Glob(filepath.Join(collectionDir, "*.eopkg")) if len(collections) < 1 { - log.Errorln("Mysterious lack of eopkg files is mysterious") - return errors.New("Internal error: .eopkg files are missing") + slog.Error("Mysterious lack of eopkg files is mysterious") + return errors.New("internal error: .eopkg files are missing") } // Prior to blitting the files out, let's grab the manifest if requested @@ -532,7 +532,7 @@ func (p *Package) CollectAssets(overlay *Overlay, usr *UserInfo, manifestTarget collections = append(collections, pspecs...) } - log.Debugf("Collecting files %d\n", len(collections)) + slog.Debug("Collecting files", "len", len(collections)) for _, p := range collections { tgt, err := filepath.Abs(filepath.Join(".", filepath.Base(p))) @@ -540,16 +540,16 @@ func (p *Package) CollectAssets(overlay *Overlay, usr *UserInfo, manifestTarget return fmt.Errorf("Unable to find working directory, reason: %w\n", err) } - log.Debugf("Collecting build artifact %s\n", filepath.Base(p)) + slog.Debug("Collecting build artifact", "path", filepath.Base(p)) if err = disk.CopyFile(p, tgt); err != nil { return fmt.Errorf("Unable to collect build file, reason: %w\n", err) } - log.Debugf("Setting file ownership for current user UID='%d' GID='%d' %s\n", usr.UID, usr.GID, filepath.Base(p)) + slog.Debug("Setting file ownership for current user", "uid", usr.UID, "gid", usr.GID, "path", filepath.Base(p)) if err = os.Chown(tgt, usr.UID, usr.GID); err != nil { - log.Errorf("Error in restoring file ownership %s, reason: %s\n", filepath.Base(p), err) + slog.Error("Error in restoring file ownership", "path", filepath.Base(p), "reason", err) } } @@ -558,7 +558,8 @@ func (p *Package) CollectAssets(overlay *Overlay, usr *UserInfo, manifestTarget // Build will attempt to build the package in the overlayfs system. func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Profile, pman *EopkgManager, overlay *Overlay, manifestTarget string) error { - log.Debugf("Building package %s %s %d %s %s\n", p.Name, p.Version, p.Release, p.Type, overlay.Back.Name) + slog.Debug("Building package", "name", p.Name, "version", p.Version, "release", p.Release, "type", p.Type, + "profile", overlay.Back.Name) usr := GetUserInfo() @@ -586,7 +587,7 @@ func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Pro return fmt.Errorf("Failed to copy required source assets, reason: %w\n", err) } - log.Debugln("Validating sources") + slog.Debug("Validating sources") if err := p.FetchSources(overlay); err != nil { return err @@ -598,7 +599,7 @@ func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Pro } // Bring up dbus to do Things - log.Debugln("Starting D-BUS") + slog.Debug("Starting D-BUS") if err := pman.StartDBUS(); err != nil { return fmt.Errorf("Failed to start d-bus, reason: %w\n", err) @@ -609,13 +610,13 @@ func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Pro return fmt.Errorf("Configuring repositories failed, reason: %w\n", err) } - log.Debugln("Upgrading system base") + slog.Debug("Upgrading system base") if err := pman.Upgrade(); err != nil { return fmt.Errorf("Failed to upgrade rootfs, reason: %w\n", err) } - log.Debugln("Asserting system.devel component installation") + slog.Debug("Asserting system.devel component installation") if err := pman.InstallComponent("system.devel"); err != nil { return fmt.Errorf("Failed to assert system.devel, reason: %w\n", err) diff --git a/builder/chroot.go b/builder/chroot.go index b7f12db..b22fe7d 100644 --- a/builder/chroot.go +++ b/builder/chroot.go @@ -18,15 +18,16 @@ package builder import ( "fmt" + "log/slog" "os" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/commands" ) // Chroot will attempt to spawn a chroot in the overlayfs system. func (p *Package) Chroot(notif PidNotifier, pman *EopkgManager, overlay *Overlay) error { - log.Debugf("Beginning chroot: profile='%s' version='%s' package='%s' type='%s' release='%d'\n", overlay.Back.Name, p.Version, p.Name, p.Type, p.Release) + slog.Debug("Beginning chroot", "profile", overlay.Back.Name, "version", p.Version, + "package", p.Name, "type", p.Type, "release", p.Release) var env []string if p.Type == PackageTypeXML { @@ -53,11 +54,11 @@ func (p *Package) Chroot(notif PidNotifier, pman *EopkgManager, overlay *Overlay return err } } else { - log.Warnln("Package has explicitly requested networking, sandboxing disabled") + slog.Warn("Package has explicitly requested networking, sandboxing disabled") } } - log.Debugln("Spawning login shell") + slog.Debug("Spawning login shell") // Allow bash to work commands.SetStdin(os.Stdin) diff --git a/builder/copy.go b/builder/copy.go index ec6630e..ac5eb09 100644 --- a/builder/copy.go +++ b/builder/copy.go @@ -18,10 +18,10 @@ package builder import ( "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" ) @@ -56,7 +56,7 @@ func CopyAll(source, destdir string) error { } } else { if !PathExists(destdir) { - log.Debugf("Creating target directory: %s\n", destdir) + slog.Debug("Creating target directory", "dir", destdir) if err = os.MkdirAll(destdir, 0o0755); err != nil { return fmt.Errorf("Failed to create target directory: %s, reason: %w\n", destdir, err) @@ -64,7 +64,7 @@ func CopyAll(source, destdir string) error { } tgt := filepath.Join(destdir, filepath.Base(source)) - log.Debugf("Copying source asset %s to %s\n", source, tgt) + slog.Debug("Copying source", "source", source, "target", tgt) if err = disk.CopyFile(source, tgt); err != nil { return fmt.Errorf("Failed to copy source asset to target: source='%s' target='%s', reason: %w\n", source, tgt, err) diff --git a/builder/eopkg.go b/builder/eopkg.go index 5eabefb..8c4899d 100644 --- a/builder/eopkg.go +++ b/builder/eopkg.go @@ -19,11 +19,11 @@ package builder import ( "fmt" "io" + "log/slog" "os" "path/filepath" "strings" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/commands" "github.com/getsolus/libosdev/disk" ) @@ -86,14 +86,14 @@ func (e *EopkgManager) CopyAssets() error { dirName := filepath.Dir(value) if !PathExists(dirName) { - log.Debugf("Creating required directory: %s\n", dirName) + slog.Debug("Creating required directory", "path", dirName) if err := os.MkdirAll(dirName, 0o0755); err != nil { return fmt.Errorf("Failed to create required asset directory %s, reason %w\n", dirName, err) } } - log.Debugf("Copying host asset %s\n", key) + slog.Debug("Copying host asset", "key", key) if err := disk.CopyFile(key, value); err != nil { return fmt.Errorf("Failed to copy host asset %s, reason: %w\n", key, err) @@ -118,7 +118,7 @@ func (e *EopkgManager) Init() error { // Ensure system wide cache exists if !PathExists(e.cacheSource) { - log.Debugf("Creating system-wide package cache: %s\n", e.cacheSource) + slog.Debug("Creating system-wide package cache", "path", e.cacheSource) if err := os.MkdirAll(e.cacheSource, 0o0755); err != nil { return fmt.Errorf("Failed to create package cache %s, reason: %w\n", e.cacheSource, err) @@ -296,7 +296,7 @@ func (e *EopkgManager) GetRepos() ([]*EopkgRepo, error) { var repoFiles []string - log.Debugln("Discovering repos in rootfs") + slog.Debug("Discovering repos in rootfs") repoFiles, _ = filepath.Glob(globPat) // No repos @@ -309,7 +309,7 @@ func (e *EopkgManager) GetRepos() ([]*EopkgRepo, error) { for _, repo := range repoFiles { uri, err := readURIFile(repo) if err != nil { - log.Errorf("Unable to read repository file %s, reason: %s\n", repo, err) + slog.Error("Unable to read repository file", "path", repo, "err", err) return nil, err } diff --git a/builder/index.go b/builder/index.go index 428137b..6399fa5 100644 --- a/builder/index.go +++ b/builder/index.go @@ -19,10 +19,10 @@ package builder import ( "errors" "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" ) @@ -36,7 +36,7 @@ var ( // Index will attempt to index the given directory. func (p *Package) Index(notif PidNotifier, dir string, overlay *Overlay) error { - log.Debugf("Beginning indexer: profile='%s'\n", overlay.Back.Name) + slog.Debug("Beginning indexer", "profile", overlay.Back.Name) mman := disk.GetMountManager() @@ -44,7 +44,7 @@ func (p *Package) Index(notif PidNotifier, dir string, overlay *Overlay) error { // Check the source exists first! if !PathExists(dir) { - log.Errorf("Directory does not exist dir='%s'\n", dir) + slog.Error("Directory does not exist", "dir", dir) return ErrCannotContinue } @@ -60,25 +60,25 @@ func (p *Package) Index(notif PidNotifier, dir string, overlay *Overlay) error { // Create the target target := filepath.Join(overlay.MountPoint, IndexBindTarget[1:]) if err := os.MkdirAll(target, 0o0755); err != nil { - log.Errorf("Cannot create bind target %s, reason: %s\n", target, err) + slog.Error("Cannot create bind target", "target", target, "err", err) return err } - log.Debugf("Bind mounting directory for indexing %s\n", dir) + slog.Debug("Bind mounting directory for indexing", "dir", dir) if err := mman.BindMount(dir, target); err != nil { - log.Errorf("Cannot bind mount directory %s, reason: %s\n", target, err) + slog.Error("Cannot bind mount directory", "target", target, "err", err) return err } // Ensure it gets cleaned up overlay.ExtraMounts = append(overlay.ExtraMounts, target) - log.Debugln("Now indexing") + slog.Debug("Now indexing") command := fmt.Sprintf("cd %s; %s", IndexBindTarget, eopkgCommand("eopkg index --skip-signing .")) if err := ChrootExec(notif, overlay.MountPoint, command); err != nil { - log.Errorf("Indexing failed: dir='%s', reason: %s\n", dir, err) + slog.Error("Indexing failed", "dir", dir, "err", err) return err } diff --git a/builder/manager.go b/builder/manager.go index 5a89e4a..fab9f9b 100644 --- a/builder/manager.go +++ b/builder/manager.go @@ -19,6 +19,7 @@ package builder import ( "errors" "fmt" + "log/slog" "os" "os/signal" "path/filepath" @@ -27,9 +28,10 @@ import ( "syscall" "time" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" "github.com/go-git/go-git/v5" + + "github.com/getsolus/solbuild/cli/log" ) var ( @@ -103,7 +105,7 @@ func NewManager() (*Manager, error) { if config, err := NewConfig(); err == nil { man.Config = config } else { - log.Errorf("Failed to load solbuild configuration %s\n", err) + slog.Error("Failed to load solbuild configuration %s\n", err) return nil, err } @@ -193,11 +195,11 @@ func (m *Manager) SetPackage(pkg *Package) error { if err == nil { if history, err := NewPackageHistory(repo, pkg.Path); err == nil { - log.Debugln("Obtained package history") + slog.Debug("Obtained package history") m.history = history } else { - log.Warnf("Failed to obtain package git history: %s\n", err) + slog.Warn("Failed to obtain package git history", "err", err) } } } @@ -235,10 +237,10 @@ func (m *Manager) Cleanup() { return } - log.Debugln("Acquiring global lock") + slog.Debug("Acquiring global lock") m.lock.Lock() defer m.lock.Unlock() - log.Debugln("Cleaning up") + slog.Debug("Cleaning up") if m.pkgManager != nil { // Potentially unnecessary but meh @@ -286,11 +288,11 @@ func (m *Manager) Cleanup() { // Finally clean out the lock files if m.lockfile != nil { if err := m.lockfile.Unlock(); err != nil { - log.Errorf("Failure in unlocking root %s\n", err) + slog.Error("Failure in unlocking root", "err", err) } if err := m.lockfile.Clean(); err != nil { - log.Errorf("Failure in cleaning lockfile %s\n", err) + slog.Error("Failure in cleaning lockfile", "err", err) } } } @@ -300,7 +302,7 @@ func (m *Manager) doLock(path, opType string) error { // Handle file locking lock, err := NewLockFile(path) if err != nil { - log.Errorf("Failed to lock root for %s %s %s\n", opType, path, err) + slog.Error("Failed to lock root", "op_type", opType, "path", path, "err", err) return err } @@ -308,9 +310,9 @@ func (m *Manager) doLock(path, opType string) error { if err = m.lockfile.Lock(); err != nil { if errors.Is(err, ErrOwnedLockFile) { - log.Errorf("Failed to lock root - another process (%s,%d) is using it, reason: %s\n", m.lockfile.GetOwnerProcess(), m.lockfile.GetOwnerPID(), err) + slog.Error("Failed to lock root - another process is using it", "process", m.lockfile.GetOwnerProcess(), "pid", m.lockfile.GetOwnerPID(), "err", err) } else { - log.Errorf("Failed to lock root pid='%d' %s\n", m.lockfile.GetOwnerPID(), err) + slog.Error("Failed to lock root", "pid", m.lockfile.GetOwnerPID(), "err", err) } return err @@ -328,10 +330,10 @@ func (m *Manager) SigIntCleanup() { go func() { <-ch - log.Warnln("CTRL+C interrupted, cleaning up") + slog.Warn("CTRL+C interrupted, cleaning up") m.SetCancelled() m.Cleanup() - log.Errorln("Exiting due to interruption") + slog.Error("Exiting due to interruption") os.Exit(1) }() } @@ -359,7 +361,7 @@ func (m *Manager) Build() error { m.overlay.TmpfsSize = m.Config.TmpfsSize if !ValidMemSize(m.overlay.TmpfsSize) && m.overlay.EnableTmpfs { - log.Panicf("Invalid memory size specified: %s\n", m.overlay.TmpfsSize) + log.Panic("Invalid memory size specified", "tmpfs_size", m.overlay.TmpfsSize) } if err := m.doLock(m.overlay.LockPath, "building"); err != nil { @@ -446,7 +448,7 @@ func (m *Manager) Index(dir string) error { m.overlay.TmpfsSize = m.Config.TmpfsSize if !ValidMemSize(m.overlay.TmpfsSize) && m.overlay.EnableTmpfs { - log.Panicf("Invalid memory size specified: %s\n", m.overlay.TmpfsSize) + log.Panic("Invalid memory size specified", "tmpfs_size", m.overlay.TmpfsSize) } if err := m.doLock(m.overlay.LockPath, "indexing"); err != nil { diff --git a/builder/namespaces.go b/builder/namespaces.go index f797b58..3ab209b 100644 --- a/builder/namespaces.go +++ b/builder/namespaces.go @@ -18,14 +18,13 @@ package builder import ( "fmt" + "log/slog" "syscall" - - log "github.com/DataDrake/waterlog" ) // ConfigureNamespace will unshare() context, entering a new namespace. func ConfigureNamespace() error { - log.Debugln("Configuring container namespace") + slog.Debug("Configuring container namespace") if err := syscall.Unshare(syscall.CLONE_NEWNS | syscall.CLONE_NEWIPC); err != nil { return fmt.Errorf("Failed to configure namespace, reason: %w\n", err) @@ -36,7 +35,7 @@ func ConfigureNamespace() error { // DropNetworking will unshare() the context networking capabilities. func DropNetworking() error { - log.Debugln("Dropping container networking") + slog.Debug("Dropping container networking") if err := syscall.Unshare(syscall.CLONE_NEWNET | syscall.CLONE_NEWUTS); err != nil { return fmt.Errorf("Failed to drop networking capabilities, reason: %w\n", err) diff --git a/builder/overlay.go b/builder/overlay.go index d9f555c..2509f60 100644 --- a/builder/overlay.go +++ b/builder/overlay.go @@ -18,12 +18,14 @@ package builder import ( "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/commands" "github.com/getsolus/libosdev/disk" + + "github.com/getsolus/solbuild/cli/log" ) // An Overlay is formed from a backing image & Package combination. @@ -94,7 +96,7 @@ func (o *Overlay) EnsureDirs() error { continue } - log.Debugf("Creating overlay storage directory: %s\n", p) + slog.Debug("Creating overlay storage directory", "path", p) if err := os.MkdirAll(p, 0o0755); err != nil { return fmt.Errorf("Failed to create overlay storage directory: dir='%s', reason: %w\n", p, err) @@ -111,7 +113,7 @@ func (o *Overlay) CleanExisting() error { return nil } - log.Debugf("Removing stale workspace: %s\n", o.BaseDir) + slog.Debug("Removing stale workspace", "path", o.BaseDir) if err := os.RemoveAll(o.BaseDir); err != nil { return fmt.Errorf("Failed to remove stale workspace: dir='%s', reason: %w\n", o.BaseDir, err) @@ -123,18 +125,18 @@ func (o *Overlay) CleanExisting() error { // Mount will set up the overlayfs structure with the lower/upper respected // properly. func (o *Overlay) Mount() error { - log.Debugln("Mounting overlayfs") + slog.Debug("Mounting overlayfs") mountMan := disk.GetMountManager() // Mount tmpfs as the root of all other mounts if requested if o.EnableTmpfs { if err := os.MkdirAll(o.BaseDir, 0o0755); err != nil { - log.Errorf("Failed to create tmpfs directory: dir='%s', reason: %s\n", o.BaseDir, err) + slog.Error("Failed to create tmpfs directory", "dir", o.BaseDir, "err", err) return nil } - log.Debugf("Mounting root tmpfs: point='%s' size='%s'\n", o.BaseDir, o.TmpfsSize) + slog.Debug("Mounting root tmpfs", "dir", o.BaseDir, "size", o.TmpfsSize) var tmpfsOptions []string if o.TmpfsSize != "" { @@ -156,7 +158,7 @@ func (o *Overlay) Mount() error { } // First up, mount the backing image - log.Debugf("Mounting backing image: point='%s'\n", o.Back.ImagePath) + slog.Debug("Mounting backing image", "point", o.Back.ImagePath) if err := mountMan.Mount(o.Back.ImagePath, o.ImgDir, "auto", "ro", "loop"); err != nil { return fmt.Errorf("Failed to mount backing image: point='%s', reason: %w\n", o.Back.ImagePath, err) @@ -165,7 +167,8 @@ func (o *Overlay) Mount() error { o.mountedImg = true // Now mount the overlayfs - log.Debugf("Mounting overlayfs: upper='%s' lower='%s' workdir='%s' target='%s'\n", o.UpperDir, o.ImgDir, o.WorkDir, o.MountPoint) + slog.Debug("Mounting overlayfs", "upper", o.UpperDir, "lower", o.ImgDir, + "workdir", o.WorkDir, "target", o.MountPoint) // Mounting overlayfs.. err := mountMan.Mount("overlay", o.MountPoint, "overlay", @@ -174,7 +177,7 @@ func (o *Overlay) Mount() error { fmt.Sprintf("workdir=%s", o.WorkDir)) // Check non-fatal.. if err != nil { - log.Fatalf("Failed to mount overlayfs: point='%s', reason: %s\n", o.MountPoint, err) + log.Panic("Failed to mount overlayfs", "point", o.MountPoint, "err", err) } o.mountedOverlay = true @@ -252,7 +255,7 @@ func (o *Overlay) MountVFS() error { continue } - log.Debugf("Creating VFS directory: dir='%s'\n", p) + slog.Debug("Creating VFS directory", "dir", p) if err := os.MkdirAll(p, 0o0755); err != nil { return fmt.Errorf("Failed to create VFS directory. dir='%s', reason: %w\n", p, err) @@ -260,7 +263,7 @@ func (o *Overlay) MountVFS() error { } // Bring up dev - log.Debugln("Mounting vfs /dev") + slog.Debug("Mounting vfs /dev") if err := mountMan.Mount("devtmpfs", vfsPoints[0], "devtmpfs", "nosuid", "mode=755"); err != nil { return fmt.Errorf("Failed to mount /dev, reason: %w\n", err) @@ -269,28 +272,28 @@ func (o *Overlay) MountVFS() error { o.mountedVFS = true // Bring up dev/pts - log.Debugln("Mounting vfs /dev/pts") + slog.Debug("Mounting vfs /dev/pts") if err := mountMan.Mount("devpts", vfsPoints[1], "devpts", "gid=5", "mode=620", "nosuid", "noexec"); err != nil { return fmt.Errorf("Failed to mount /dev/pts, reason: %w\n", err) } // Bring up proc - log.Debugln("Mounting vfs /proc") + slog.Debug("Mounting vfs /proc") if err := mountMan.Mount("proc", vfsPoints[2], "proc", "nosuid", "noexec"); err != nil { return fmt.Errorf("Failed to mount /proc, reason: %w\n", err) } // Bring up sys - log.Debugln("Mounting vfs /sys") + slog.Debug("Mounting vfs /sys") if err := mountMan.Mount("sysfs", vfsPoints[3], "sysfs"); err != nil { return fmt.Errorf("Failed to mount /sys, reason: %w\n", err) } // Bring up shm - log.Debugln("Mounting vfs /dev/shm") + slog.Debug("Mounting vfs /dev/shm") if err := mountMan.Mount("tmpfs-shm", vfsPoints[4], "tmpfs"); err != nil { return fmt.Errorf("Failed to mount /dev/shm, reason: %w\n", err) @@ -304,7 +307,7 @@ func (o *Overlay) MountVFS() error { func (o *Overlay) ConfigureNetworking() error { ipCommand := "/sbin/ip link set lo up" - log.Debugln("Configuring container networking") + slog.Debug("Configuring container networking") if err := commands.ChrootExec(o.MountPoint, ipCommand); err != nil { return fmt.Errorf("Failed to configure networking, reason: %w\n", err) diff --git a/builder/repos.go b/builder/repos.go index a081329..ff5ef3b 100644 --- a/builder/repos.go +++ b/builder/repos.go @@ -18,10 +18,10 @@ package builder import ( "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" ) @@ -56,7 +56,7 @@ func (p *Package) addLocalRepo(notif PidNotifier, o *Overlay, pkgManager *EopkgM // Attempt to autoindex the repo if repo.AutoIndex { - log.Debugf("Reindexing repository %s\n", repo.Name) + slog.Debug("Reindexing repository", "name", repo.Name) command := fmt.Sprintf("cd %s/%s; %s", BindRepoDir, repo.Name, eopkgCommand("eopkg index --skip-signing .")) err := ChrootExec(notif, o.MountPoint, command) @@ -68,7 +68,7 @@ func (p *Package) addLocalRepo(notif PidNotifier, o *Overlay, pkgManager *EopkgM } else { tgtIndex := filepath.Join(tgt, "eopkg-index.xml.xz") if !PathExists(tgtIndex) { - log.Warnf("Repository index doesn't exist. Please index it to use it. %s\n", repo.Name) + slog.Warn("Repository index doesn't exist. Please index it to use it.", "repo", repo.Name) } } @@ -84,7 +84,7 @@ func (p *Package) removeRepos(pkgManager *EopkgManager, repos []string) error { } for _, id := range repos { - log.Debugf("Removing repository %s\n", id) + slog.Debug("Removing repository", "repo", id) if err := pkgManager.RemoveRepo(id); err != nil { return fmt.Errorf("Failed to remove repository %s, reason: %w\n", id, err) @@ -102,7 +102,7 @@ func (p *Package) addRepos(notif PidNotifier, o *Overlay, pkgManager *EopkgManag for _, repo := range repos { if repo.Local { - log.Debugf("Adding local repo to system %s %s\n", repo.Name, repo.URI) + slog.Debug("Adding local repo to system", "name", repo.Name, "uri", repo.URI) if err := p.addLocalRepo(notif, o, pkgManager, repo); err != nil { return fmt.Errorf("Failed to add local repo to system %s, reason: %w\n", repo.Name, err) @@ -111,7 +111,7 @@ func (p *Package) addRepos(notif PidNotifier, o *Overlay, pkgManager *EopkgManag continue } - log.Debugf("Adding repo to system %s %s\n", repo.Name, repo.URI) + slog.Debug("Adding repo to system", "name", repo.Name, "uri", repo.URI) if err := pkgManager.AddRepo(repo.Name, repo.URI); err != nil { return fmt.Errorf("Failed to add repo to system %s, reason: %w\n", repo.Name, err) diff --git a/builder/source/git.go b/builder/source/git.go index 6583bd0..1b76b80 100644 --- a/builder/source/git.go +++ b/builder/source/git.go @@ -18,13 +18,13 @@ package source import ( "fmt" + "log/slog" "net/url" "os" "path/filepath" "strings" - log "github.com/DataDrake/waterlog" - git "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" ) @@ -117,7 +117,7 @@ func clone(uri, path, ref string) (*git.Repository, error) { func (g *GitSource) Fetch() error { // First things first, make sure we have a destination if !PathExists(g.ClonePath) { - log.Debugf("making shallow clone of repo at '%s'\n", g.ClonePath) + slog.Debug("making shallow clone of repo", "path", g.ClonePath) _, err := clone(g.URI, g.ClonePath, g.Ref) if err != nil { @@ -128,7 +128,7 @@ func (g *GitSource) Fetch() error { } // Repo already on disk, just open it - log.Debugf("source repo clone found on disk at '%s'\n", g.ClonePath) + slog.Debug("source repo clone found on disk", "path", g.ClonePath) repo, err := git.PlainOpen(g.ClonePath) if err != nil { @@ -139,7 +139,7 @@ func (g *GitSource) Fetch() error { var hash plumbing.Hash if len(g.Ref) != 40 { - log.Debugf("reference '%s' does not look like a hash; attempting to resolve\n", g.Ref) + slog.Debug("reference does not look like a hash; attempting to resolve", "ref", g.Ref) h, resolveErr := repo.ResolveRevision(plumbing.Revision(g.Ref)) if resolveErr != nil { @@ -151,7 +151,7 @@ func (g *GitSource) Fetch() error { hash = plumbing.NewHash(g.Ref) } - log.Debugf("resolved reference: %s\n", hash.String()) + slog.Debug("resolved reference", "ref", hash.String()) work, err := repo.Worktree() if err != nil { diff --git a/builder/source/simple.go b/builder/source/simple.go index cb67709..f26482c 100644 --- a/builder/source/simple.go +++ b/builder/source/simple.go @@ -20,12 +20,12 @@ import ( "crypto/sha1" "crypto/sha256" "encoding/hex" + "log/slog" "net/url" "os" "path/filepath" "time" - log "github.com/DataDrake/waterlog" "github.com/cavaliergopher/grab/v3" "github.com/cheggaaa/pb/v3" ) @@ -159,7 +159,7 @@ func (s *SimpleSource) download(destination string) error { pbar.SetCurrent(resp.BytesComplete()) if err := resp.Err(); err != nil { - log.Errorf("Error downloading %s: %v\n", s.URI, err) + slog.Error("Error downloading", "uri", s.URI, "err", err) return err } @@ -171,7 +171,7 @@ func (s *SimpleSource) download(destination string) error { // Fetch will download the given source and cache it locally. func (s *SimpleSource) Fetch() error { // Now go and download it - log.Debugf("Downloading source %s\n", s.URI) + slog.Debug("Downloading source", "uri", s.URI) destPath := filepath.Join(SourceStagingDir, s.File) diff --git a/builder/update.go b/builder/update.go index 8f4bc2b..11e9f10 100644 --- a/builder/update.go +++ b/builder/update.go @@ -18,41 +18,41 @@ package builder import ( "fmt" + "log/slog" "os" "path/filepath" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/disk" ) func (b *BackingImage) updatePackages(_ PidNotifier, pkgManager *EopkgManager) error { - log.Debugln("Initialising package manager") + slog.Debug("Initialising package manager") if err := pkgManager.Init(); err != nil { return fmt.Errorf("Failed to initialise package manager, reason: %w\n", err) } // Bring up dbus to do Things - log.Debugln("Starting D-BUS") + slog.Debug("Starting D-BUS") if err := pkgManager.StartDBUS(); err != nil { return fmt.Errorf("Failed to start d-bus, reason: %w\n", err) } - log.Debugln("Upgrading builder image") + slog.Debug("Upgrading builder image") if err := pkgManager.Upgrade(); err != nil { return fmt.Errorf("Failed to perform upgrade, reason: %w\n", err) } - log.Debugln("Asserting system.devel component") + slog.Debug("Asserting system.devel component") if err := pkgManager.InstallComponent("system.devel"); err != nil { return fmt.Errorf("Failed to install system.devel, reason: %w\n", err) } // Cleanup now - log.Debugln("Stopping D-BUS") + slog.Debug("Stopping D-BUS") if err := pkgManager.StopDBUS(); err != nil { return fmt.Errorf("Failed to stop d-bus, reason: %w\n", err) @@ -66,17 +66,17 @@ func (b *BackingImage) updatePackages(_ PidNotifier, pkgManager *EopkgManager) e func (b *BackingImage) Update(notif PidNotifier, pkgManager *EopkgManager) error { mountMan := disk.GetMountManager() - log.Debugf("Updating backing image %s\n", b.Name) + slog.Debug("Updating backing image", "name", b.Name) if !PathExists(b.RootDir) { if err := os.MkdirAll(b.RootDir, 0o0755); err != nil { return fmt.Errorf("Failed to create required directories, reason: %w\n", err) } - log.Debugf("Created root directory %s\n", b.Name) + slog.Debug("Created root directory", "name", b.Name) } - log.Debugf("Mounting rootfs %s %s\n", b.ImagePath, b.RootDir) + slog.Debug("Mounting rootfs", "image_path", b.ImagePath, "root_dir", b.RootDir) // Mount the rootfs if err := mountMan.Mount(b.ImagePath, b.RootDir, "auto", "loop"); err != nil { @@ -90,7 +90,7 @@ func (b *BackingImage) Update(notif PidNotifier, pkgManager *EopkgManager) error procPoint := filepath.Join(b.RootDir, "proc") // Bring up proc - log.Debugln("Mounting vfs /proc") + slog.Debug("Mounting vfs /proc") if err := mountMan.Mount("proc", procPoint, "proc", "nosuid", "noexec"); err != nil { return fmt.Errorf("Failed to mount /proc, reason: %w\n", err) @@ -106,7 +106,7 @@ func (b *BackingImage) Update(notif PidNotifier, pkgManager *EopkgManager) error return err } - log.Debugf("Image successfully updated %s\n", b.Name) + slog.Debug("Image successfully updated", "name", b.Name) return nil } diff --git a/builder/userinfo.go b/builder/userinfo.go index c0c45b6..4b5502f 100644 --- a/builder/userinfo.go +++ b/builder/userinfo.go @@ -18,12 +18,12 @@ package builder import ( "fmt" + "log/slog" "os" "os/user" "path/filepath" "strconv" - log "github.com/DataDrake/waterlog" "gopkg.in/ini.v1" ) @@ -64,12 +64,12 @@ func (u *UserInfo) SetFromSudo() bool { } if uid, err = strconv.Atoi(sudoUID); err != nil { - log.Errorf("Malformed SUDO_UID in environment %s %s\n", sudoUID, err) + slog.Error("Malformed SUDO_UID in environment", "sudu_uid", sudoUID, "err", err) return false } if gid, err = strconv.Atoi(sudoGID); err != nil { - log.Errorf("Malformed SUDO_GID in environment %s %s\n", sudoGID, err) + slog.Error("Malformed SUDO_GID in environment", "sudu_gid", sudoGID, "err", err) return false } @@ -79,7 +79,7 @@ func (u *UserInfo) SetFromSudo() bool { // Try to set the home directory usr, err := user.LookupId(sudoUID) if err != nil { - log.Errorf("Failed to lookup SUDO_USER entry %d %s\n", uid, err) + slog.Error("Failed to lookup SUDO_USER entry", "uid", uid, "err", err) return false } @@ -102,7 +102,7 @@ func (u *UserInfo) SetFromCurrent() { u.Username = usr.Username u.Name = usr.Name } else { - log.Errorf("Failed to lookup current user %d %s\n", u.UID, err) + slog.Error("Failed to lookup current user", "uid", u.UID, "err", err) u.Username = os.Getenv("USERNAME") u.Name = u.Username u.HomeDir = filepath.Join("/home", u.Username) @@ -125,32 +125,32 @@ func (u *UserInfo) SetFromPackager() bool { cfg, err := ini.Load(p) if err != nil { - log.Errorf("Error loading INI file %s %s\n", p, err) + slog.Error("Error loading INI file", "path", p, "err", err) continue } section, err := cfg.GetSection("Packager") if err != nil { - log.Errorf("Missing [Packager] section in file %s\n", p) + slog.Error("Missing [Packager] section in file", "path", p) continue } uname, err := section.GetKey("Name") if err != nil { - log.Errorf("Packager file has missing Name %s %s\n", p, err) + slog.Error("Packager file has missing Name", "path", p, "err", err) continue } email, err := section.GetKey("Email") if err != nil { - log.Errorf("Packager file has missing Email %s %s\n", p, err) + slog.Error("Packager file has missing Email", "path", p, "err", err) continue } u.Name = uname.String() u.Email = email.String() - log.Debugln("Setting packager details from packager INI file") + slog.Debug("Setting packager details from packager INI file") return true } @@ -167,32 +167,32 @@ func (u *UserInfo) SetFromGit() bool { cfg, err := ini.Load(gitConfPath) if err != nil { - log.Errorf("Error loading gitconfig %s %s\n", gitConfPath, err) + slog.Error("Error loading gitconfig", "path", gitConfPath, "err", err) return false } section, err := cfg.GetSection("user") if err != nil { - log.Errorf("Missing [user] section in gitconfig %s\n", gitConfPath) + slog.Error("Missing [user] section in gitconfig", "path", gitConfPath, "err", err) return false } uname, err := section.GetKey("name") if err != nil { - log.Errorf("gitconfig file has missing name %s %s\n", gitConfPath, err) + slog.Error("gitconfig file has missing name", "path", gitConfPath, "err", err) return false } email, err := section.GetKey("email") if err != nil { - log.Errorf("gitconfig file has missing email %s %s\n", gitConfPath, err) + slog.Error("gitconfig file has missing email", "path", gitConfPath, "err", err) return false } u.Name = uname.String() u.Email = email.String() - log.Debugln("Setting packager details from git config") + slog.Debug("Setting packager details from git config") return true } diff --git a/builder/util.go b/builder/util.go index f7026c3..4a66bbf 100644 --- a/builder/util.go +++ b/builder/util.go @@ -20,6 +20,7 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "log/slog" "os" "os/exec" "path/filepath" @@ -28,7 +29,6 @@ import ( "syscall" "time" - log "github.com/DataDrake/waterlog" "github.com/getsolus/libosdev/commands" "github.com/getsolus/libosdev/disk" ) @@ -48,7 +48,7 @@ type PidNotifier interface { // ActivateRoot will do the hard work of actually bring up the overlayfs // system to allow manipulation of the roots for builds, etc. func (p *Package) ActivateRoot(overlay *Overlay) error { - log.Debugln("Configuring overlay storage") + slog.Debug("Configuring overlay storage") // Now mount the overlayfs if err := overlay.Mount(); err != nil { @@ -62,7 +62,7 @@ func (p *Package) ActivateRoot(overlay *Overlay) error { } } - log.Debugln("Bringing up virtual filesystems") + slog.Debug("Bringing up virtual filesystems") return overlay.MountVFS() } @@ -75,7 +75,7 @@ func (p *Package) DeactivateRoot(overlay *Overlay) { commands.SetStdin(nil) overlay.Unmount() - log.Debugln("Requesting unmount of all remaining mountpoints") + slog.Debug("Requesting unmount of all remaining mountpoints") mountMan.UnmountAll() } @@ -113,14 +113,14 @@ func MurderDeathKill(root string) error { return fmt.Errorf("POSIX Weeps - broken pid identifier %s, reason: %w\n", spid, err) } - log.Debugf("Killing child process in chroot %d\n", pid) + slog.Debug("Killing child process in chroot", "pid", pid) if err := syscall.Kill(pid, syscall.SIGTERM); err != nil { - log.Errorf("Error terminating process, attempting force kill %d\n", pid) + slog.Error("Error terminating process, attempting force kill", "pid", pid) time.Sleep(400 * time.Millisecond) if err := syscall.Kill(pid, syscall.SIGKILL); err != nil { - log.Errorf("Error killing (-9) process %d\n", pid) + slog.Error("Error killing (-9) process", "pid", pid) } } } @@ -238,7 +238,8 @@ func AddBuildUser(rootfs string) error { return nil } - log.Debugf("Adding build user to system: user='%s' uid='%d' gid='%d' home='%s' shell='%s' gecos='%s'\n", BuildUser, BuildUserID, BuildUserGID, BuildUserHome, BuildUserShell, BuildUserGecos) + slog.Debug("Adding build user to system", "user", BuildUser, "uid", BuildUserID, "gid", BuildUserGID, + "home", BuildUserHome, "shell", BuildUserShell, "gecos", BuildUserGecos) // Add the build group if err := commands.AddGroup(rootfs, BuildUser, BuildUserGID); err != nil { @@ -280,7 +281,7 @@ func ValidMemSize(s string) bool { _, err := strconv.ParseFloat(allButLast, 64) if err != nil { - log.Errorf("Invalid Memory Size: %s: %s is not numeric\n", s, allButLast) + slog.Error(fmt.Sprintf("Invalid Memory Size: %s: %s is not numeric\n", s, allButLast)) return false } @@ -294,7 +295,7 @@ func ValidMemSize(s string) bool { } } - log.Errorf("Invalid Memory Size: %s doesn't end in a valid memory unit, e.g. G\n", s) + slog.Error(fmt.Sprintf("Invalid Memory Size: %s doesn't end in a valid memory unit, e.g. G\n", s)) return false } diff --git a/cli/build.go b/cli/build.go index 2b6ed4f..64bc4af 100644 --- a/cli/build.go +++ b/cli/build.go @@ -19,16 +19,15 @@ package cli import ( "errors" "fmt" + "log/slog" "os" "strings" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" login "github.com/coreos/go-systemd/v22/login1" "github.com/getsolus/solbuild/builder" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -66,17 +65,17 @@ func BuildRun(r *cmd.Root, s *cmd.Sub) { sArgs := s.Args.(*BuildArgs) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() builder.DisableColors = true } if sFlags.ABIReport { - log.Debugln("Not attempting generation of an ABI report") + slog.Debug("Not attempting generation of an ABI report") builder.DisableABIReport = true } @@ -90,25 +89,25 @@ func BuildRun(r *cmd.Root, s *cmd.Sub) { } if len(pkgPath) == 0 { - log.Fatalln("No package.yml or pspec.xml file in current directory and no file provided.") + log.Panic("No package.yml or pspec.xml file in current directory and no file provided.") } if os.Geteuid() != 0 { - log.Fatalln("You must be root to run build packages") + log.Panic("You must be root to run build packages") } // Initialise the build manager manager, err := builder.NewManager() if err != nil { os.Exit(1) } - // Safety first.. + // Safety first... if err = manager.SetProfile(rFlags.Profile); err != nil { os.Exit(1) } pkg, err := builder.NewPackage(pkgPath) if err != nil { - log.Fatalf("Failed to load package: %s\n", err) + log.Panic("Failed to load package", "err", err) } manager.SetManifestTarget(sFlags.TransitManifest) @@ -129,13 +128,13 @@ func BuildRun(r *cmd.Root, s *cmd.Sub) { case sFlags.Memory == "" && manager.Config.TmpfsSize != "": manager.SetTmpfs(sFlags.Tmpfs, manager.Config.TmpfsSize) default: - log.Fatalln("tmpfs: No memory size specified") + log.Panic("tmpfs: No memory size specified") } } if sFlags.Memory != "" && !sFlags.Tmpfs { if !manager.Config.EnableTmpfs { - log.Fatalln("tmpfs: Memory size specified but tmpfs was not enabled, pass -t to enable tmpfs") + slog.Error("tmpfs: Memory size specified but tmpfs was not enabled, pass -t to enable tmpfs") } else { manager.SetTmpfs(manager.Config.EnableTmpfs, sFlags.Memory) } @@ -144,11 +143,11 @@ func BuildRun(r *cmd.Root, s *cmd.Sub) { // Set a inhibitor lock to prevent system from accidentally going down conn, err := login.New() if err != nil { - log.Errorln("org.freedesktop.login1: Failed to initialize dbus connection") + slog.Error("org.freedesktop.login1: Failed to initialize dbus connection") } if !conn.Connected() { - log.Errorln("org.freedesktop.login1: Not connected to dbus system bus") + slog.Error("org.freedesktop.login1: Not connected to dbus system bus") } inhibitMsg := fmt.Sprintf("Build in Progress: %s-%s-%d. Please wait for the build to complete", @@ -156,14 +155,14 @@ func BuildRun(r *cmd.Root, s *cmd.Sub) { fd, err := conn.Inhibit("shutdown:idle:sleep", "solbuild", inhibitMsg, "block") if err != nil { - log.Errorln("org.freedesktop.login1: Failed to send inhibitor lock") + slog.Error("org.freedesktop.login1: Failed to send inhibitor lock") } // defer release the inhibitor lock defer fd.Close() if err := manager.Build(); err != nil { - log.Panicf("Failed to build packages: %s\n", err) + log.Panic("Failed to build packages", "err", err) } - log.Infoln("Building succeeded") + slog.Info("Building succeeded") } diff --git a/cli/chroot.go b/cli/chroot.go index 4434d09..a32e779 100644 --- a/cli/chroot.go +++ b/cli/chroot.go @@ -19,15 +19,14 @@ package cli import ( "errors" "fmt" + "log/slog" "os" "strings" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" "github.com/getsolus/solbuild/builder" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -53,11 +52,11 @@ func ChrootRun(r *cmd.Root, s *cmd.Sub) { sArgs := s.Args.(*ChrootArgs) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() builder.DisableColors = true } @@ -71,11 +70,11 @@ func ChrootRun(r *cmd.Root, s *cmd.Sub) { } if len(pkgPath) == 0 { - log.Fatalln("No package.yml or pspec.xml found in current directory and no file provided.") + log.Panic("No package.yml or pspec.xml found in current directory and no file provided.") } if os.Geteuid() != 0 { - log.Fatalln("You must be root to use chroot") + log.Panic("You must be root to use chroot") } // Initialise the build manager @@ -90,7 +89,7 @@ func ChrootRun(r *cmd.Root, s *cmd.Sub) { pkg, err := builder.NewPackage(pkgPath) if err != nil { - log.Fatalf("Failed to load package: %s\n", err) + log.Panic("Failed to load package: %s\n", err) } // Set the package if err := manager.SetPackage(pkg); err != nil { @@ -102,8 +101,8 @@ func ChrootRun(r *cmd.Root, s *cmd.Sub) { } if err := manager.Chroot(); err != nil { - log.Fatalln("Chroot failure") + log.Panic("Chroot failure") } - log.Infoln("Chroot complete") + slog.Info("Chroot complete") } diff --git a/cli/delete_cache.go b/cli/delete_cache.go index aa81608..b085c91 100644 --- a/cli/delete_cache.go +++ b/cli/delete_cache.go @@ -18,17 +18,16 @@ package cli import ( "fmt" + "log/slog" "math" "os" "path/filepath" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" "github.com/getsolus/solbuild/builder" "github.com/getsolus/solbuild/builder/source" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -57,20 +56,20 @@ func DeleteCacheRun(r *cmd.Root, s *cmd.Sub) { sFlags := s.Flags.(*DeleteCacheFlags) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() } if os.Geteuid() != 0 { - log.Fatalln("You must be root to delete caches") + log.Panic("You must be root to delete caches") } manager, err := builder.NewManager() if err != nil { - log.Fatalf("Failed to create new Manager: %e\n", err) + log.Panic("Failed to create new Manager: %e\n", err) } // If sizes is requested just print disk usage of caches and return @@ -92,13 +91,13 @@ func DeleteCacheRun(r *cmd.Root, s *cmd.Sub) { totalSize += size if err != nil { - log.Warnf("Couldn't get directory size, reason: %s\n", err) + slog.Warn("Couldn't get directory size", "reason", err) } - log.Infof("Size of '%s' is '%s'\n", p, humanReadableFormat(float64(size))) + slog.Info(fmt.Sprintf("Size of '%s' is '%s'", p, humanReadableFormat(float64(size)))) } - log.Infof("Total size: '%s'\n", humanReadableFormat(float64(totalSize))) + slog.Info(fmt.Sprintf("Total size: '%s'", humanReadableFormat(float64(totalSize)))) return } @@ -133,18 +132,18 @@ func DeleteCacheRun(r *cmd.Root, s *cmd.Sub) { totalSize += size if err != nil { - log.Warnf("Couldn't get directory size, reason: %s\n", err) + slog.Warn("Couldn't get directory size", "reason", err) } - log.Infof("Removing cache directory '%s', of size '%s\n", p, humanReadableFormat(float64(size))) + slog.Info(fmt.Sprintf("Removing cache directory '%s', of size '%s", p, humanReadableFormat(float64(size)))) if err := os.RemoveAll(p); err != nil { - log.Fatalf("Could not remove cache directory, reason: %s\n", err) + log.Panic("Could not remove cache directory", "reason", err) } } if totalSize > 0 { - log.Infof("Total restored size: '%s'\n", humanReadableFormat(float64(totalSize))) + slog.Info(fmt.Sprintf("Total restored size: '%s'\n", humanReadableFormat(float64(totalSize)))) } } @@ -155,7 +154,7 @@ func getDirSize(path string) (int64, error) { // Return nothing if dir doesn't exist _, err := os.Stat(path) if os.IsNotExist(err) { - log.Debugf("Directory doesn't exist: %s\n", path) + slog.Debug("Directory doesn't exist", "path", path) return 0, nil } diff --git a/cli/index.go b/cli/index.go index 2065fae..cb863e0 100644 --- a/cli/index.go +++ b/cli/index.go @@ -19,14 +19,13 @@ package cli import ( "errors" "fmt" + "log/slog" "os" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" "github.com/getsolus/solbuild/builder" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -60,15 +59,15 @@ func IndexRun(r *cmd.Root, s *cmd.Sub) { args := s.Args.(*IndexArgs) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() } if os.Geteuid() != 0 { - log.Fatalln("You must be root to use index") + log.Panic("You must be root to use index") } // Initialise the build manager manager, err := builder.NewManager() @@ -91,8 +90,8 @@ func IndexRun(r *cmd.Root, s *cmd.Sub) { manager.SetTmpfs(sFlags.Tmpfs, sFlags.Memory) if err := manager.Index(args.Dir); err != nil { - log.Fatalln("Index failure") + log.Panic("Index failure") } - log.Infoln("Indexing complete") + slog.Info("Indexing complete") } diff --git a/cli/init.go b/cli/init.go index dae81ed..68edd50 100644 --- a/cli/init.go +++ b/cli/init.go @@ -20,17 +20,16 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" "os" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" "github.com/cheggaaa/pb/v3" "github.com/getsolus/libosdev/commands" "github.com/getsolus/solbuild/builder" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -57,24 +56,27 @@ func InitRun(r *cmd.Root, s *cmd.Sub) { sFlags := s.Flags.(*InitFlags) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() } if os.Geteuid() != 0 { - log.Fatalln("You must be root to run init profiles") + slog.Error("You must be root to run init profiles") + os.Exit(1) } // Now we'll update the newly initialised image manager, err := builder.NewManager() if err != nil { - log.Fatalln(err.Error()) + slog.Error(err.Error()) + panic(err) } - // Safety first.. + // Safety first... if err = manager.SetProfile(rFlags.Profile); err != nil { - log.Fatalln(err.Error()) + slog.Error(err.Error()) + panic(err) } doInit(manager) @@ -89,7 +91,7 @@ func doInit(manager *builder.Manager) { bk := builder.NewBackingImage(prof.Image) if bk.IsInstalled() { - log.Warnf("'%s' has already been initialised\n", prof.Name) + slog.Warn("Image has already been initialised", "name", prof.Name) return } @@ -97,25 +99,28 @@ func doInit(manager *builder.Manager) { // Ensure directories exist if !builder.PathExists(imgDir) { if err := os.MkdirAll(imgDir, 0o0755); err != nil { - log.Fatalf("Failed to create images directory '%s', reason: %s", imgDir, err) + slog.Error("Failed to create images directory", "path", imgDir, "err", err) + panic(err) } - log.Debugf("Created images directory '%s'\n", imgDir) + slog.Debug("Created images directory", "path", imgDir) } // Now ensure we actually have said image if !bk.IsFetched() { if err := downloadImage(bk); err != nil { - log.Fatalln(err.Error()) + slog.Error("Failed to download image", "err", err) + panic(err) } } // Decompress the image - log.Debugf("Decompressing backing image, source: '%s' target: '%s'\n", bk.ImagePathXZ, bk.ImagePath) + slog.Debug("Decompressing backing image", "source", bk.ImagePathXZ, "target", bk.ImagePath) if err := commands.ExecStdoutArgsDir(builder.ImagesDir, "unxz", []string{bk.ImagePathXZ}); err != nil { - log.Fatalf("Failed to decompress image '%s', reason: %s\n", bk.ImagePathXZ, err) + slog.Error("Failed to decompress image", "source", bk.ImagePathXZ, "err", err) + panic(err) } - log.Infoln("Profile successfully initialised") + slog.Info("Profile successfully initialised") } // Downloads an image using net/http. @@ -169,6 +174,6 @@ func downloadImage(bk *builder.BackingImage) (err error) { // doUpdate will perform an update to the image after the initial init stage. func doUpdate(manager *builder.Manager) { if err := manager.Update(); err != nil { - log.Fatalf("Update failed, reason: '%s'\n", err) + slog.Error("Update failed", "reason", err) } } diff --git a/cli/log/log.go b/cli/log/log.go new file mode 100644 index 0000000..955e64b --- /dev/null +++ b/cli/log/log.go @@ -0,0 +1,70 @@ +package log + +import ( + "log/slog" + "os" + + "gitlab.com/slxh/go/powerline" +) + +// Level contains the application log level. +var Level slog.LevelVar + +var colors = map[slog.Level]powerline.ColorScheme{ + slog.LevelDebug: { + Time: powerline.NewColor(99, powerline.ColorBlack), + Level: powerline.NewColor(powerline.ColorBlack, 99), + Message: powerline.NewColor(99, powerline.ColorDefault), + }, + slog.LevelInfo: { + Time: powerline.NewColor(45, powerline.ColorBlack), + Level: powerline.NewColor(powerline.ColorBlack, 45), + Message: powerline.NewColor(45, powerline.ColorDefault), + }, + slog.LevelWarn: { + Time: powerline.NewColor(220, powerline.ColorBlack), + Level: powerline.NewColor(powerline.ColorBlack, 220), + Message: powerline.NewColor(220, powerline.ColorDefault), + }, + slog.LevelError: { + Time: powerline.NewColor(208, powerline.ColorBlack), + Level: powerline.NewColor(powerline.ColorBlack, 208), + Message: powerline.NewColor(208, powerline.ColorDefault), + }, +} + +func setLogger(h slog.Handler) { + slog.SetDefault(slog.New(h)) +} + +func onTTY() bool { + s, _ := os.Stdout.Stat() + + return s.Mode()&os.ModeCharDevice > 0 +} + +func SetColoredLogger() { + setLogger(powerline.NewHandler(os.Stdout, &powerline.HandlerOptions{ + Level: &Level, + Colors: colors, + })) +} + +func SetUncoloredLogger() { + setLogger(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: &Level, + })) +} + +func SetLogger() { + if onTTY() { + SetColoredLogger() + } else { + SetUncoloredLogger() + } +} + +func Panic(msg string, args ...any) { + slog.Error(msg, args...) + panic(msg) +} diff --git a/cli/update.go b/cli/update.go index a2cff8c..7d23710 100644 --- a/cli/update.go +++ b/cli/update.go @@ -19,14 +19,13 @@ package cli import ( "errors" "fmt" + "log/slog" "os" "github.com/DataDrake/cli-ng/v2/cmd" - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" "github.com/getsolus/solbuild/builder" + "github.com/getsolus/solbuild/cli/log" ) func init() { @@ -45,22 +44,22 @@ var Update = cmd.Sub{ func UpdateRun(r *cmd.Root, c *cmd.Sub) { rFlags := r.Flags.(*GlobalFlags) //nolint:forcetypeassert // guaranteed by callee. if rFlags.Debug { - log.SetLevel(level.Debug) + log.Level.Set(slog.LevelDebug) } if rFlags.NoColor { - log.SetFormat(format.Un) + log.SetUncoloredLogger() } if os.Geteuid() != 0 { - log.Fatalln("You must be root to run init profiles") + log.Panic("You must be root to run init profiles") } // Initialise the build manager manager, err := builder.NewManager() if err != nil { - log.Fatalln(err.Error()) + log.Panic(err.Error()) } - // Safety first.. + // Safety first... if err = manager.SetProfile(rFlags.Profile); err != nil { if errors.Is(err, builder.ErrProfileNotInstalled) { fmt.Fprintf(os.Stderr, "%v: Did you forget to init?\n", err) diff --git a/go.mod b/go.mod index 37a1d20..92a5137 100644 --- a/go.mod +++ b/go.mod @@ -1,23 +1,25 @@ module github.com/getsolus/solbuild -go 1.21 +go 1.21.0 + +toolchain go1.21.1 require ( github.com/BurntSushi/toml v1.3.2 github.com/DataDrake/cli-ng/v2 v2.0.2 - github.com/DataDrake/waterlog v1.2.0 github.com/cavaliergopher/grab/v3 v3.0.1 github.com/cheggaaa/pb/v3 v3.1.4 github.com/coreos/go-systemd/v22 v22.5.0 github.com/getsolus/libosdev v0.0.0-20181023041421-9ab0f4b463fd + github.com/go-git/go-billy/v5 v5.5.0 github.com/go-git/go-git/v5 v5.9.0 + gitlab.com/slxh/go/powerline v0.1.0 gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 ) require ( dario.cat/mergo v1.0.0 // indirect - github.com/DataDrake/flair v0.5.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/VividCortex/ewma v1.2.0 // indirect @@ -27,7 +29,6 @@ require ( github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect diff --git a/go.sum b/go.sum index 082ad98..b83cecf 100644 --- a/go.sum +++ b/go.sum @@ -4,10 +4,6 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/DataDrake/cli-ng/v2 v2.0.2 h1:7+25l25VmlERCE95glW6QKBUF13vxqAM2jasFiN02xQ= github.com/DataDrake/cli-ng/v2 v2.0.2/go.mod h1:bU9YaNNWWVq0eIdDsU3TCe9+7Jb398iBBoqee5EiKWQ= -github.com/DataDrake/flair v0.5.1 h1:JHWOoBRiQGWg+k2bV2Mje2YmDtRjhMj51yDxQkzidWI= -github.com/DataDrake/flair v0.5.1/go.mod h1:3KgdmkL8eJDbg/HdMwlHkeYH/mpSy/hsQvxYQFp9A/Y= -github.com/DataDrake/waterlog v1.2.0 h1:T3Hs0D6YOQfz6GtViw+fYSIGpGimU41FubcxQQzaeHM= -github.com/DataDrake/waterlog v1.2.0/go.mod h1:xSKEWChL8698jwSJSyjKPIpFpj/K5n+Eif2ztYXDjJI= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -108,6 +104,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/slxh/go/powerline v0.1.0 h1:/3lwpGRD5yW9HFS/hammtCI4kvtjKw8E1dcpHS9Udx8= +gitlab.com/slxh/go/powerline v0.1.0/go.mod h1:vBTN83xoDyGejdTeZkMGs8l/qZvOjpUkRMYrthNhqJE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= diff --git a/main.go b/main.go index 664f035..91b3588 100644 --- a/main.go +++ b/main.go @@ -17,22 +17,24 @@ package main import ( - log2 "log" - - log "github.com/DataDrake/waterlog" - "github.com/DataDrake/waterlog/format" - "github.com/DataDrake/waterlog/level" + "os" _ "github.com/getsolus/solbuild/builder" "github.com/getsolus/solbuild/cli" + "github.com/getsolus/solbuild/cli/log" ) -func init() { - log.SetFormat(format.Min) - log.SetLevel(level.Info) - log.SetFlags(log2.Ltime | log2.Ldate | log2.LUTC) +func exit() { + if r := recover(); r != nil { + os.Exit(1) + } + + os.Exit(0) } func main() { + defer exit() + + log.SetLogger() cli.Root.Run() }