1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/*
Debootstrap Action
Construct the target rootfs with debootstrap tool.
Yaml syntax:
- action: debootstrap
mirror: URL
suite: "name"
components: <list of components>
variant: "name"
keyring-package:
Mandatory properties:
- suite -- release code name or symbolic name (e.g. "stable")
Optional properties:
- mirror -- URL with Debian-compatible repository
- variant -- name of the bootstrap script variant to use
- components -- list of components to use for packages selection.
Example:
components: [ main, contrib ]
- keyring-package -- keyring for packages validation. Currently ignored.
- merged-usr -- use merged '/usr' filesystem, true by default.
*/
package actions
import (
"fmt"
"io"
"os"
"path"
"strings"
"github.com/go-debos/debos"
)
type DebootstrapAction struct {
debos.BaseAction `yaml:",inline"`
Suite string
Mirror string
Variant string
KeyringPackage string `yaml:"keyring-package"`
Components []string
MergedUsr bool `yaml:"merged-usr"`
}
func NewDebootstrapAction() *DebootstrapAction {
d := DebootstrapAction{}
// Use filesystem with merged '/usr' by default
d.MergedUsr = true
return &d
}
func (d *DebootstrapAction) RunSecondStage(context debos.DebosContext) error {
cmdline := []string{
"/debootstrap/debootstrap",
"--no-check-gpg",
"--second-stage"}
if d.Components != nil {
s := strings.Join(d.Components, ",")
cmdline = append(cmdline, fmt.Sprintf("--components=%s", s))
}
c := debos.NewChrootCommandForContext(context)
// Can't use nspawn for debootstrap as it wants to create device nodes
c.ChrootMethod = debos.CHROOT_METHOD_CHROOT
return c.Run("Debootstrap (stage 2)", cmdline...)
}
func (d *DebootstrapAction) Run(context *debos.DebosContext) error {
d.LogStart()
cmdline := []string{"debootstrap", "--no-check-gpg"}
if d.MergedUsr {
cmdline = append(cmdline, "--merged-usr")
}
if d.KeyringPackage != "" {
cmdline = append(cmdline, fmt.Sprintf("--include=%s", d.KeyringPackage))
}
if d.Components != nil {
s := strings.Join(d.Components, ",")
cmdline = append(cmdline, fmt.Sprintf("--components=%s", s))
}
/* FIXME drop the hardcoded amd64 assumption" */
foreign := context.Architecture != "amd64"
if foreign {
cmdline = append(cmdline, "--foreign")
cmdline = append(cmdline, fmt.Sprintf("--arch=%s", context.Architecture))
}
if d.Variant != "" {
cmdline = append(cmdline, fmt.Sprintf("--variant=%s", d.Variant))
}
cmdline = append(cmdline, d.Suite)
cmdline = append(cmdline, context.Rootdir)
cmdline = append(cmdline, d.Mirror)
cmdline = append(cmdline, "/usr/share/debootstrap/scripts/unstable")
err := debos.Command{}.Run("Debootstrap", cmdline...)
if err != nil {
return err
}
if foreign {
err = d.RunSecondStage(*context)
if err != nil {
return err
}
}
/* HACK */
srclist, err := os.OpenFile(path.Join(context.Rootdir, "etc/apt/sources.list"),
os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
return err
}
_, err = io.WriteString(srclist, fmt.Sprintf("deb %s %s %s\n",
d.Mirror,
d.Suite,
strings.Join(d.Components, " ")))
if err != nil {
return err
}
srclist.Close()
c := debos.NewChrootCommandForContext(*context)
return c.Run("apt clean", "/usr/bin/apt-get", "clean")
}
|