13 installCerts = &osPackage{
14 Debian: "ca-certificates",
16 installRunit = &osPackage{
21 type osPackage struct {
27 osPackageMutex sync.Mutex
28 osPackageDidUpdate bool
31 func (pkg *osPackage) Boot(ctx context.Context) error {
33 defer osPackageMutex.Unlock()
35 if _, err := os.Stat("/var/lib/dpkg/info/" + pkg.Debian + ".list"); err == nil {
38 if !osPackageDidUpdate {
39 d, err := os.Open("/var/lib/apt/lists")
44 if files, err := d.Readdir(4); len(files) < 4 || err != nil {
45 err = pkg.aptGet("update")
49 osPackageDidUpdate = true
52 return pkg.aptGet("install", "-y", "--no-install-recommends", pkg.Debian)
55 func (*osPackage) aptGet(args ...string) error {
56 cmd := exec.Command("apt-get", args...)
57 cmd.Stdout = os.Stderr
58 cmd.Stderr = os.Stderr
59 for _, kv := range os.Environ() {
60 if !strings.HasPrefix(kv, "DEBIAN_FRONTEND=") {
61 cmd.Env = append(cmd.Env, kv)
64 cmd.Env = append(cmd.Env, "DEBIAN_FRONTEND=noninteractive")
67 return fmt.Errorf("%s: %s", cmd.Args, err)