]>
git.proxmox.com Git - dab.git/blob - dab
14 'bootstrap' => '[--exim] [--minimal]',
15 'finalize' => '[--keepmycnf] [--compressor <gz (default)|zst>]',
19 'list' => '[--verbose]',
20 'task' => '<postgres|mysql|php> [--version] [--password] [--memlimit]',
21 'install' => '<package or *.pkglist file> ...',
22 'exec' => '<cmd> ...',
30 print STDERR
"USAGE: dab <command> [parameters]\n\n";
32 for my $cmd (sort keys %$commands) {
33 if (my $opts = $commands->{$cmd}) {
34 print STDERR
" dab $cmd $opts\n";
36 print STDERR
" dab $cmd\n";
44 print STDERR
"\nERROR: $msg\n\n" if $msg;
50 if (scalar (@ARGV) == 0) {
51 fatal_usage
("no command specified");
54 my $cmdline = join (' ', @ARGV);
55 my $cmd = shift @ARGV;
58 fatal_usage
("no command specified");
59 } elsif (!exists $commands->{$cmd}) {
60 fatal_usage
("unknown command '$cmd'");
61 } elsif ($cmd eq 'help') {
68 $dab = PVE
::DAB-
>new() if !$dab;
72 dab-
>writelog ("dab: $cmdline\n");
74 $SIG{INT
} = $SIG{TERM
} = $SIG{QUIT
} = $SIG{HUP
} = sub {
75 die "interrupted by signal\n";
80 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
84 } elsif ($cmd eq 'bootstrap') {
86 if (!GetOptions
($opts, 'exim', 'minimal')) {
89 die "command 'bootstrap' expects no arguments.\n" if scalar (@ARGV) != 0;
92 $dab->bootstrap ($opts);
94 } elsif ($cmd eq 'finalize') {
96 if (!GetOptions
($opts, 'keepmycnf', 'compressor=s')) {
99 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
101 $dab->finalize($opts);
103 } elsif ($cmd eq 'veid') {
104 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
106 print $dab->{veid
} . "\n";
108 } elsif ($cmd eq 'basedir') {
109 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
111 print $dab->{rootfs
} . "\n";
113 } elsif ($cmd eq 'packagefile') {
114 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
116 print "$dab->{targetname}.tar.gz\n";
118 } elsif ($cmd eq 'list') {
120 if (!GetOptions
('verbose' =>\
$verbose)) {
123 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
125 my $instpkgs = $dab->read_installed ();
127 foreach my $pkg (sort keys %$instpkgs) {
129 my $version = $instpkgs->{$pkg}->{version
};
130 print "$pkg $version\n";
136 } elsif ($cmd eq 'task') {
137 my $task = shift @ARGV;
139 fatal_usage
("no task specified");
143 if ($task eq 'mysql') {
144 if (!GetOptions
($opts, 'password=s', 'start')) {
147 die "task '$task' expects no arguments.\n" if scalar (@ARGV) != 0;
149 $dab->task_mysql ($opts);
151 } elsif ($task eq 'postgres') {
152 if (!GetOptions
($opts, 'version=s', 'start')) {
155 die "task '$task' expects no arguments.\n" if scalar (@ARGV) != 0;
157 $dab->task_postgres ($opts);
159 } elsif ($task eq 'php') {
160 if (!GetOptions
($opts, 'memlimit=i')) {
163 die "task '$task' expects no arguments.\n" if scalar (@ARGV) != 0;
165 $dab->task_php ($opts);
168 fatal_usage
("unknown task '$task'");
171 } elsif ($cmd eq 'install' || $cmd eq 'unpack') {
173 foreach my $arg (@ARGV) {
174 if ($arg =~ m/\.pkglist$/) {
176 die "cant open package list '$arg' - $!";
177 while (defined (my $line = <TMP
>)) {
179 next if $line =~ m/^\s*$/;
180 next if $line =~ m/\#/;
181 if ($line =~ m/^\s*(\S+)\s*$/) {
184 die "invalid package name in '$arg' - $line\n";
188 push @$required, $arg;
194 $dab->install ($required, $cmd eq 'unpack');
196 } elsif ($cmd eq 'exec') {
198 $dab->ve_exec (@ARGV);
200 } elsif ($cmd eq 'enter') {
201 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
205 } elsif ($cmd eq 'clean') {
206 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
210 } elsif ($cmd eq 'dist-clean') {
211 die "command '$cmd' expects no arguments.\n" if scalar (@ARGV) != 0;
216 fatal_usage
("invalid command '$cmd'");
231 dab - Debian LXC Appliance Builder
237 =item B<dab> I<command> I<[OPTIONS]>
241 Downloads the package descriptions form the repository. Also truncates the
244 =item B<dab bootstrap>
246 Bootstrap a debian system and allocate a temporary container (we use IDs 90000
253 Use exim as MTA (we use postfix by default)
257 Do not install standard packages.
263 Print used container ID.
267 Print container private directory.
269 =item B<dab packagefile>
271 Print the appliance file name.
273 =item B<dab install I<pkg ...>>
275 Install one or more packages. I<pkg> can also refer to a file named
276 C<xyz.pkglist> which contains a list of packages. All dependencies are
277 automatically installed.
279 =item B<dab unpack I<pkg ...>>
281 Unpack one or more packages. I<pkg> can also refer to a file named
282 C<xyz.pkglist> which contains a list of packages. All dependencies are
283 automatically unpacked.
285 =item B<dab exec I<CMD> I<ARGS>>
287 Executes command CMD inside the container.
291 Calls C<lxc-attach> - this is for debugging only.
293 =item B<dab task mysql>
295 Install a mysql database server. During appliance generation we use C<admin> as
296 mysql root password (also stored in /root/.my.cnf).
300 =item I<--password=XXX>
302 Specify the mysql root password. The special value C<random> can be use to
303 generate a random root password when the appliance is started first time
304 (stored in /root/.my.cnf)
308 Start the mysql server (if you want to execute sql commands during
309 appliance generation).
313 =item B<dab task postgres>
315 Install a postgres database server.
319 =item I<--version=XXX>
321 Select Postgres version. Posible values are C<7.4>, C<8.1> and C<8.3> (depends
322 on the selected suite).
326 Start the postgres server (if you want to execute sql commands during appliance
331 =item B<dab task php>
337 =item I<--memlimit=i>
339 Set the php I<memory_limit>.
343 =item B<dab finalize>
345 Cleanup everything inside the container and generate the final appliance
352 Do not delete file C</root/.my.cfg> (mysql).
358 List installed packages.
364 Also print package versions.
370 Remove all temporary files and destroy the container.
372 =item B<dab dist-clean>
374 Like clean, but also removes the package cache (except when you specified your
375 own cache directory in the config file)
381 dab is a script to automate the creation of LXC appliances. It is basically a
382 rewrite of debootstrap in perl, but uses LXC instead of chroot and generates
383 LXC templates. Another difference is that it supports multi-stage building of
384 templates. That way you can execute arbitrary scripts between to accomplish
387 Furthermore some common tasks are fully automated, like setting up a database
388 server (mysql or postgres).
390 To accomplish minimal template creation time, packages are cached to a local
391 directory, so you do not need a local debian mirror (although this would speed
394 See http://pve.proxmox.com/wiki/Debian_Appliance_Builder for examples.
396 This script need to be run as root, so it is not recommended to start it on a
397 production machine with running containers. So many people run Proxmox VE
398 inside a KVM or VMWare 64bit virtual machine to build appliances.
400 All generated templates includes an appliance description file. Those can be
401 used to build appliance repositories.
405 Configuration is read from the file C<dab.conf> inside the current working
406 directory. The files contains key value pairs, separated by colon.
410 =item B<Suite:> I<squeeze|wheezy|jessie|trusty|vivid>
412 The Debian or Ubuntu suite.
414 =item B<Source:> I<URL [components]>
416 Defines a source location. By default we use the following for debian:
418 Source: http://ftp.debian.org/debian SUITE main contrib
419 Source: http://security.debian.org SUITE/updates main contrib
421 Note: SUITE is a variable and will be substituted.
423 There are also reasonable defaults for Ubuntu. If you do not specify any source
424 the defaults are used.
426 =item B<Depends:> I<dependencies>
428 Debian like package dependencies. This can be used to make sure that speific
429 package versions are available.
431 =item B<CacheDir>: I<path>
433 Allows you to specify the directory where downloaded packages are cached.
435 =item B<Mirror:> I<SRCURL> => I<DSTURL>
437 Define a mirror location. for example:
439 Mirror: http://ftp.debian.org/debian => ftp://mirror/debian
443 All other settings in this files are also included into the appliance
448 =item B<Name:> I<name>
450 The name of the appliance.
452 Appliance names must consist only of lower case letters (a-z), digits (0-9),
453 plus (+) and minus (-) signs, and periods (.). They must be at least two
454 characters long and must start with an alphanumeric character.
456 =item B<Architecture:> I<i386|amd64>
460 =item B<Version:> I<upstream_version[-build_revision]>
462 The version number of an appliance.
464 =item: B<Section:> I<section>
466 This field specifies an application area into which the appliance has been
467 classified. Currently we use the following section names: system, mail
469 =item B<Maintainer:> I<name <email>>
471 The appliance maintainer's name and email address. The name should come first,
472 then the email address inside angle brackets <> (in RFC822 format).
474 =item B<Infopage:> I<URL>
476 Link to web page containing more informations about this appliance.
478 =item B<Description:> I<single line synopsis>
480 extended description over several lines (indended by space) may follow.
484 =head1 Appliance description file
486 All generated templates includes an appliance description file called
490 this is the first file inside the tar archive. That way it can be easily
491 exctracted without scanning the whole archive. The file itself contains
492 informations like a debian C<control> file. It can be used to build appliance
495 Most fields are directly copied from the configuration file C<dab.conf>.
497 Additionally there are some auto-generated files:
501 =item B<Installed-Size:> I<bytes>
503 It gives the total amount of disk space required to install the named
504 appliance. The disk space is represented in megabytes as a simple decimal
507 =item B<Type:> I<type>
509 This is always C<lxc>.
511 =item B<OS:> I<[debian-4.0|debian-5.0|ubuntu-8.0]>
517 Appliance repositories usually add additional fields:
521 =item B<md5sum:> I<md5sum>
529 The following files are created inside your working directory:
531 dab.conf appliance configuration file
533 logfile contains installation logs
535 .veid stores the used container ID
537 cache/* default package cache directory
539 info/* package information cache
543 Dietmar Maurer <dietmar@proxmox.com>
545 Many thanks to Proxmox Server Solutions (www.proxmox.com) for sponsoring this
548 =head1 COPYRIGHT AND DISCLAIMER
550 Copyright (C) 2007-2020 Proxmox Server Solutions GmbH
552 Copyright: dab is under GNU GPL, the GNU General Public License.
554 This program is free software; you can redistribute it and/or modify
555 it under the terms of the GNU General Public License as published by
556 the Free Software Foundation; version 2 dated June, 1991.
558 This program is distributed in the hope that it will be useful,
559 but WITHOUT ANY WARRANTY; without even the implied warranty of
560 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
561 GNU General Public License for more details.
563 You should have received a copy of the GNU General Public License
564 along with this program; if not, write to the
565 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,