NAME
    CTKlib - Command-line ToolKit library (CTK). Command line interface (CLI)

VERSION
    Version 1.01
    
    $Id: README 36 2012-11-21 14:04:44Z minus $

SYNOPSIS
    
    use CTK;

    use CTK qw/ ...TAGS... /
    
    use CTK qw/ ...VARIABLES, FUNCTIONS AND PROCEDURES... /
    

ABSTRACT
    Проект CTKlib содержит несколько библиотек работы с механизмами обслуживающие командную строку
    
    SVN: http://svn.serzik.ru/CTKlib/trunk
         svn co http://svn.serzik.ru/CTKlib/trunk CTKlib


DESCRIPTION

The project ... blah-blah-blah

Библиотека, призванная объеденить в себе основной инструментарий для создания роботов. 
CTK включает в себя механиз работы с командной строкой, отправки почты, соединения с БД, 
соединения с HTTP/FTP/SSH и прочими серверами с целью передачи информации и выполнения удаленных 
команд... и много-много других утилит, встроенных в один проект, который достаточно использовать 
с помощью вызова use CTK

CTK состоит из 2-х ветвей - из утилитарной (процедурной) и функциональной (объектной). Утилитарная 
ветвь обеспечивает доступ к часто используемым функциям, которые можно условно разделить на группы.
Это функции работы с датой и временем, функции конвертирования форматов, базовые функции работы с 
файлами и директориями, а также другие функции, которые всегда можно найти в пакете CTK::Util.

Функциональная ж ветвь, позволяет оперировать макрообъектами, каждый условный класс таких объектов
носит свое имя: CTK::Arc (работа с архивами), CTK::File (работа с файлами), CTK::Net (работа с сетевыми
ресурсами) и т.д. Все методы этих классов вызываются через главный объект CTK: $c? например:

    package main;
    use CTK qw/ $DATADIR /
    ...
    1;
    package my::mainlib;
    my $c = new CTK; # Строим главный объект
    ...
    $c->frm( -in => CTK::catfile($CTK::DATADIR,'in') );
    ...
    1;
    
В приведенном примере произойдет удаление содержимого каталога in в каталоге данных $CTK::DATADIR.

Импорт значения $CTK::DATADIR управляется в главном модуле машей программы или же при явном вызове, напроимер:

    package my::mainlib;
    use CTK qw/ $DATADIR /
    my $c = new CTK; # Строим главный объект
    ...
    $c->frm( -in => CTK::catfile($DATADIR,'in') );
    ...
    1;

VARIABLES, FUNCTIONS AND PROCEDURES

    Глобальные переменные

    $TM        - Счетчик времени
    $EXEDIR    - Директория где лежит вызываемый скрипт
    $DATADIR   - Директория для данных (пользовательский каталог)
    $CONFDIR   - Директория конфигурации (пользовательский каталог)
    $CONFFILE  - Главный конфигурационный файл
    $LOGDIR    - Директория где лежит логфайл
    $LOGFILE   - Сам файл лога
    %OPT       - Список опций командной строки
    @OPTSYSDEF - Список опций по умолчанию, можно переопределять пользователем
    
    Базовые функции
    
    say        - Функция say как в perl 6
    debug      - Отладка - экран и лог если установлены опции -ld или -d
    tms        - Таймштамп. Стандартный вывод времени
    exception  - Процедура обработки исключений
    testmode   - Функция возвращает результат тестового режима, используется в булевом контексте
    debugmode  - Функция возвращает результат режима отладки, используется в булевом и INT контексте
    logmode    - Функция возвращает результат режима логирования, используется в булевом контексте

TAGS
    
    ALL     - импортируются все глобальные переменные и все базовые функции
    
    BASE    - импортируются основные глобальные переменные и все базовые функции
    
    VARS    - импортируются все глобальные переменные
    
    FUNC, FUNCS, SUB, SUBS - импортируются все базовые функции

