summaryrefslogtreecommitdiffstats
path: root/perl-install/drakcluster/server_conf.pm
blob: 435b013a5dcd01a42351c5ee9bac93fc6ffe8c3d (plain)
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
package drakcluster::server_conf;

use strict;
use common;

sub read() {
    my %main = getVarsFromSh("$::prefix/etc/clusterserver.conf");
    \%main;
}

sub done {
    my ($conf, $network_interfaces) = @_;
    set_automatic_fields($conf, $network_interfaces);
    setVarsInSh("$::prefix/etc/clusterserver.conf", $conf);
}

my %automatic_when_single_network = (
    ADMIN_INTERFACE => 'COMPUTE_INTERFACE',
    NODENAME => 'COMPUTENODENAME',
    DOMAINNAME => 'DOMAINCOMP',
);

sub set_automatic_fields {
    my ($conf, $network_interfaces) = @_;
    if (@$network_interfaces <= 2) {
	$conf->{$_} = $conf->{$automatic_when_single_network{$_}} foreach keys %automatic_when_single_network;
    }
}

sub fields {
    my ($conf, $network_interfaces, $default_conf) = @_;
    my $current_conf = { %$conf };
    add2hash($conf, $default_conf);
    my @l = (
	[ NODENAME => 'node use for administration', check => \&check_non_empty ],
	[ COMPUTENODENAME => 'name use for compute interface', check => \&check_non_empty ],
	
	[ STARTNODE => 'IP start node', check => \&check_number ],
	[ FINISHNODE => 'IP end node', check => sub { &check_number || $conf->{STARTNODE} >= $conf->{FINISHNODE} && N("\"start node\" must be lower than \"end node\"") } ],
	
	[ ADMIN_INTERFACE => 'admin interface', list => $network_interfaces ],
	[ EXTERNAL_INTERFACE => 'external interface', list => $network_interfaces ],
	[ COMPUTE_INTERFACE => 'compute interface', list => $network_interfaces ],
	[ NTPSERVER => N("NTP Server IP"), check => sub { &check_ip || check_default(@_, $default_conf->{NTPSERVER}, $current_conf->{NTPSERVER}) } ],
	
	[ DOMAINNAME => N("domain name use for administration of node"), check => sub { check_default(@_, $default_conf->{DOMAINNAME}, $current_conf->{DOMAINNAME}) } ],
	[ NISDOMAINNAME => N("nis domain name use for NIS"), check => \&check_non_empty ],
	[ DOMAINCOMP => N("domain name use for compute"), check => \&check_non_empty ],
	[ IPOFFORWARDER => 'IP fo Forwarder resolv ip out of zone ', check => \&check_ip ],
	[ DNSKEY => 'dnskey for the dns server', check => \&check_non_empty ],
	[ ADDSEARCH => 'ADDSEARCH ' . N("is needed if you want your cluster resolv out of zone ip") ],
	
	[ USERADMIN => 'useradmin define wich user admin PBS queue', check => \&check_non_empty ],
	[ NODEADMIN => 'Nodeadmin define wich node can admin PBS queue', check => \&check_non_empty ],
	
	[ ORIGIN => 'ORIGIN ' . N("domain that locally-posted mail appears to come from"), check => \&check_non_empty ],
    );

    if (@$network_interfaces <= 2) {
	@l = grep { !$automatic_when_single_network{$_->[0]} } @l;
    }

    map { 
	my ($field, $label, %opts) = @$_;
	$opts{val} = \$conf->{$field};
	$opts{label} = $label;
	\%opts;
    } @l;
}

sub check_field {
    my ($in, $field) = @_;
    warn "checking $field->{label}\n";
    $field->{check} or return 1;
    my $err = $field->{check}->(${$field->{val}}, $field->{label}, warn => $in);
    $in->ask_warn('', $err) if $err && $err ne 'already_displayed';
    !$err;
}


# CHECKERS #####################################################################
sub is_ip {
    $::isInstall ? &network::network::is_ip : &cluster_fonction_common::is_ip;
}

sub check_non_empty {
    my ($val, $txt) = @_;
    !$val && N("Field \"%s\" must not be empty", $txt);
}
sub check_number {
    my ($val, $txt) = @_;
    $val !~ /^\d+$/ && N("Field \"%s\" must be a number", $txt);
}
sub check_ip {
    my ($val, $txt) = @_;
    !is_ip($val) && N("Field \"%s\" must be an IP", $txt);
}

sub check_default {
    my ($val, $txt, $warn, $in, $default_val, $pre_val) = @_;
    if ($default_val && $val ne $default_val && $val ne $pre_val) {
	if ($warn eq 'warn') {
	    return '' if $in->ask_okcancel('', N("You changed the default value of field \"%s\". Are you sure you want to do this?", $txt));
	}
	'already_displayed';
    } else {
	'';
    }
}