1 |
dpavlin |
1 |
#!/usr/bin/perl |
2 |
|
|
|
3 |
|
|
use warnings; |
4 |
|
|
use strict; |
5 |
|
|
|
6 |
|
|
my $recepies = '/srv/sysadmin-cookbook/recepies'; |
7 |
|
|
|
8 |
|
|
use File::Find; |
9 |
|
|
use File::Slurp; |
10 |
|
|
|
11 |
|
|
my $in_ul = 0; |
12 |
|
|
|
13 |
|
|
my @html; |
14 |
|
|
sub html { push @html, @_ } |
15 |
|
|
|
16 |
|
|
my %escape = ('<'=>'<', '>'=>'>', '&'=>'&', '"'=>'"'); |
17 |
|
|
my $escape_re = join '|' => keys %escape; |
18 |
|
|
|
19 |
|
|
sub file { |
20 |
|
|
my $path = shift; |
21 |
|
|
my $content = read_file $path; |
22 |
|
|
$content =~ s{[\n\r\s]+$}{}s; |
23 |
|
|
$content =~ s/($escape_re)/$escape{$1}/gs; |
24 |
|
|
return $content; |
25 |
|
|
} |
26 |
|
|
|
27 |
|
|
my @names; |
28 |
|
|
find({ follow => 0, no_chdir => 1, wanted => sub { |
29 |
|
|
push @names, $_ unless m{/\.}; |
30 |
|
|
}}, $recepies ); |
31 |
|
|
|
32 |
|
|
foreach my $path ( sort @names ) { |
33 |
|
|
|
34 |
|
|
my $name = $path; |
35 |
|
|
$name =~ s{^$recepies/*}{}; |
36 |
|
|
|
37 |
|
|
if ( -d $path ) { |
38 |
|
|
html "</ul>" if $in_ul++; |
39 |
|
|
html "<h1>$name</h1><ul>"; |
40 |
|
|
} elsif ( -l $path ) { |
41 |
|
|
my $to = readlink $path; |
42 |
|
|
html "<li>$name</li>"; |
43 |
|
|
} else { |
44 |
|
|
html "<li>$name<pre>", file( $path ), "</pre></li>"; |
45 |
|
|
} |
46 |
|
|
|
47 |
|
|
}; |
48 |
|
|
|
49 |
|
|
html "</ul>" if $in_ul; |
50 |
|
|
|
51 |
|
|
print qq| |
52 |
|
|
<html><head> |
53 |
|
|
<title>Sysadmin Cookbook</title> |
54 |
|
|
<!-- |
55 |
|
|
<link type=text/css rel=stylesheet href="style.css"> |
56 |
|
|
--> |
57 |
|
|
<style type=text/css> |
58 |
|
|
pre { |
59 |
|
|
background: #eee; |
60 |
|
|
} |
61 |
|
|
</style> |
62 |
|
|
</head><body> |
63 |
|
|
| |
64 |
|
|
, join("\n", @html) |
65 |
|
|
, "</body></html>" |
66 |
|
|
; |
67 |
|
|
|