Пакетная работа с архивами
    
    fextract - извлечение файлов из архивов с двумя способами: внешним и внутренним.
    
    Внешний способ является приоритетным, т.к. снижает нагрузку на скрипт. Внешний способ базируется
    на системном вызове той программы, которая определяется по расширению файла архива.
    
    Внутренний способ более ресурсоемкий и хорош в случае когда имеется четкое представление какой
    архив подлежит обработке и насколько он велик.
    
    # Извлечение файлов внешним способом
    $c->fextract(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов архивов
            -out    => CTK::catfile($CTK::DATADIR,'out'), # путь к папке для извлеченных файлов
            -method => 'ext',           # Указатель что речь идет о внешнем извлечении, можно опустить
            -list   => qr/rar/,         # Маска (ругулярное выражение) на отбор файлов каталога IN
            -arcdef => $config->{arc},  # Секция определений из конфигурационного файла, Hashref
        );
        
    # Извлечение файлов внутренним способом
    $c->fextract(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов архивов
            -out    => CTK::catfile($CTK::DATADIR,'out'), # путь к папке для извлеченных файлов
            -method => 'zip',           # Указатель что речь идет о внешнем извлечении, можно опустить
            -list   => qr/zip/,         # Маска (ругулярное выражение) на отбор файлов каталога IN
            -arcdef => $config->{arc},  # Секция определений из конфигурационного файла, Hashref
        );        
        
    fcompress - сжатие файлов, внешним способом.
    
    # Сжатие файла внешним способом
    $c->fcompress(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов для сжатия
            -out    => CTK::catfile($CTK::DATADIR,'out','ttt.rar'), # Конечное имя файла архива
            -list   => qr//,           # Маска (ругулярное выражение) на отбор файлов каталога IN
            -arcdef => $config->{arc}, # Секция определений из конфигурационного файла, Hashref
        );
        
    Внутренний способ не реализован ввиду непрактичного использования.

Пакетная работа с файлами

    fsplit - Разрезание файлов по строкам. Используется только текстовый режим достпуа.
    
    Для того чтобы очень большие файлы разбивать на строки, существует функция fsplit, которая 
    сделает это! 
    
    $c->fsplit(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов для обработки
            -out    => CTK::catfile($CTK::DATADIR,'out'), # путь до итоговых файлов после обработки
            -n      => 100, # количество строк на которые необходимо разбивать файлы 
            -format => '[FILENAME]_%03d.[FILEEXT]', # Формат каждого итогового файла
            -list   => qr//, # Маска (ругулярное выражение) на отбор файлов каталога IN
        );

    fcopy, fcp - Копирование файлов
    
    $c->fcopy(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов для обработки
            -out    => CTK::catfile($CTK::DATADIR,'out'), # путь до итоговых файлов после обработки
            -format => '[FILE].copy', # Формат каждого итогового файла
            -list   => qr//, # Маска (ругулярное выражение) на отбор файлов каталога IN
        );
        
    fmove, fmv - Перенос файла
    
    $c->fmv(
            -in     => CTK::catfile($CTK::DATADIR,'in'),  # путь до файлов для обработки
            -out    => CTK::catfile($CTK::DATADIR,'out'), # путь до итоговых файлов после обработки
            -format => '[FILE].copy', # Формат каждого итогового файла
            -list   => qr//, # Маска (ругулярное выражение) на отбор файлов каталога IN
        );

    fdelete, fdel, frm - Удаление файла
    
    $c->frm(
            -in     => CTK::catfile($CTK::DATADIR,'in'), # путь до файлов для обработки
            -list   => qr//, # Маска (ругулярное выражение) на отбор файлов каталога IN
        );

