mirror of
https://github.com/Luzifer/password.git
synced 2024-12-30 09:41:19 +00:00
113 lines
2.3 KiB
Go
113 lines
2.3 KiB
Go
|
// Copyright 2012 Jonas mg
|
||
|
//
|
||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
|
||
|
// Package pkgutil handles basic operations in the management of packages in
|
||
|
// operating systems.
|
||
|
//
|
||
|
// Important
|
||
|
//
|
||
|
// If you are going to use a package manager different to Deb, then you should
|
||
|
// check the options since I cann't test all.
|
||
|
//
|
||
|
// TODO
|
||
|
//
|
||
|
// Add managers of BSD systems.
|
||
|
//
|
||
|
// Use flag to do not show questions.
|
||
|
package pkgutil
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"os/exec"
|
||
|
)
|
||
|
|
||
|
// Packager is the common interface to handle different package systems.
|
||
|
type Packager interface {
|
||
|
// Install installs packages.
|
||
|
Install(name ...string) error
|
||
|
|
||
|
// Remove removes packages.
|
||
|
Remove(name ...string) error
|
||
|
|
||
|
// Purge removes packages and its configuration files.
|
||
|
Purge(name ...string) error
|
||
|
|
||
|
// Update resynchronizes the package index files from their sources.
|
||
|
Update() error
|
||
|
|
||
|
// Upgrade upgrades all the packages on the system.
|
||
|
Upgrade() error
|
||
|
|
||
|
// Clean erases both packages downloaded and orphaned dependencies.
|
||
|
Clean() error
|
||
|
}
|
||
|
|
||
|
// PackageType represents a package management system.
|
||
|
type PackageType int8
|
||
|
|
||
|
const (
|
||
|
// Linux
|
||
|
Deb PackageType = iota + 1
|
||
|
RPM
|
||
|
Pacman
|
||
|
Ebuild
|
||
|
ZYpp
|
||
|
)
|
||
|
|
||
|
func (pkg PackageType) String() string {
|
||
|
switch pkg {
|
||
|
case Deb:
|
||
|
return "Deb"
|
||
|
case RPM:
|
||
|
return "RPM"
|
||
|
case Pacman:
|
||
|
return "Pacman"
|
||
|
case Ebuild:
|
||
|
return "Ebuild"
|
||
|
case ZYpp:
|
||
|
return "ZYpp"
|
||
|
}
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
|
||
|
// New returns the interface to handle the package manager.
|
||
|
func New(pkg PackageType) Packager {
|
||
|
switch pkg {
|
||
|
case Deb:
|
||
|
return new(deb)
|
||
|
case RPM:
|
||
|
return new(rpm)
|
||
|
case Pacman:
|
||
|
return new(pacman)
|
||
|
case Ebuild:
|
||
|
return new(ebuild)
|
||
|
case ZYpp:
|
||
|
return new(zypp)
|
||
|
}
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
|
||
|
// execPackagers is a list of executables of package managers.
|
||
|
var execPackagers = [...]string{
|
||
|
Deb: "apt-get",
|
||
|
RPM: "yum",
|
||
|
Pacman: "pacman",
|
||
|
Ebuild: "emerge",
|
||
|
ZYpp: "zypper",
|
||
|
}
|
||
|
|
||
|
// Detect tries to get the package system used in the system, looking for
|
||
|
// executables in directory "/usr/bin".
|
||
|
func Detect() (PackageType, error) {
|
||
|
for k, v := range execPackagers {
|
||
|
_, err := exec.LookPath("/usr/bin/" + v)
|
||
|
if err == nil {
|
||
|
return PackageType(k), nil
|
||
|
}
|
||
|
}
|
||
|
return -1, errors.New("package manager not found in directory '/usr/bin'")
|
||
|
}
|