Handle hostnames with upper-case letters
[webmin.git] / software / tree.cgi
1 #!/usr/local/bin/perl
2 # tree.cgi
3 # Display the package tree
4
5 require './software-lib.pl';
6 &ui_print_header(undef, $text{'index_tree'}, "");
7
8 $spacer = " "x3;
9
10 # work out the package heirarchy..
11 $n = &list_packages();
12 for($i=0; $i<$n; $i++) {
13         push(@pack, $packages{$i,'name'});
14         push(@vers, $packages{$i,'version'});
15         push(@svers, $packages{$i,'shortversion'} ||
16                      $packages{$i,'version'});
17         push(@class, $packages{$i,'class'});
18         push(@desc, $packages{$i,'desc'});
19         }
20 @order = sort { lc($pack[$a]) cmp lc($pack[$b]) } (0 .. $n-1);
21 $heir{""} = "";
22 foreach $c (sort { $a cmp $b } &unique(@class)) {
23         if (!$c) { next; }
24         @w = split(/\//, $c);
25         $p = join('/', @w[0..$#w-1]);           # parent class
26         if (!defined($heir{$p})) {
27                 $pp = join('/', @w[0..$#w-2]);  # grandparent class
28                 $heir{$pp} .= "$p\0";
29                 $ppp = join('/', @w[0..$#w-3]); # great-grandparent class
30                 if ($ppp || 1) {
31                         $heir{$ppp} .= "$pp\0";
32                         }
33                 }
34         $heir{$p} .= "$c\0";
35         $hasclasses++;
36         }
37
38 # get the current open list
39 %heiropen = map { $_, 1 } &get_heiropen();
40 $heiropen{""} = 1;
41
42 # traverse the heirarchy
43 print "<table width=100%>\n";
44 &traverse("", 0);
45 print "</table>\n";
46 if ($hasclasses) {
47         print "<a href=closeall.cgi>$text{'index_close'}</a>\n";
48         print "<a href=openall.cgi>$text{'index_open'}</a><p>\n";
49         }
50
51 &ui_print_footer("", $text{'index_return'});
52
53 sub traverse
54 {
55 local($s, $act, $i);
56
57 # Show the icon and class name
58 print "<tr> <td>", $spacer x $_[1];
59 if ($_[0]) {
60         print "<a name=\"$_[0]\"></a>\n";
61         $act = $heiropen{$_[0]} ? "close" : "open";
62         print "<a href=\"$act.cgi?what=",&urlize($_[0]),"\">";
63         $_[0] =~ /([^\/]+)$/;
64         print "<img border=0 src=images/$act.gif></a>&nbsp; $1</td>\n";
65         }
66 else {
67         print "<img src=images/close.gif> <i>$text{'index_all'}</i></td>\n";
68         }
69
70 print "<td><br></td> </tr>\n";
71 if ($heiropen{$_[0]}) {
72         # print packages followed by sub-folders
73         foreach $i (@order) {
74                 if ($class[$i] eq $_[0]) {
75                         print "<tr> <td nowrap>", $spacer x ($_[1]+1);
76                         print "<img border=0 src=images/pack.gif></a>&nbsp;\n";
77                         print "<a href=\"edit_pack.cgi?package=",
78                               &urlize($pack[$i]),"&version=",
79                               &urlize($vers[$i]),"\">",&html_escape($pack[$i].
80                               ($svers[$i] ? " $svers[$i]" : "")),"</a></td>\n";
81                         print "<td>",&html_escape($desc[$i]),"</td>\n";
82                         print "</tr>\n";
83                         }
84                 }
85         foreach $s (&unique(split(/\0+/, $heir{$_[0]}))) {
86                 &traverse($s, $_[1]+1);
87                 }
88         }
89 }
90