Пакетная работа с удаленными сетевыми ресурсами

    Для работы с удаленными системами требуется хэш коннекта. Для работы с FTP такой хэш выглядит как:
    
    my %ftpct = (
        ftphost     => '192.168.1.1',
        ftpuser     => 'login',
        ftppassword => 'password',
        ftpdir      => '~/activa', #activa
        #ftpattr     => {},
    );
    
    my %httpct = (
        method     => 'GET',
        url        => 'http://yandex.ru/robots.txt',
        #login      => 'login',
        #password   => 'password',
        #utf8       => 1,
    );
    
    my %uaopt = (
        agent                   => "Mozilla/4.0",
        max_redirect            => 10,
        requests_redirectable   => ['GET','HEAD','POST'],
        keep_alive              => 1,
        env_proxy               => 1,
    );
    
    Далее по тексту будет использоваться он
        
    fetch, get, download - Получение файлов, их скачка
    
    $c->fetch(
            -connect  => {%ftpct},   # Данные соединения
            -protocol => 'ftp',      # Протокол работы, в частности, FTP
            -dir      => $DATADIR,   # Директория (полный путь) где будут лежать принятые файлы
            -cmd      => 'copyuniq', # Команда: copy / copyuniq / move / moveuniq
            -mode     => 'bin',      # Режим доступа к файлам: ascii / binary (bin) 
            -list     => qr//,       # Маска (ругулярное выражение) на отбор файлов из источника
        );

    my $stat = $c->fetch(
            -connect  => {%httpct},  # Данные соединения
            -uaopt    => {%uaopt},   # Опции UserAgent (необязательны)
            -protocol => 'http',     # Протокол работы, в частности, HTTP, может быть HTTPS
            -dir      => $DATADIR,   # Директория (полный путь) где будут лежать принятые файлы (необязательно)
            #-file    => '123.html', # Имя файла (необязательно)
            #-uacode  => sub { },    # Исполняемый код для обэекта LWP::UserAgent (первый параметр)
            #-reqcode => sub { },    # Исполняемый код для обэекта HTTP::Request (первый параметр)
            #-rescode => sub { },    # Исполняемый код для обэекта HTTP::Response (первый параметр)
        );
    debug("STATUS: ",$stat); 
    
    # Простой способ получения текстовых страниц сайтов
    my $html = $c->fetch(
            -connect  => {
                    method     => 'GET',
                    url        => 'http://yandex.ru/robots.txt',
                },
            -protocol => 'http',
            #-utf8     => 1,
        );
    debug("DATA:\n\n",$html,"\n");

    Если опустить имя файла и директорию, то вывод будет передан в переменную $stat.
    
    ВАЖНОЕ ЗАМЕЧАНИЕ!!! Этот путь приема (скачивания) файлов работает только с небольшими файлами,
    для загрузки больших объемов лучим решением будет использование сторонних программ, таких как 
    wget, fetch, lwp-download и других аналогов.
    
    Наглядным примером использования uacode, reqcode и rescode, будет вывод заголовков сл. образом:
    
        -rescode => sub { debug(CTK::Net::_debug_http(@_))  },
        
    Функция CTK::Net::_debug_http возвращает подробную информацию о запросе.
        
    Команды бывают:
    
    copy        - Копирование файла
    copyuniq    - Копирование только уникальных файлов
    move        - Перемещение файла
    moveuniq    - Перемещение только уникальных файлов
    
    store, put, upload - Отправка файлов, их загрузка
    
    $c->store(
            -connect  => {%ftpct},   # Данные соединения
            -protocol => 'ftp',      # Протокол работы, в частности, FTP
            -dir      => $DATADIR,   # Директория (полный путь) где лежат файлы для отправки
            -cmd      => 'copyuniq', # Команда: copy / copyuniq / move / moveuniq
            -mode     => 'bin',      # Режим доступа к файлам: ascii / binary (bin) 
            -file     => 'sg1.bat',  # Список или имя файлов или маска отбора
        );

Работа с базами данных и хранилищами

    Для работы необходимо подключить модуль CTK::DBI в том пакете, откуда будут производиться вызовы.
        
    # Соединение с БД mysql
    my $oracle = new CTK::DBI(
            -dsn  => 'DBI:mysql:database=mvcskel;host=192.168.100.1',
            -user => 'login',
            -pass => 'password',
        );
    debug($oracle->field("select sysdate() from dual"));
    
    # Соединение с БД Oracle
    if (testmode) {
        my $oracle = new CTK::DBI(
            -dsn  => $config->{oracle}{prodt}{dsn},
            -user => $config->{oracle}{prodt}{user},
            -pass => $config->{oracle}{prodt}{password},
        );
        debug($oracle->field("select sysdate from dual"));
    }

