Allow linker to specify modules to search
[webmin.git] / webmin_search.cgi
1 #!/usr/local/bin/perl
2 # Search Webmin modules and help pages and text and config.info
3
4 $trust_unknown_referers = 1;
5 BEGIN { push(@INC, ".."); };
6 use WebminCore;
7
8 &init_config();
9 do 'webmin-search-lib.pl';
10 &ReadParse();
11
12 $prod = &get_product_name();
13 $ucprod = ucfirst($prod);
14 &ui_print_unbuffered_header(
15         undef, &text('wsearch_title', $ucprod), "", undef, 0, 1);
16
17 # Validate search text
18 $re = $in{'search'};
19 if ($re !~ /\S/) {
20         &error($text{'wsearch_esearch'});
21         }
22 $re =~ s/^\s+//;
23 $re =~ s/\s+$//;
24
25 # Do the search
26 print &text('wsearch_searching', "<i>".&html_escape($re)."</i>"),"\n";
27 @rv = &search_webmin($re, \&print_search_dot,
28                      $in{'mod'} ? [ split(/\0/, $in{'mod'}) ] : undef);
29 print &text('wsearch_found', scalar(@rv)),"<p>\n";
30
31 # Show in table
32 if (@rv) {
33         print &ui_columns_start(
34                 [ $text{'wsearch_htext'}, $text{'wsearch_htype'},
35                   $text{'wsearch_hmod'}, $text{'wsearch_hcgis'} ], 100);
36         foreach my $r (@rv) {
37                 $hi = &highlight_text($r->{'text'});
38                 if ($r->{'link'}) {
39                         $hi = "<a href='$r->{'link'}'>$hi</a>";
40                         }
41                 @links = ( );
42                 foreach my $c (@{$r->{'cgis'}}) {
43                         ($cmod, $cpage) = split(/\//, $c);
44                         ($cpage, $cargs) = split(/\?/, $cpage);
45                         $ctitle = &cgi_page_title($cmod, $cpage) || $cpage;
46                         if ($r->{'mod'}->{'installed'}) {
47                                 $cargs ||= &cgi_page_args($cmod, $cpage);
48                                 }
49                         else {
50                                 # For modules that aren't installed, linking
51                                 # to a CGI is likely useless
52                                 $cargs ||= "none";
53                                 }
54                         if ($cargs eq "none") {
55                                 push(@links, $ctitle);
56                                 }
57                         else {
58                                 $cargs = "?".$cargs if ($cargs ne '' &&
59                                                         $cargs !~ /^(\/|%2F)/);
60                                 push(@links,
61                                    "<a href='$cmod/$cpage$cargs'>$ctitle</a>");
62                                 }
63                         }
64                 if (@links > 2) {
65                         @links = ( @links[0..1], "..." );
66                         }
67                 print &ui_columns_row([
68                         $hi,
69                         $text{'wsearch_type_'.$r->{'type'}},
70                         "<a href='$r->{'mod'}->{'dir'}/'>$r->{'mod'}->{'desc'}</a>",
71                         &ui_links_row(\@links),
72                         ]);
73                 }
74         print &ui_columns_end();
75         }
76 else {
77         print "<b>",&text('wsearch_enone',
78                 "<tt>".&html_escape($re)."</tt>"),"</b><p>\n";
79         }
80
81 &ui_print_footer();
82
83 # print_search_dot()
84 # Print one dot per second
85 sub print_search_dot
86 {
87 local $now = time();
88 if ($now > $last_print_search_dot) {
89         print ". ";
90         $last_print_search_dot = $now;
91         }
92 }
93