12 installCerts = &osPackage{
13 Debian: "ca-certificates",
15 installNginx = &osPackage{
18 installRunit = &osPackage{
23 type osPackage struct {
29 osPackageMutex sync.Mutex
30 osPackageDidUpdate bool
33 func (pkg *osPackage) Boot(ctx context.Context) error {
35 defer osPackageMutex.Unlock()
37 if _, err := os.Stat("/var/lib/dpkg/info/" + pkg.Debian + ".list"); err == nil {
40 if !osPackageDidUpdate {
41 d, err := os.Open("/var/lib/apt/lists")
46 if files, err := d.Readdir(4); len(files) < 4 || err != nil {
47 err = pkg.aptGet("update")
51 osPackageDidUpdate = true
54 return pkg.aptGet("install", "-y", "--no-install-recommends", pkg.Debian)
57 func (*osPackage) aptGet(args ...string) error {
58 cmd := command("apt-get", args...)
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)