Отправка писем
    
    my $send = CTK::sendmail(
        -to         => (testmode() ? $config->{sendmail}{testmail} : $config->{sendmail}{to}),
        -cc         => $config->{sendmail}{cc},
        -from       => $config->{sendmail}{from},
        -type       => $config->{sendmail}{type},
        -smtp       => $config->{sendmail}{smtp},
        -subject    => 'моя тема',
        -message    => 'мое сообщение',
        -attach => [ 
                {Type=>'text/plain', Path=>$CTK::LOGFILE, Filename=>'log.txt', Disposition=>'attachment',},
                {Type=>'text/plain', Data=>'document 1 content', Filename=>'doc1.txt', Disposition=>'attachment',},
                {Type=>'text/plain', Data=>'document 2 content', Filename=>'doc2.txt', Disposition=>'attachment',},
            ],
    );
    debug($send ? 'письмо ушло :)' : 'письмо НЕ ушло :(');

Шифрование и защины, криптография

    gpg_decript - Дешифрование файлов с помощью утилиты GPG (GnuPG)

    Сайт проекта: http://www.gnupg.org/ (GPG4Win - http://gpg4win.org/)
    
    Дешифрование ведется по уже установленным файлам ключей
    
    $c->gpg_decript(
            -in      => CTK::catfile($DATADIR,'in','test.txt.asc'), # путь до файлов для рашифровки
            -out     => CTK::catfile($DATADIR,'out','test.txt'),    # путь до файла после обработки
            -gpghome => '', # ЗАРЕЗЕРВИРОВАНО
            -certdir => '', # путь до каталога с сертификатами. По умолчанию каталог ./data/cert
            -pubkey  => '', # Путь до файла публичного (открытого) ключа. По умолчанию ./data/cert/public.key
            -privkey => '', # Путь до файла приватного (закрытого) ключа. По умолчанию ./data/cert/private.key
            -pass    => '', # Пароль для закрытого ключа. По умолчанию - спросит
        );

Работа с командной строкой

    cli_prompt - Вызов командной строки, запрос на ввод строкойвой переменной
    
    my $v = $c->cli_prompt('Your name:', 'anonymous');
    debug( "Your name: $v" );

    Первым параметром указывается приглашение, вторым - значение по умолчанию
    
    cli_prompt3 - Вызов cli_prompt последовательно 3 раза для целей корректного введения значения
    
    my $v = $c->cli_prompt3('Your name:');
    debug( "Your name: $v" );
    
    Первым параметром указывается приглашение, вторым - значение по умолчанию
    
    cli_select - Вызов спсика для выбора значения из него. Используется таже командная строка но 
    с той лишь разницей что ожидается определенное значение из предложенного списка этих значений
    
    my $v = $c->cli_select('Your select:',[qw/foo bar baz/],'bar');
    debug( "Your select: $v" );
    
    Первым параметром указывается строка приглашения на ввод значения, вторым параметром - ссылка на
    массив содержащий список значений и третий параметр - значение по умолчанию.

    cli_select3 - Вызов cli_select последовательно 3 раза для целей корректного введения значения
    
    my $v = $c->cli_select3('Your select:',[qw/foo bar baz/],'foo');
    debug( "Your select: $v" );
    
    Первым параметром указывается строка приглашения на ввод значения, вторым параметром - ссылка на
    массив содержащий список значений и третий параметр - значение по умолчанию.


EXAMPLES

Статья по Moose: http://ni-al.ru/index.php/Perl::Moose::Conept

ENVIRONMENT
    No environment variables are used.

BUGS
    Please report them.

SEE ALSO
    "Perl", ...

DIAGNOSTICS
    The usual warnings if it cannot read or write the files involved.

HISTORY
    See CHANGES file

TODO
    See TODO file

LICENSE
    See LICENSE file

THANKS
    Thanks to me for ...

AUTHOR
    Serz Minus (Lepenkov Sergey) http://serzik.ru <minus@mail333.com>.

COPYRIGHTS
    Copyright (C) 1998-2012 D&D Corporation. All Rights Reserved

