#!/usr/bin/perl # Filename: grml-tips # Purpose: query a signature file for a specific keyword and display results # Authors: grml-team (grml.org), (c) Michael Prokop , (c) Alexander Wirt # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. ################################################################################ use strict; use Pod::Usage; use feature 'say'; use Term::ReadKey; use Time::HiRes; use LWP::UserAgent; use Getopt::Long; =head1 NAME B - query a signature file for a specific keyword and display results =head1 SYNOPSIS B [OPTION] I =head1 DESCRIPTION This manual page documents briefly the B command. =head1 OPTIONS =over 8 =item B<--help> Print this help and exit. =item B<--tagsonly> Match on tags only instead of the whole tip =item B<--tipsfile TIPSFILE> Use TIPSFILE instead of /usr/share/grml-tips/grml_tips =back =head1 EXAMPLES =over 8 =item B I Query grml-tips file for tips / hints including keyword "ntfs". =item B I<.> Display all available B at once. =back =head1 FILES /usr/share/grml-tips/grml_tips Signature file containing the tips. =head1 SEE ALSO L =head1 AUTHOR grml-tips was written by Alexander Wirt =cut my $grml_tips = '/usr/share/grml-tips/grml_tips'; my $help; my $tagsonly; my $tipsfile; my $result = GetOptions ( "help" => \$help, "tagsonly" => \$tagsonly, "tipsfile=s" => \$grml_tips, ); my $pattern = shift; #help if pattern is missing; pod2usage( { -message => 'No search pattern provided', -exitval => -1, } ) unless $pattern; #help if help is wanted pod2usage() if $help; my @tips; if ( !open( my $fh, '<', "$grml_tips" ) ) { say STDERR "Error: File \"$grml_tips\" not found."; say STDERR "Exiting."; exit -1; } else { my $tip = ''; my $tips_found = 0; while ( my $line = <$fh> ) { if ( $line !~ /^-- $/ ) { $tip .= $line; } else { my $header = "Grml Tip Number $tips_found\n"; my $line = "-" x ( length($header) - 1 ) . "\n\n"; $tips_found++; if ($tagsonly) { #extract tags from tip my ($tag) = $tip =~ /^Tags: (.*)$/m; my @tags = split(/[, ]+/, $tag); if (grep(/^$pattern$/i, @tags) ) { push @tips, $header . $line . $tip . "\n"; } $tip = ''; } else { if ( $tip =~ /$pattern/mi ) { push @tips, $header . $line . $tip . "\n"; $tip = ''; } else { $tip = ''; } } } } close($fh); } if (@tips) { if ( !open( my $fh, '|-', 'less -FRX' ) ) { say @tips; } else { say $fh @tips; } } else { say "Sorry, could not find a tip for '$pattern'. :-(\n\n", "Do you want to submit the keyword '$pattern' to grml's keyword database?\n", "The grml team will write tips for the most requested and useful keywords.\n", "To use and contribute to this feature you'll need a working networking connection.\n", "No personal data will be transmitted to the database.\n\n", "Send \"$pattern\" to grml's keyword database? [y|N] "; ReadMode 4; # Turn off controls keys my $x; while ( not defined( $x = ReadKey(-1) ) ) { Time::HiRes::sleep(0.5); } ReadMode 0; # Reset tty mode before exiting print "\n\n"; if ( $x =~ /(y|j)/i ) { my $version; if ( -f '/etc/grml_version' ) { open( my $fh, '<', '/etc/grml_version' ) or die "Could not open /etc/grml_version: $!"; $version = <$fh>; chomp $version; close($fh); } elsif ( -f '/etc/debian_version' ) { open( my $fh, '<', '/etc/debian_version' ) or die "Could not open /etc/debian_version: $!"; $version = <$fh>; chomp $version; close($fh); } else { $version = 'unknown'; } my $ua = new LWP::UserAgent; $ua->agent("grml-tips 0.0 "); # set the HTTP 'browser' type my $res = $ua->post( 'http://deb.grml.org/~formorer/submissions/keyword.cgi', [ 'version' => $version, 'keyword' => $pattern ], ); if ( $res->is_success ) { my $content = $res->decoded_content; if ( $content =~ /Submission received/ ) { say "Keyword '$pattern' has been submitted to grml's keyword database.\nThanks."; } else { say "Your pattern could not be submitted.\n", "Please file a bug against grml-tips at ", "http://bts.grml.org/\n", "Thanks!"; } } else { print "Could not submitt '$pattern': " . $res->status_line . "\n"; } } else { print "'$pattern' has not been sent to grml's keyword database as requested.\n"; print "If you want to submit a tip please mail it to tips\@grml.org - thank you!\n"; } } ## END OF FILE #################################################################