# cluster-usermin-lib.pl # Common functions for managing usermin installs across a cluster do '../web-lib.pl'; &init_config(); do '../ui-lib.pl'; &foreign_require("servers", "servers-lib.pl"); &foreign_require("usermin", "usermin-lib.pl"); # list_usermin_hosts() # Returns a list of all hosts whose usermin modules are being managed sub list_usermin_hosts { local %smap = map { $_->{'id'}, $_ } &list_servers(); local $hdir = "$module_config_directory/hosts"; opendir(DIR, $hdir); local ($h, @rv); foreach $h (readdir(DIR)) { next if ($h eq "." || $h eq ".." || !-d "$hdir/$h"); local %host = ( 'id', $h ); next if (!$smap{$h}); # underlying server was deleted local $f; opendir(MDIR, "$hdir/$h"); foreach $f (readdir(MDIR)) { if ($f =~ /^(\S+)\.mod$/) { local %mod; &read_file("$hdir/$h/$f", \%mod); push(@{$host{'modules'}}, \%mod); } elsif ($f =~ /^(\S+)\.theme$/) { local %theme; &read_file("$hdir/$h/$f", \%theme); push(@{$host{'themes'}}, \%theme); } elsif ($f eq "usermin") { &read_file("$hdir/$h/$f", \%host); } } closedir(MDIR); push(@rv, \%host); } closedir(DIR); return @rv; } # save_usermin_host(&host) sub save_usermin_host { local $hdir = "$module_config_directory/hosts"; local %oldfile; mkdir($hdir, 0700); if (-d "$hdir/$_[0]->{'id'}") { opendir(DIR, "$hdir/$_[0]->{'id'}"); map { $oldfile{$_}++ } readdir(DIR); closedir(DIR); } else { mkdir("$hdir/$_[0]->{'id'}", 0700); } local $m; foreach $m (@{$_[0]->{'modules'}}) { &write_file("$hdir/$_[0]->{'id'}/$m->{'dir'}.mod", $m); delete($oldfile{"$m->{'dir'}.mod"}); } foreach $m (@{$_[0]->{'themes'}}) { &write_file("$hdir/$_[0]->{'id'}/$m->{'dir'}.theme", $m); delete($oldfile{"$m->{'dir'}.theme"}); } local %usermin = %{$_[0]}; delete($usermin{'modules'}); delete($usermin{'themes'}); delete($usermin{'id'}); &write_file("$hdir/$_[0]->{'id'}/usermin", \%usermin); delete($oldfile{"usermin"}); unlink(map { "$hdir/$_[0]->{'id'}/$_" } keys %oldfile); } # delete_usermin_host(&host) sub delete_usermin_host { system("rm -rf '$module_config_directory/hosts/$_[0]->{'id'}'"); } # list_servers() # Returns a list of all servers from the usermin servers module that can be # managed, plus this server sub list_servers { local @servers = &servers::list_servers_sorted(); return ( &servers::this_server(), grep { $_->{'user'} } @servers ); } # server_name(&server) sub server_name { return $_[0]->{'desc'} ? $_[0]->{'desc'} : $_[0]->{'host'}; } # all_modules(&hosts) sub all_modules { local (%done, $u, %descc); local @uniq = grep { !$done{$_->{'dir'}}++ } map { @{$_->{'modules'}} } @{$_[0]}; map { $descc{$_->{'desc'}}++ } @uniq; foreach $u (@uniq) { $u->{'desc'} .= " ($u->{'dir'})" if ($descc{$u->{'desc'}} > 1); } return sort { $a->{'desc'} cmp $b->{'desc'} } @uniq; } # all_themes(&hosts) sub all_themes { local %done; return sort { $a->{'desc'} cmp $b->{'desc'} } grep { !$done{$_->{'dir'}}++ } map { @{$_->{'themes'}} } @{$_[0]}; } # all_groups(&hosts) sub all_groups { local %done; return sort { $a->{'name'} cmp $b->{'name'} } grep { !$done{$_->{'name'}}++ } map { @{$_->{'groups'}} } @{$_[0]}; } # all_users(&hosts) sub all_users { local %done; return sort { $a->{'name'} cmp $b->{'name'} } grep { !$done{$_->{'name'}}++ } map { @{$_->{'users'}} } @{$_[0]}; } # create_on_input(desc, [no-donthave], [no-have], [multiple]) sub create_on_input { local @hosts = &list_usermin_hosts(); local @servers = &list_servers(); if ($_[0]) { print " $_[0]\n"; print "\n"; } if ($_[3]) { print "\n"; } print "