#!/usr/bin/perl
#===============================================================================
#  DESCRIPTION:  Простая отправлялка вывода команды или тела файла на pastebin. Определяет подсветку
#                для некоторых видов указанных через -i файлов.
#
#        USAGE:  cat file.txt | pastebinput.pl или pastebinput.pl -i file.txt
#
#      OPTIONS:  -i <input_file>; -u <server_url>; -s <syntax>; -e <expire=[f,m,d]>; -r <remember=[0,1]>; -n <name>
#       AUTHOR:  dimio
#          URL:  http://www.dimio.org
#      VERSION:  0.9
#      CREATED:  2010-01-31
#===============================================================================
require 5.8.8;
use warnings;
use strict;
use encoding 'utf8', STDOUT => 'utf8';
use LWP::UserAgent;
use HTTP::Cookies;
use Getopt::Std;
our $VERSION = '0.9';

my %options = (                                             # Настройки по умолчанию:
    'u'     => 'http://pastebin.com',                       # адрес сервера
    'e'     => 'd',                                         # срок хранения: d - день, m - месяц, f - постоянно
    'r'     => 0,                                           # помнить ли отправителя
);
getopts('s:u:e:i:n:rh', \%options);

if ($options{h}) {
    usage($VERSION);
    exit;
}

if ( $options{i} && !$options{s} ) {
    simple_sintax_detect(\%options);
}
my $msg_body = read_input_file(\%options);


my $ua = ua_init();
my $msg_url = send_to_pastebin($ua, \%options, $msg_body);
print $msg_url,"\n";


exit 0;


sub simple_sintax_detect {
    my $options = shift;

    my $f_ext = $1 if $options->{i} =~ /^[\wа-я-]+\.([a-z]{1,4})$/i;

    if ($f_ext =~ /^(?:txt|text|)$/i) {
        $options->{s} = 'text';
    }
    elsif ($f_ext =~ /^(?:pl|cgi)$/i) {
        $options->{s} = 'perl';
    }
    elsif ($f_ext =~ /^sh$/i) {
        $options->{s} = 'bash';
    }
    elsif ($f_ext =~ /^php$/i) {
        $options->{s} = 'php';
    }
}

sub read_input_file {
    my $options = shift;

    if ( !$options->{i} ) {
        while (<>) {
            $msg_body .= $_;
        }
    }

    elsif ( $options->{i} ) {
        open(INFILE, '<', $options->{i}) or die "Can't open $options->{i}: $!\n";
        while (<INFILE>) {
            $msg_body .= $_;
        }
        close(INFILE);
    }

    return $msg_body;
}

sub send_to_pastebin {
    my $ua = shift;
    my ($options, $msg_body)  = @_;

    my $response = $ua->post( $options->{u},
        [
            format      => $options->{s},
            code2       => $msg_body,
            poster      => $options->{n},
            paste       => 'Send',
            remember    => $options->{r},
            expiry      => $options->{e},
        ],
    );
    return $response->status_line unless $response->is_success;

    return $response->request->uri;
}

sub ua_init {

    my $cookies=HTTP::Cookies->new('file'=>'./cookies.lwp','autosave'=>0);

    my $ua = LWP::UserAgent->new(
        'agent'                 => 'pastebinput - pastebin service agent; dimio@dimio.org',
        'cookie_jar'            => $cookies,
        'requests_redirectable' => ['GET', 'POST'],
    );

    $ua->default_header(
        'Accept'            => 'text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1',
        'Accept-Charset'    => 'utf-8; *;q=0.1',
        'Accept-Language'   => 'ru,en-us;q=0.7,en;q=0.3',
        'Accept-Encoding'   => 'deflate, gzip, x-gzip, *;q=0',
    );

    return $ua;
}

sub usage {
    my $ver = shift;

print <<EOF;
    pastebinput ver. $ver

    Использование: pastebinput [КЛЮЧ]... <-i input_file> (1-я форма)
              или: COMMAND | pastebinput                 (2-я форма)

    В первой форме на сервер будет отправлен указанный файл input_file.
    Во второй форме на сервер будет отправлен результат вывода COMMAND.

    Ключи:
            -s  [text, perl, ...]      Синтаксис файла для подсветки на pastebin;
            -u  [http://server.com]    URL сервера (для отличных от pastebin.org);
            -e  [d, m, f]              Срок хранения данных на сервере:
                                       d - один день, m - месяц, f - постоянно;
            -i  [input_file]           Имя входящего файла, текст которого будет
                                       отправлен на pastebin сервер;
            -n  [username]             Имя отправителя (иначе - anonimous);
            -r                         Помнить отправителя (если установлена);
            -h                         Вывод данной справки и завершение программы;

    Пример использования: pastebinput -r -s perl -e m -n User -i ./test.pl
EOF
}