#use Apache::Registry;
use CGI;
use Util;
-use Net::LDAP qw(:all);
+use Net::LDAP qw(LDAP_SUCCESS LDAP_PROTOCOL_ERROR);
use Fcntl;
use POSIX;
use MIME::Base64;
use Digest::MD5 qw(md5_hex);
-my (%attrs, @attrorder, %summaryattrs, @summaryorder);
+my (%attrs, @attrorder, %summaryattrs, @summaryorder, %summarylistitems);
# This defines the description of the fields, and which fields are retrieved
%attrs = ('hostname' => 'Host name',
# ditto for summary
%summaryattrs = ('hostname' => 'Host name',
- 'host' => 'just for a link',
- 'architecture' => 'Architecture',
- 'distribution' => 'Distribution',
+ 'host' => 'just for a link',
+ 'architecture' => 'Architecture',
'status' => 'Status',
- 'access' => 'Access');
-
-@summaryorder = ('hostname', 'architecture', 'distribution', 'status', 'access');
+ 'access' => 'Access',
+ 'sponsor' => 'Sponsor',
+ 'purpose' => 'Purpose');
+@summaryorder = qw{hostname architecture sponsor purpose status access};
+%summarylistitems = map {$_=>1} qw{purpose sponsor};
# Global settings...
my %config = &Util::ReadConfigFile;
return '' if (!$key);
my @field = split(/ /, $key);
- return '' if $field[0] ne 'ssh-dss' and $field[0] ne 'ssh-rsa';
+ my %keytypes = map {$_=>1} (qw{ssh-dss ssh-rsa ecdsa-sha2-nistp256});
+ return '' unless $keytypes{$field[0]};
return '' if !$field[1];
my $fpr = md5_hex(decode_base64($field[1]));
my $hrfpr = $field[0] . " " . substr($fpr,0,2,"");
return $hrfpr;
}
-$SIG{__DIE__} = \&DieHandler;
+sub wiki_link($) {
+ my ($in) = @_;
+ # [[hostname|text]] makes a link
+ # [[hostname]] makes a link too
+ # if you add a * after [[ it's still the same, only not used for ssh_known_hosts in ud-generate
+ # [[-hostname]] are not links, but get added to known_hosts. we should drop the [[- ]] tho
+ $in =~ s#\[\[-(.*?)\]\]#$1#g;
+ $in =~ s#\[\[\*?(.*?)\|(.*?)\]\]#<a href="http://$1">$2</a>#g;
+ $in =~ s#\[\[\*?(.*?)\]\]#<a href="http://$1">$1</a>#g;
+ return $in;
+}
+
+# in the purpose field [[host|some other text]] (where some other text is optional)
+# makes a hyperlink on the web thing. we now also add these hosts to the ssh known_hosts
+# file. But so that we don't have to add everything we link we can add an asterisk
+# and say [[*... to ignore it. In order to be able to add stuff to ssh without
+# http linking it we also support [[-hostname]] entries.
+#
+# sponsors are also wikified like purpose. maybe others as well
+sub item_uplist($) {
+ my ($items) = @_;
+ my $out = undef;
+ my(@tmp) = @$items;
+
+ if (scalar @tmp>= 1) {
+ $out = "<ul>".
+ join("", map {
+ "<li>".wiki_link($_)."</li>\n";
+ } sort {my $A=$a; my $B=$b; $A =~ s/[\[\]\*]//g; $B =~ s/[\[\]\*]//g; $A cmp $B} @tmp
+ ).
+ "</ul>";
+ }
+ return $out;
+}
+
+#$SIG{__DIE__} = \&DieHandler;
my $query = new CGI;
my $host = lc($query->param('host'));
my $sortby = lc($query->param('sortby')) || "host";
my $sortorder = lc($query->param('sortorder')) || "asc";
+
&Util::HTMLSendHeader;
$ldap = Net::LDAP->new($config{ldaphost}) || &Util::HTMLError($!);
&Util::UpgradeConnection($ldap) unless $config{usessl} eq 'False';
$output{sshrsahostfprint} .= sshfingerprint($key) . "<br>";
}
- # URL
- my ($sponsor, $url) = undef;
- $output{sponsor} = undef;
- foreach $sponsor (@{$data->{sponsor}}) {
- $sponsor =~ m#((http|ftp)://\S+)#i;
- $url = $1;
- $sponsor =~ s/\s*$url\s*//;
- $output{sponsor} .= "<br>" if ($output{sponsor});
- if ($url) {
- $output{sponsor} .= sprintf("<a href=\"%s\">%s</a>", $url, $sponsor);
- } else {
- $output{sponsor} .= $sponsor;
- }
- }
+ my $sponsor = item_uplist($data->{sponsor});
+ $output{sponsor} = $sponsor if defined $sponsor;
+ my $purpose = item_uplist($data->{purpose});
+ $output{purpose} = $purpose if defined $purpose;
- #Reformat purposes to be pleasing for the human eye:
- $output{purpose} = join(",", @{$data->{purpose}});
-
- $selected = " selected ";
+ $selected = " selected ";
}
-
- $hostlist .= "<option value=\"$thishost\"$selected>$thishost\n";
-
+
+ $hostlist .= "<option value=\"$thishost\"$selected>$thishost\n" unless ($data->{status}->[0] =~ /^unlisted/);
+
# collect summary info
foreach $key (keys(%summaryattrs)) {
- $summary{$thishost}{$key} = $data->{$key}->[0];
+ if (exists $summarylistitems{$key}) {
+ my $v = item_uplist($data->{$key});
+ $summary{$thishost}{$key} = $v if defined $v;
+ } else {
+ $summary{$thishost}{$key} = $data->{$key}->[0];
+ }
}
-
+
$summary{$thishost}{hostname} = undef;
foreach my $hostname (@{$data->{hostname}}) {
$summary{$thishost}{hostname} .= sprintf("%s<a href=\"machines.cgi?host=%s\">%s</a>", ($summary{$thishost}{hostname} ? '<br>' : ''), $summary{$thishost}{host}, $hostname);
} else {
# display summary info
$hostdetails = "<h1>Summary</h1>\n";
- $hostdetails .= "<table border=\"1\" width=\"90%\">\n<tr>";
+ $hostdetails .= "<table id=\"machines\" class=\"tablesorter\" border=\"1\" cellpadding=\"0\" cellspacing=\"1\">\n<thead>\n<tr>";
foreach $key (@summaryorder) {
if ($sortby ne $key) {
- $hostdetails .= "<th><a href=\"machines.cgi?sortby=$key&sortorder=asc\">$summaryattrs{$key}</a></th>";
+ $hostdetails .= "<th><a class=\"sort\" href=\"machines.cgi?sortby=$key&sortorder=asc\">$summaryattrs{$key}</a></th>";
} else {
if ($sortorder ne "dsc") {
- $hostdetails .= "<th><a href=\"machines.cgi?sortby=$key&sortorder=dsc\">$summaryattrs{$key}</a></th>";
+ $hostdetails .= "<th><a class=\"sort\" href=\"machines.cgi?sortby=$key&sortorder=dsc\">$summaryattrs{$key}</a></th>";
} else {
- $hostdetails .= "<th><a href=\"machines.cgi?sortby=$key&sortorder=asc\">$summaryattrs{$key}</a></th>";
+ $hostdetails .= "<th><a class=\"sort\" href=\"machines.cgi?sortby=$key&sortorder=asc\">$summaryattrs{$key}</a></th>";
}
}
}
- $hostdetails .= "</tr>\n";
+ $hostdetails .= "</tr>\n</thead>\n<tbody>\n";
my @sorted;
if ($sortorder eq "asc") {
@sorted = sort {($summary{$b}->{$sortby} cmp $summary{$a}->{$sortby}) || ($summary{$a}->{'host'} cmp $summary{$b}->{'host'})} keys(%summary)
}
foreach $host (@sorted) {
+ next if $summary{$host}{status} =~ /^unlisted/;
$hostdetails .= "<tr>";
foreach $key (@summaryorder) {
$hostdetails .= "<td>$summary{$host}{$key} </td>";
}
$hostdetails .= "</tr>\n";
}
- $hostdetails .= "</table>\n";
+ $hostdetails .= "</tbody>\n</table>\n";
}
# Finally, we can write the output... yuck...