vagrant-lxc 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/BOXES.md +55 -0
- data/CHANGELOG.md +14 -0
- data/CONTRIBUTING.md +20 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +4 -3
- data/README.md +16 -19
- data/boxes/build-debian-box.sh +167 -0
- data/boxes/build-ubuntu-box.sh +151 -0
- data/boxes/common/install-babushka +4 -3
- data/boxes/common/install-chef +3 -2
- data/boxes/common/install-puppet +3 -2
- data/boxes/common/install-salt +3 -2
- data/boxes/common/lxc-template +10 -13
- data/boxes/common/metadata.json +2 -1
- data/development/Vagrantfile +4 -4
- data/development/site.pp +31 -6
- data/lib/vagrant-lxc/action.rb +44 -40
- data/lib/vagrant-lxc/action/clear_forwarded_ports.rb +4 -0
- data/lib/vagrant-lxc/action/fetch_ip_from_dnsmasq_leases.rb +1 -1
- data/lib/vagrant-lxc/action/fetch_ip_with_lxc_attach.rb +4 -7
- data/lib/vagrant-lxc/action/message.rb +1 -0
- data/lib/vagrant-lxc/action/setup_package_files.rb +1 -0
- data/lib/vagrant-lxc/action/wait_for_communicator.rb +9 -14
- data/lib/vagrant-lxc/driver.rb +10 -7
- data/lib/vagrant-lxc/driver/cli.rb +7 -1
- data/lib/vagrant-lxc/errors.rb +5 -0
- data/lib/vagrant-lxc/version.rb +1 -1
- data/locales/en.yml +8 -2
- data/spec/Vagrantfile +7 -2
- data/spec/unit/driver/cli_spec.rb +8 -0
- metadata +8 -18
- data/boxes/debian/download +0 -156
- data/boxes/debian/finalize +0 -195
- data/boxes/debian/lxc-template +0 -367
- data/boxes/debian/metadata.json.template +0 -9
- data/boxes/ubuntu/download +0 -113
- data/boxes/ubuntu/finalize +0 -374
- data/boxes/ubuntu/lxc-template +0 -559
- data/boxes/ubuntu/metadata.json.template +0 -9
- data/development/shell-provisioning/upgrade-kernel +0 -14
- data/example/Vagrantfile +0 -46
- data/example/cookbooks/hello-world/recipes/default.rb +0 -4
- data/example/puppet/manifests/site.pp +0 -5
- data/example/puppet/modules/hello_world/manifests/init.pp +0 -3
- data/tasks/boxes.rake +0 -115
- data/tasks/boxes.v2.rake +0 -188
@@ -45,6 +45,7 @@ module Vagrant
|
|
45
45
|
box_dir = @env[:machine].box.directory
|
46
46
|
FileUtils.cp box_dir.join('lxc-template').to_s, @env['package.directory'].to_s
|
47
47
|
FileUtils.cp box_dir.join('metadata.json').to_s, @env['package.directory'].to_s
|
48
|
+
# TODO: Update built-on metadata.json
|
48
49
|
if (conf = box_dir.join('lxc.conf')).exist?
|
49
50
|
FileUtils.cp conf.to_s, @env['package.directory'].to_s
|
50
51
|
end
|
@@ -1,25 +1,25 @@
|
|
1
1
|
# This acts like a backport of Vagrant's built in action from 1.3+ for older versions
|
2
|
+
# and will probably be deprecated on 0.8+
|
2
3
|
# https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/action/builtin/wait_for_communicator.rb
|
3
4
|
module Vagrant
|
4
5
|
module LXC
|
5
6
|
module Action
|
6
7
|
class WaitForCommunicator
|
7
|
-
def initialize(app, env
|
8
|
+
def initialize(app, env)
|
8
9
|
@app = app
|
9
|
-
@states = states
|
10
10
|
end
|
11
11
|
|
12
12
|
def call(env)
|
13
13
|
@env = env
|
14
|
-
|
14
|
+
|
15
|
+
raise Vagrant::Errors::VMFailedToBoot if !wait_for_communicator
|
16
|
+
|
15
17
|
@app.call env
|
16
18
|
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
@env[:machine].config.ssh.max_tries.to_i.times do |i|
|
20
|
+
def wait_for_communicator
|
21
|
+
max_tries = @env[:machine].config.ssh.max_tries.to_i
|
22
|
+
max_tries.times do |i|
|
23
23
|
if @env[:machine].communicate.ready?
|
24
24
|
@env[:ui].info I18n.t("vagrant_lxc.messages.container_ready")
|
25
25
|
return true
|
@@ -29,12 +29,7 @@ module Vagrant
|
|
29
29
|
# get shown
|
30
30
|
return true if @env[:interrupted]
|
31
31
|
|
32
|
-
|
33
|
-
# and we need to show a useful error.
|
34
|
-
state = @env[:machine].provider.state.id
|
35
|
-
raise Vagrant::Errors::VMFailedToRun unless @states.include?(state)
|
36
|
-
|
37
|
-
sleep 2 if !@env["vagrant.test"]
|
32
|
+
sleep 1 if !@env["vagrant.test"]
|
38
33
|
end
|
39
34
|
|
40
35
|
@env[:ui].error I18n.t("vagrant.actions.vm.boot.failed")
|
data/lib/vagrant-lxc/driver.rb
CHANGED
@@ -111,9 +111,7 @@ module Vagrant
|
|
111
111
|
@sudo_wrapper.run('tar', '--numeric-owner', '-czf', target_path, 'rootfs')
|
112
112
|
|
113
113
|
@logger.info "Changing rootfs tarball owner"
|
114
|
-
|
115
|
-
user_details=Etc.getpwnam(Etc.getlogin)
|
116
|
-
|
114
|
+
user_details = Etc.getpwnam(Etc.getlogin)
|
117
115
|
@sudo_wrapper.run('chown', "#{user_details.uid}:#{user_details.gid}", target_path)
|
118
116
|
end
|
119
117
|
|
@@ -151,12 +149,16 @@ module Vagrant
|
|
151
149
|
template_name = "vagrant-tmp-#{@container_name}"
|
152
150
|
tmp_template_path = templates_path.join("lxc-#{template_name}").to_s
|
153
151
|
|
154
|
-
@logger.
|
152
|
+
@logger.info 'Copying LXC template into place'
|
155
153
|
@sudo_wrapper.run('cp', path, tmp_template_path)
|
154
|
+
@sudo_wrapper.run('chmod', '+x', tmp_template_path)
|
156
155
|
|
157
156
|
yield template_name
|
158
157
|
ensure
|
159
|
-
@
|
158
|
+
@logger.info 'Removing LXC template'
|
159
|
+
if tmp_template_path
|
160
|
+
@sudo_wrapper.run('rm', tmp_template_path)
|
161
|
+
end
|
160
162
|
end
|
161
163
|
|
162
164
|
TEMPLATES_PATH_LOOKUP = %w(
|
@@ -169,8 +171,9 @@ module Vagrant
|
|
169
171
|
return @templates_path if @templates_path
|
170
172
|
|
171
173
|
path = TEMPLATES_PATH_LOOKUP.find { |candidate| File.directory?(candidate) }
|
172
|
-
|
173
|
-
|
174
|
+
if !path
|
175
|
+
raise Errors::TemplatesDirMissing.new paths: TEMPLATES_PATH_LOOKUP.inspect
|
176
|
+
end
|
174
177
|
|
175
178
|
@templates_path = Pathname(path)
|
176
179
|
end
|
@@ -81,7 +81,12 @@ module Vagrant
|
|
81
81
|
if cmd.last.is_a?(Hash)
|
82
82
|
opts = cmd.pop
|
83
83
|
namespaces = Array(opts[:namespaces]).map(&:upcase).join('|')
|
84
|
-
|
84
|
+
|
85
|
+
if run(:attach, '-h').include?('--namespaces')
|
86
|
+
extra = ['--namespaces', namespaces] if namespaces
|
87
|
+
else
|
88
|
+
raise LXC::Errors::NamespacesNotSupported
|
89
|
+
end
|
85
90
|
end
|
86
91
|
|
87
92
|
run :attach, '--name', @name, *((extra || []) + cmd)
|
@@ -99,6 +104,7 @@ module Vagrant
|
|
99
104
|
end
|
100
105
|
|
101
106
|
unless last_state == target_state
|
107
|
+
# TODO: Raise an user friendly message
|
102
108
|
raise TargetStateNotReached.new target_state, last_state
|
103
109
|
end
|
104
110
|
end
|
data/lib/vagrant-lxc/errors.rb
CHANGED
@@ -6,6 +6,8 @@ module Vagrant
|
|
6
6
|
class ExecuteError < Vagrant::Errors::VagrantError
|
7
7
|
error_key(:lxc_execute_error)
|
8
8
|
end
|
9
|
+
class NamespacesNotSupported < Vagrant::Errors::VagrantError
|
10
|
+
end
|
9
11
|
|
10
12
|
class LxcNotInstalled < Vagrant::Errors::VagrantError
|
11
13
|
error_key(:lxc_not_installed)
|
@@ -15,6 +17,9 @@ module Vagrant
|
|
15
17
|
class TemplateFileMissing < Vagrant::Errors::VagrantError
|
16
18
|
error_key(:lxc_template_file_missing)
|
17
19
|
end
|
20
|
+
class TemplatesDirMissing < Vagrant::Errors::VagrantError
|
21
|
+
error_key(:lxc_templates_dir_missing)
|
22
|
+
end
|
18
23
|
class RootFSTarballMissing < Vagrant::Errors::VagrantError
|
19
24
|
error_key(:lxc_invalid_box_version)
|
20
25
|
end
|
data/lib/vagrant-lxc/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -10,12 +10,13 @@ en:
|
|
10
10
|
was declined.
|
11
11
|
starting: |-
|
12
12
|
Starting container...
|
13
|
+
force_shutdown: |-
|
14
|
+
Forcing shutdown of container...
|
15
|
+
# TODO: Remove the following keys after we drop support for vagrant < 1.3
|
13
16
|
waiting_for_start: |-
|
14
17
|
Waiting for container to start. This should not take long.
|
15
18
|
container_ready: |-
|
16
19
|
Container started and ready for use!
|
17
|
-
force_shutdown: |-
|
18
|
-
Forcing shutdown of container...
|
19
20
|
|
20
21
|
vagrant:
|
21
22
|
commands:
|
@@ -45,6 +46,11 @@ en:
|
|
45
46
|
The template file used for creating the container was not found for %{name}
|
46
47
|
box.
|
47
48
|
|
49
|
+
lxc_templates_dir_missing: |-
|
50
|
+
Unable to identify lxc templates path.
|
51
|
+
|
52
|
+
Looked up under: %{paths}
|
53
|
+
|
48
54
|
lxc_not_installed: |-
|
49
55
|
The `lxc` package does not seem to be installed or is not accessible on the PATH.
|
50
56
|
|
data/spec/Vagrantfile
CHANGED
@@ -5,17 +5,22 @@ Vagrant.require_plugin 'vagrant-lxc'
|
|
5
5
|
Vagrant.require_plugin 'vagrant-cachier'
|
6
6
|
|
7
7
|
ENV['BOX_NAME'] ||= 'quantal64'
|
8
|
+
puts "Running specs using #{ENV['BOX_NAME']} box"
|
8
9
|
|
9
10
|
Vagrant.configure("2") do |config|
|
10
11
|
config.vm.box = ENV['BOX_NAME']
|
11
12
|
config.vm.hostname = 'lxc-test-box'
|
13
|
+
config.vm.network :forwarded_port, guest: 80, host: 8080
|
14
|
+
|
15
|
+
config.cache.auto_detect = true
|
12
16
|
|
13
|
-
config.
|
17
|
+
config.vm.provider :lxc do |lxc|
|
18
|
+
lxc.sudo_wrapper = '/usr/bin/lxc-vagrant-wrapper'
|
19
|
+
end
|
14
20
|
|
15
21
|
config.vm.provision :shell,
|
16
22
|
inline: 'mkdir -p /vagrant/tmp && echo -n "Provisioned" > /vagrant/tmp/provisioning'
|
17
23
|
|
18
|
-
config.vm.network :forwarded_port, guest: 80, host: 8080
|
19
24
|
config.vm.provision :shell,
|
20
25
|
inline: 'sudo apt-get install apache2 -y'
|
21
26
|
end
|
@@ -146,9 +146,17 @@ describe Vagrant::LXC::Driver::CLI do
|
|
146
146
|
end
|
147
147
|
|
148
148
|
it 'supports a "namespaces" parameter' do
|
149
|
+
subject.stub(:run).with(:attach, '-h').and_return('--namespaces')
|
149
150
|
subject.attach *(command + [{namespaces: ['network', 'mount']}])
|
150
151
|
subject.should have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
|
151
152
|
end
|
153
|
+
|
154
|
+
it 'raises a NamespacesNotSupported error if not supported' do
|
155
|
+
subject.stub(:run).with(:attach, '-h').and_return('not supported')
|
156
|
+
expect {
|
157
|
+
subject.attach *(command + [{namespaces: ['network', 'mount']}])
|
158
|
+
}.to raise_error(Vagrant::LXC::Errors::NamespacesNotSupported)
|
159
|
+
end
|
152
160
|
end
|
153
161
|
|
154
162
|
describe 'transition block' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-lxc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Rehm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Linux Containers provider for Vagrant
|
14
14
|
email:
|
@@ -21,13 +21,17 @@ files:
|
|
21
21
|
- .rspec
|
22
22
|
- .travis.yml
|
23
23
|
- .vimrc
|
24
|
+
- BOXES.md
|
24
25
|
- CHANGELOG.md
|
26
|
+
- CONTRIBUTING.md
|
25
27
|
- Gemfile
|
26
28
|
- Gemfile.lock
|
27
29
|
- Guardfile
|
28
30
|
- LICENSE.txt
|
29
31
|
- README.md
|
30
32
|
- Rakefile
|
33
|
+
- boxes/build-debian-box.sh
|
34
|
+
- boxes/build-ubuntu-box.sh
|
31
35
|
- boxes/common/cleanup
|
32
36
|
- boxes/common/install-babushka
|
33
37
|
- boxes/common/install-chef
|
@@ -36,26 +40,13 @@ files:
|
|
36
40
|
- boxes/common/lxc-template
|
37
41
|
- boxes/common/lxc.conf
|
38
42
|
- boxes/common/metadata.json
|
39
|
-
- boxes/debian/download
|
40
|
-
- boxes/debian/finalize
|
41
|
-
- boxes/debian/lxc-template
|
42
|
-
- boxes/debian/metadata.json.template
|
43
|
-
- boxes/ubuntu/download
|
44
|
-
- boxes/ubuntu/finalize
|
45
|
-
- boxes/ubuntu/lxc-template
|
46
|
-
- boxes/ubuntu/metadata.json.template
|
47
43
|
- development/Vagrantfile
|
48
44
|
- development/lxc-configs/lxc-dev-box
|
49
45
|
- development/lxc-configs/sid
|
50
46
|
- development/lxc-configs/squeeze
|
51
47
|
- development/lxc-configs/vbox
|
52
48
|
- development/lxc-configs/wheezy
|
53
|
-
- development/shell-provisioning/upgrade-kernel
|
54
49
|
- development/site.pp
|
55
|
-
- example/Vagrantfile
|
56
|
-
- example/cookbooks/hello-world/recipes/default.rb
|
57
|
-
- example/puppet/manifests/site.pp
|
58
|
-
- example/puppet/modules/hello_world/manifests/init.pp
|
59
50
|
- lib/vagrant-lxc.rb
|
60
51
|
- lib/vagrant-lxc/action.rb
|
61
52
|
- lib/vagrant-lxc/action/boot.rb
|
@@ -106,8 +97,6 @@ files:
|
|
106
97
|
- spec/unit/driver_spec.rb
|
107
98
|
- spec/unit/support/unit_example_group.rb
|
108
99
|
- spec/unit_helper.rb
|
109
|
-
- tasks/boxes.rake
|
110
|
-
- tasks/boxes.v2.rake
|
111
100
|
- tasks/spec.rake
|
112
101
|
- vagrant-lxc.gemspec
|
113
102
|
homepage: https://github.com/fgrehm/vagrant-lxc
|
@@ -130,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
119
|
version: '0'
|
131
120
|
requirements: []
|
132
121
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.1.5
|
134
123
|
signing_key:
|
135
124
|
specification_version: 4
|
136
125
|
summary: Linux Containers provider for Vagrant
|
@@ -153,3 +142,4 @@ test_files:
|
|
153
142
|
- spec/unit/driver_spec.rb
|
154
143
|
- spec/unit/support/unit_example_group.rb
|
155
144
|
- spec/unit_helper.rb
|
145
|
+
has_rdoc:
|
data/boxes/debian/download
DELETED
@@ -1,156 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# This is the code extracted from /usr/share/lxc/templates/lxc-debian
|
4
|
-
# that comes with Ubuntu 13.04 which is responsible for downloading the
|
5
|
-
# rootfs files / packages
|
6
|
-
|
7
|
-
set -e
|
8
|
-
|
9
|
-
suggest_flush()
|
10
|
-
{
|
11
|
-
echo <<EOF
|
12
|
-
Container upgrade failed. The container cache may be out of date,
|
13
|
-
in which case flushing the case (see -F in the hep output) may help.
|
14
|
-
EOF
|
15
|
-
}
|
16
|
-
|
17
|
-
cleanup()
|
18
|
-
{
|
19
|
-
rm -rf $cache/partial
|
20
|
-
rm -rf $cache/rootfs
|
21
|
-
}
|
22
|
-
|
23
|
-
write_sourceslist()
|
24
|
-
{
|
25
|
-
rootfs=$1
|
26
|
-
arch=$2
|
27
|
-
release=$3
|
28
|
-
|
29
|
-
MIRROR=${MIRROR:-http://ftp.debian.org/debian}
|
30
|
-
SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.debian.org/debian-security}
|
31
|
-
|
32
|
-
|
33
|
-
if [ 'sid' == "${release}" -o 'unstable' == "${release}" ]; then
|
34
|
-
cat <<EOF > ${rootfs}/etc/apt/sources.list
|
35
|
-
# ${release}
|
36
|
-
#------------------------------------------------------------------------------
|
37
|
-
deb ${MIRROR} ${release} main contrib non-free
|
38
|
-
EOF
|
39
|
-
else
|
40
|
-
cat <<EOF > ${rootfs}/etc/apt/sources.list
|
41
|
-
# ${release}
|
42
|
-
#------------------------------------------------------------------------------
|
43
|
-
deb ${MIRROR} ${release} main contrib non-free
|
44
|
-
|
45
|
-
# ${release} security
|
46
|
-
#------------------------------------------------------------------------------
|
47
|
-
deb ${SECURITY_MIRROR} ${release}/updates main contrib non-free
|
48
|
-
|
49
|
-
# ${release} updates
|
50
|
-
#------------------------------------------------------------------------------
|
51
|
-
deb ${MIRROR} ${release}-updates main contrib non-free
|
52
|
-
|
53
|
-
# ${release} proposed updates
|
54
|
-
#------------------------------------------------------------------------------
|
55
|
-
deb ${MIRROR} ${release}-proposed-updates main contrib non-free
|
56
|
-
EOF
|
57
|
-
fi
|
58
|
-
}
|
59
|
-
|
60
|
-
download_debian()
|
61
|
-
{
|
62
|
-
cache=$1
|
63
|
-
arch=$2
|
64
|
-
release=$3
|
65
|
-
|
66
|
-
packages=\
|
67
|
-
sudo,\
|
68
|
-
ifupdown,\
|
69
|
-
locales,\
|
70
|
-
libui-dialog-perl,\
|
71
|
-
dialog,\
|
72
|
-
isc-dhcp-client,\
|
73
|
-
netbase,\
|
74
|
-
net-tools,\
|
75
|
-
iproute,\
|
76
|
-
openssh-server,\
|
77
|
-
vim,\
|
78
|
-
jed,\
|
79
|
-
jed-extra,\
|
80
|
-
ssh,\
|
81
|
-
curl,\
|
82
|
-
wget,\
|
83
|
-
bash-completion,\
|
84
|
-
manpages,\
|
85
|
-
man-db,\
|
86
|
-
psmisc,\
|
87
|
-
bind9-host,\
|
88
|
-
telnet,\
|
89
|
-
mtr-tiny,\
|
90
|
-
iputils-ping,\
|
91
|
-
ca-certificates
|
92
|
-
|
93
|
-
if [ ! -z "${ADDITIONAL_PACKAGES}" ]; then
|
94
|
-
packages=${ADDITIONAL_PACKAGES},${packages}
|
95
|
-
fi
|
96
|
-
|
97
|
-
echo "installing packages: ${packages}"
|
98
|
-
|
99
|
-
trap cleanup EXIT SIGHUP SIGINT SIGTERM
|
100
|
-
# check the mini debian was not already downloaded
|
101
|
-
partial=${cache}/partial
|
102
|
-
mkdir -p ${partial}
|
103
|
-
if [ $? -ne 0 ]; then
|
104
|
-
echo "Failed to create '${partial}' directory"
|
105
|
-
return 1
|
106
|
-
fi
|
107
|
-
|
108
|
-
# download a mini debian into a cache
|
109
|
-
echo "Downloading debian ${release} minimal ..."
|
110
|
-
debootstrap \
|
111
|
-
--variant=minbase \
|
112
|
-
--verbose \
|
113
|
-
--components=main,contrib,non-free \
|
114
|
-
--arch=${arch} \
|
115
|
-
--include=${packages} ${release} ${partial} ${MIRROR}
|
116
|
-
|
117
|
-
if [ $? -ne 0 ]; then
|
118
|
-
echo 'Failed to download the rootfs, aborting.'
|
119
|
-
return 1
|
120
|
-
fi
|
121
|
-
|
122
|
-
echo 'Installing updates'
|
123
|
-
write_sourceslist ${partial} ${arch} ${release}
|
124
|
-
|
125
|
-
chroot ${partial} apt-get update
|
126
|
-
if [ $? -ne 0 ]; then
|
127
|
-
echo 'Failed to update the apt cache'
|
128
|
-
return 1
|
129
|
-
fi
|
130
|
-
|
131
|
-
lxc-unshare -s MOUNT -- chroot ${partial} \
|
132
|
-
apt-get dist-upgrade -y || { suggest_flush; false; }
|
133
|
-
|
134
|
-
chroot ${partial} apt-get clean
|
135
|
-
|
136
|
-
mv ${partial} ${cache}/rootfs
|
137
|
-
trap EXIT
|
138
|
-
trap SIGINT
|
139
|
-
trap SIGTERM
|
140
|
-
trap SIGHUP
|
141
|
-
echo 'Download complete'
|
142
|
-
return 0
|
143
|
-
}
|
144
|
-
|
145
|
-
declare cache=`readlink -f .` \
|
146
|
-
arch=$1 \
|
147
|
-
release=$2
|
148
|
-
|
149
|
-
if [ -d ${cache}/rootfs ]; then
|
150
|
-
echo <<EOF
|
151
|
-
The rootfs cache has been built already, please remove it if you want to update
|
152
|
-
EOF
|
153
|
-
exit 1
|
154
|
-
fi
|
155
|
-
|
156
|
-
download_debian ${cache} ${arch} ${release}
|