# # ClientConf.pm: configuration library for wanna-build clients # Copyright © 1998 Roman Hodek # Copyright © 2005 Ryan Murray # Copyright © 2006-2009 Roger Leigh # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # ####################################################################### package Buildd::ClientConf; use strict; use warnings; use Sbuild::Sysconfig; use File::Spec; BEGIN { use Exporter (); our (@ISA, @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(setup); } sub setup ($) { my $conf = shift; my $validate_program = sub { my $conf = shift; my $entry = shift; my $key = $entry->{'NAME'}; my $program = $conf->get($key); die "$key binary is not defined" if !defined($program) || !$program; # Emulate execvp behaviour by searching the binary in the PATH. my @paths = split(/:/, $ENV{'PATH'}); # Also consider the empty path for absolute locations. push (@paths, ''); my $found = 0; foreach my $path (@paths) { $found = 1 if (-x File::Spec->catfile($path, $program)); } die "$key binary '$program' does not exist or is not executable" if !$found; }; my $validate_ssh = sub { my $conf = shift; my $entry = shift; # TODO: Provide self, config and entry contexts, which functions to # get at needed data. Provide generic configuration functions. # $validate_program->($conf, $conf->{'KEYS'}->{'SSH'}); my $ssh = $conf->get('SSH'); my $sshuser = $conf->get('WANNA_BUILD_SSH_USER'); my $sshhost = $conf->get('WANNA_BUILD_SSH_HOST'); my @sshoptions = @{$conf->get('WANNA_BUILD_SSH_OPTIONS')}; my $sshsocket = $conf->get('WANNA_BUILD_SSH_SOCKET'); my @command = (); if ($sshhost) { push (@command, $ssh); push (@command, '-l', $sshuser) if $sshuser; push (@command, '-S', $sshsocket) if $sshsocket; push (@command, @sshoptions) if @sshoptions; push (@command, $sshhost); } $conf->set('WANNA_BUILD_SSH_CMD', \@command); }; our $HOME = $conf->get('HOME'); my $arch = $conf->get('ARCH'); my %db_keys = ( 'SSH' => { TYPE => 'STRING', VARNAME => 'ssh', GROUP => 'Programs', DEFAULT => 'ssh', CHECK => $validate_ssh, HELP => 'Path to ssh binary' }, 'WANNA_BUILD_SSH_CMD' => { TYPE => 'STRING', GROUP => '__INTERNAL', DEFAULT => '', HELP => 'Command to run wanna-build (set automatically from the other wanna-build options)' }, 'WANNA_BUILD_SSH_USER' => { TYPE => 'STRING', VARNAME => 'wanna_build_ssh_user', GROUP => 'wanna-build client', DEFAULT => '', CHECK => $validate_ssh, HELP => 'Username for SSH connection' }, 'WANNA_BUILD_SSH_HOST' => { TYPE => 'STRING', VARNAME => 'wanna_build_ssh_host', GROUP => 'wanna-build client', DEFAULT => '', CHECK => $validate_ssh, HELP => 'Host for SSH connection' }, 'WANNA_BUILD_SSH_SOCKET' => { TYPE => 'STRING', VARNAME => 'wanna_build_ssh_socket', GROUP => 'wanna-build client', DEFAULT => '', CHECK => $validate_ssh, HELP => 'Socket for SSH connection' }, 'WANNA_BUILD_SSH_OPTIONS' => { TYPE => 'ARRAY:STRING', VARNAME => 'wanna_build_ssh_options', GROUP => 'wanna-build client', DEFAULT => [], CHECK => $validate_ssh, HELP => 'SSH options. Note this is an array reference.' }, 'WANNA_BUILD_DB_NAME' => { TYPE => 'STRING', VARNAME => 'wanna_build_db_name', GROUP => 'wanna-build client', DEFAULT => undef, HELP => 'Database name' }, 'WANNA_BUILD_DB_USER' => { TYPE => 'STRING', VARNAME => 'wanna_build_db_user', GROUP => 'wanna-build client', DEFAULT => $conf->get('USERNAME'), # arch:all packages must not differ depending on which user is # building the source package, so don't show the default for # example config and man page generation IGNORE_DEFAULT => 1, HELP => 'Database user' }, 'BUILT_ARCHITECTURE' => { TYPE => 'STRING', VARNAME => 'wanna_build_built_architecture', GROUP => 'wanna-build client', DEFAULT => $arch, # the $native_arch is different depending on the machine where # sbuild is built but arch:all packages must not differ depending on # the architecture they are built on, so don't show the default for # example config and man page generation IGNORE_DEFAULT => 1, HELP => 'Architecture for database' }); $conf->set_allowed_keys(\%db_keys); } 1;