Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Хочу сделать, но не знаю как


Автор: wolter 29.1.2008, 13:13
Вот хочу написать такую программу которая будет работать с компа

клиенская часть:
1. Заходим в оприделенную папку(саму проверку на наличие нового файла делаем примерно каждые 5 минут)
2. смотрим если в ней появился новый фаил то
3. Поверяем устоновленно соедиение через подем с инетом и если инет вообще
4. если да то берей этот фаил и выкладым в папку на www.mysite.com/obmen
5. и отключаемся от инета (если он диалапный)
6. Если инета нет, то делаем подключение через модем и возврощяемся к 3 делаем до пункта 5
7. Опять возврощаемся к 1

Серверная часть:
1. С переодичность кадые 5 минут заходи на www.mysite.com/obmen
2. проверяем если там есть новые файлы то
3. сохронаем его на локальный диск
4. удаляем фаил с www.mysite.com/obmen
5. Опять возврощаемся к 1

 smile  smile  smile 

Буду очень признателен за пример и комеентарии к ниму

Убедительная проздба, ОТЦЫ ПЕРЛА, не судите мой вопрос сильно строго, ибо я только учусь smile , а как известно учиться лучше всего на практике.

Автор: nitr 29.1.2008, 22:42
wolter, лучше бы разбили данный вопрос на несколько smile (т.е. вопрос = ваш пункт).
А так - очень похоже на "скрипт за деньги" ;)

Давайте по пунктам, проверка на новый файл, можно или сохранять "какие файлы в данной папке сейчас", потом сверять. Как хранить - тут тоже много советовать можем.
Установка соединения - зависит от настроек ОС. От перла только передача при соединении. А как выкладывать - можно фтп.
Практически тоже самое с серверной частью.

Добавлено через 2 минуты и 50 секунд
P.S.: читайте правила форума, тема должна отражать суть вопроса. А у вас...

Автор: wolter 29.1.2008, 23:15
Цитата(nitr @ 29.1.2008,  22:42)
wolter, лучше бы разбили данный вопрос на несколько smile (т.е. вопрос = ваш пункт).
А так - очень похоже на "скрипт за деньги" ;)

Давайте по пунктам, проверка на новый файл, можно или сохранять "какие файлы в данной папке сейчас", потом сверять. Как хранить - тут тоже много советовать можем.
Установка соединения - зависит от настроек ОС. От перла только передача при соединении. А как выкладывать - можно фтп.
Практически тоже самое с серверной частью.

Добавлено @ 22:45
P.S.: читайте правила форума, тема должна отражать суть вопроса. А у вас...

Отражаю суть вопросОВ

1 как перл заставить поднить инет по диалапу и соответсвенно отключаться от него под ВинХР???
2. как заставить перл допустим по ФТП заходить в определенную попку на хосте и смотреть повился там фаил и евляеться ли он свежим если да да как его оттуда забрать себе на комп???
3 опять же как фаил при помощи перла залить на хост по фтп протаколу?
Ну пока остоновися на этих трех вопросах )
Почему мой первый вориант разложен так по пунктам
потому что я решил задать все интиресуещие меня вопросы в одной темы а не развозить их на 5 разных тем.

Автор: GeoGeo 29.1.2008, 23:44
Что знаю , то отвечу , а вдруг поможет ;)

Код

3 опять же как фаил при помощи перла залить на хост по фтп протаколу?


Код

use Net::FTP;

$ftp = Net::FTP->new("ftp.myhost.ru", Debug => 0);   # открываем фтп
$ftp->login("LOGIN","PASSWORD") or die $ftp->message ; #Логинимся
$ftp->cwd("/obmen");  # Переходим в папку obmen
$ftp->put ("local_file","destination_file"); #что заливать , под каким именем залить.
$ftp->quit; # Прощаемся с сервером.


Автор: nitr 29.1.2008, 23:55
1. настраивается ОС, а не перл
2. разные способы есть, сейчас модули не приведу какие использовать, но можно, например, мд5 хеш хранить по каждому файлу.
3. можно использовать пример выше, а так perldoc Net::FTP

Автор: wolter 30.1.2008, 00:21
Цитата(GeoGeo @ 29.1.2008,  23:44)
Что знаю , то отвечу , а вдруг поможет ;)

Код

3 опять же как фаил при помощи перла залить на хост по фтп протаколу?


Код

use Net::FTP;

$ftp = Net::FTP->new("ftp.myhost.ru", Debug => 0);   # открываем фтп
$ftp->login("LOGIN","PASSWORD") or die $ftp->message ; #Логинимся
$ftp->cwd("/obmen");  # Переходим в папку obmen
$ftp->put ("local_file","destination_file"); #что заливать , под каким именем залить.
$ftp->quit; # Прощаемся с сервером.


Огромное СПАСИБО, вот это человек действительно помог  пример показал еще и закомментировал, еще раз спасибо тебе огромное

теперь есть еще 2 вопроса, как фаил удалить, а как проверить есть ли он там и как довно он там лежит ?

Автор: fray 30.1.2008, 00:23
Извените за невтему, хочу всё и сразу smile

Автор: wolter 30.1.2008, 00:32
Цитата(nitr @ 29.1.2008,  23:55)
1. настраивается ОС, а не перл
2. разные способы есть, сейчас модули не приведу какие использовать, но можно, например, мд5 хеш хранить по каждому файлу.
3. можно использовать пример выше, а так perldoc Net::FTP

1. Приведу пример, допустим выполняеться скрипт, он смотрит в папку на локальном диске и если видет там новый файлы ТО, ПОДКЛЮЧАЕТЬСЯ К НЕТУ, ПРОВЕРЯЕТ, ЕСТЬ ЛИ ИНЕТ, А ПОТОМ ОТСЫЛАЕТ ФАЙЛ И ОТКЛЮЧАЕТЬСЯ ОТ НЕТА.
2. А можно более подробнее (свежость файлов надо будет проверять и на локальном диске и на хосте по фтп)
3  Огромное спасибо GeoGeo этот вопрос решили, теперь как их оттуда удалять (чтени док по модулям даеться мне очень туго smile )

Добавлено через 12 минут и 16 секунд
Ура!!!
Я всетоки нашел в доке модуля как удолить фаил по фтп

Автор: KSURi 30.1.2008, 04:40
Цитата(wolter @  30.1.2008,  00:32 Найти цитируемый пост)
1. Приведу пример, допустим выполняеться скрипт, он смотрит в папку на локальном диске и если видет там новый файлы ТО, ПОДКЛЮЧАЕТЬСЯ К НЕТУ, ПРОВЕРЯЕТ, ЕСТЬ ЛИ ИНЕТ, А ПОТОМ ОТСЫЛАЕТ ФАЙЛ И ОТКЛЮЧАЕТЬСЯ ОТ НЕТА.


Имхо подключение/отключение реализуемо только на WinAPI. MSDN и Win32::API тебе в помощь)

Спросил у знакомого программиста, итак, в какую сторону тебе ковырять:
  • Ф-ии ответственные за операции с диалапом находятся в библиотеке rasapi.dll, прототипы ф-ий можно найти в заголовке ras.h
  • Проверить наличие активного соединения тебе поможет ф-ия BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved);.
Ниже пример в принципе тоже самое сделает, грубо говоря, но не так элегантно имхо) :
Код

use LWP::Simple;
print 'Connected to Internet' if head 'http://www.ru';

Теперь по поводу определения новых локальных файлов: писал я когда-то скрипт, который тоже должен был выполнять такой функционал. Собственно вырезка из моего кода (я там лишнее повырезал, но часть пришлось оставить в сабе startScan, чтобы смысл сохранить):
Код

# Функция создание таблицы хэшей
sub buildHashTable
{
    my $current = shift || $ROOT;
    
    # Рекурсивный обход всех директорий и файлов начиная с $ROOT
    opendir(DIR, $current) || die $!;
    while(my $entry = readdir DIR)
    {
        # Отбрасывание ненужных файлов
        next if $entry eq '.' || $entry eq '..';
        
        my $subCurrent = $current . _slash() . $entry;
        buildHashTable($subCurrent) if -d $subCurrent;
        
        # Записать пару файл=>хэш в файл-базу
        print BASE $subCurrent, '=>', calculateHash($subCurrent), "\n" if -f $subCurrent;
        next;
    }
    close DIR;
    
    1;
}

sub startScan
{
    my $path = shift || $ROOT;
    
    my $retval = 0;
    
    # Загружаем базу файлов
    loadHashTable(\my %base);
    
    # Рекурсивный обход всех директорий и файлов начиная с $ROOT
    opendir(DIR, $path) || die $!;
    while(my $entry = readdir DIR)
    {
        next if $entry eq '.' || $entry eq '..';
        
        my $subCurrent = $path . _slash() . $entry;
        startScan($subCurrent) if -d $subCurrent;
        
        # Если текущий хэш файла не соответсвует хэшу из базы, (т.е. файл изменен)
        # выполняем действие в зависимости от выбранной политики
        if(exists $base{$subCurrent})
        {
            unless($base{$subCurrent} eq calculateHash($subCurrent))
            {
                $retval++;
                &$ACTION($subCurrent);
            }
        }
        # Если файла нет в таблице -
        # выполняем действие в зависимости от выбранной политики
        else
        {
            $retval++;
            &$ACTION($subCurrent);
        }
    }
    close DIR;
    
    $retval;
}

sub calculateHash
{
    my $name = shift;
    
    open(FILE, $name) || die $!;
    binmode FILE;
    my $hash = Digest::MD5 -> new -> addfile(*FILE) -> hexdigest;
    close FILE;
    
    $hash
}

sub _slash { return $^O eq 'MSWin32' ? '\\' : '/' }

Определять новые файлы на удаленном FTP можно парсингом ответа метода ls из модуля Net::FTP.

Думаю все)

Автор: wolter 30.1.2008, 10:34
Честно. сказать, я не понял, как при помощи перла сделать диалап соединение, проверят работает ли оно, если не состялся дозвон то опять перезвонить и как потом его отключить

Можно подробнее об этом коде
use LWP::Simple;
print 'Connected to Internet' if is_success head 'www.ru';

Я только недавно начал, точнее сказать ПЫТАЮСЬ писать на перле, как я понял язык этот фактически безграничен smile 


И где мне найти библиотеку rasapi.dll
на копе, в стандартной поставке винды у меня ее нет

Автор: wolter 30.1.2008, 11:08
Попробовал вот такой код для дозвона
Код

  use Win32::API;
  $function = Win32::API->new(
      'rasapi.dll', 'sum_integers', 'II', 'I',
  );
  $return = $function->Call(3, 2);


Но не работает

Автор: Bulat 30.1.2008, 11:53
wolter, боюсь, что чем дальше, тем больше вопросов, и больше неработающих и неверно работающих кусков кода.

Во-первых Линкольн Д. Штайн "Разработка сетевых программ на Perl" тебе в помощь. А вот уже если и после этого + периодического копания в ресурсах интернета, дабы найти ответ на вопрос, что-то не будет получатся, то можно разобратся что и почему smile


Автор: wolter 30.1.2008, 12:37
Цитата(Bulat @ 30.1.2008,  11:53)
wolter, боюсь, что чем дальше, тем больше вопросов, и больше неработающих и неверно работающих кусков кода.

Во-первых Линкольн Д. Штайн "Разработка сетевых программ на Perl" тебе в помощь. А вот уже если и после этого + периодического копания в ресурсах интернета, дабы найти ответ на вопрос, что-то не будет получатся, то можно разобратся что и почему smile

Я понимаю что для Вас, проше всего меня культурно послать чем что чемто мне помочь, но Вы учтите тот небольшой факт, что я пришел сюда с вопрос уже ПОСЛЕ того как копался в нете и в перл доках (хотя английский я не знаю и что то понять там мне довольно сложно) и увидим что самостоятельно я с данным вопросом не спарвлюсь пришел уже сюда.

Автор: Bulat 30.1.2008, 12:48
wolter, все твои пункты из первого топика - функциональности, возможно на каждый из них многие смогут привести огромное количество примеров, но чтоб написать целостную программу нужно продумать ее логически. Дело не в "послать", а в том что тебя интересует лишь функциональность, сорри за тавтологию, поэтому тебе сложно разобратся со этими вопросами исходя из всего ресурса который есть в интернете. Лично я могу сказать, что большинство из написанного тобой в первом топике легко можно реализовать, если смотреть не только примеры, но еще и читать весь текст который вокруг. Но на это нужно время smile

Автор: wolter 30.1.2008, 12:55
Bulat, Я ниже отписал интиресующие меня вопросы, а именно
1. Как на ВинХр  при помощи перла поднять диалп соидинение с нетом, как его проверить и как отключиться от него
2. Как Проверить "новизну" файла на хосте через фтп и на локальном компьютере 

Автор: Bulat 30.1.2008, 13:02
Цитата(wolter @  29.1.2008,  13:13 Найти цитируемый пост)
1. Заходим в оприделенную папку(саму проверку на наличие нового файла делаем примерно каждые 5 минут)
2. смотрим если в ней появился новый фаил то


это один этап требующий изучения, довольно простой

Цитата(wolter @  29.1.2008,  13:13 Найти цитируемый пост)
3. Поверяем устоновленно соедиение через подем с инетом и если инет вообще


Цитата(wolter @  29.1.2008,  13:13 Найти цитируемый пост)
5. и отключаемся от инета (если он диалапный)
6. Если инета нет, то делаем подключение через модем и возврощяемся к 3 делаем до пункта 5


Очередной этап, более сложный

Цитата(wolter @  29.1.2008,  13:13 Найти цитируемый пост)
4. если да то берей этот фаил и выкладым в папку на www.mysite.com/obmen


Также отдельный этап, лично его я реализовывал с помощью протокла фтп, и если сам код программы писал, где-то сутки за полторы, но предварительное изучение фтп протокола всех его тонкостей, ньансов и комманд в конце концов, а также изучение методов модуля NEt::FTP, реализующих все эти команды, заняло у меня почти три недели smile В результате у меня довльно не плохая программа, позволяющая рассылать файлы на разные хосты(имена хостов, логины и пароли для доступа, имена файлов, пути на текущей машине и на удаленных хостах считываются из файлов), с полными провреками на коннект, наличие уже существующих файл с подобными именами, проверка на правельно указанные пути размещения файлов на удаленных хостах(существование директорий на указанных серверах) и т.п. Я могу тебе скинуть эту программу, но боюсь у тебя вопросов будет еще больше smile

Автор: PanamOS 30.1.2008, 14:16
Для реализации сетевого подключения информацию можно поискать http://forum.telenet.ru/index.php?showtopic=107906.
К перлу конечно относиться мало, но полезное узнать можно, а exec()/system() никто не отменял.
По поводу контроля свежести файлов реализацию вроде привел KSURi и даже подсказал в каком направлении копать  smile 

Автор: KSURi 30.1.2008, 15:42
Цитата(wolter @  30.1.2008,  10:34 Найти цитируемый пост)
И где мне найти библиотеку rasapi.dll
на копе, в стандартной поставке винды у меня ее нет

Если бы ее не было, вы бы не смогли устанавливать подключение к интернету через диалап. Находится она в недрах %WINDIR%\system32 скорее всего.

Цитата(wolter @  30.1.2008,  11:08 Найти цитируемый пост)
Попробовал вот такой код для дозвона
Код

  use Win32::API;
  $function = Win32::API->new(
      'rasapi.dll', 'sum_integers', 'II', 'I',
  );
  $return = $function->Call(3, 2);

Ну не удивительно) Вам надо импортировать ф-ии, которые были указаны в моем предыдущем посте. Описание их можно найти в заголовке rasapi.h, которого у вас действительно может не быть в стандартной поставке Windows. Однако, найти его на просторах Интернета не составит труда. Здесь вам поможет MSDN. WinAPI, на мой взгляд, придется использовать только для установки подключения к Интернет, о проверке наличие активного соединения читайте ниже.

Цитата(wolter @  30.1.2008,  10:34 Найти цитируемый пост)
Можно подробнее об этом коде
Код

use LWP::Simple;
print 'Connected to Internet' if head 'http://www.ru';

Можно: в первой строке подключается модуль LWP::Simple, во второй строке используются две ф-ии из него: is_succes, head. Если коротко, то мы просто пытаемся сделать запрос методом HEAD к серверу корневого домена RU зоны интернета, который доступен в 99.99% (естественно при наличии соединения с Интернет). Подробное описание ф-ии модуля LWP::Simple можно найти в одноименном разделе perldoc.

Добавлено @ 15:48
Ага, с WinAPI я пожалуй немного погорячился. Упоминание товарища PanamOS о ф-ях execи system вернуло меня на место) Я совершенно забыл о стандартной Windows команде rasdial.
Код

C:\>rasdial /?
Использование:
        rasdial элемент [пользователь [пароль|*]] [/DOMAIN:домен]
                [/PHONE:номерТелефона] [/CALLBACK:ответныйНомер]
                [/PHONEBOOK:файлАдреснойКниги] [/PREFIXSUFFIX]

        rasdial [элемент] /DISCONNECT

        rasdial

        Сведения о соблюдении конфиденциальности см. на веб-узле
        "http://go.microsoft.com/fwlink/?LinkId=34493"


C:\>

Вот что вам поможет)

Автор: wolter 30.1.2008, 20:10
KSURi, Огромное спасибо!!!!! это просто супер ))
Теперь возник другой вопрос как это заставить работать из перла и чтобы от отслеживал дозвонился модем или нет?

С этим разобрался
Код

use LWP::Simple;
print 'Connected to Internet' if head 'http://www.ru';

огромное спасибо за пояснение, сразу стало все понятно что и как )

Сего файла у меня действительно намише нету rasapi.dll, пробовал его найти через стандартный поиск, файлом с таким иминем нету, но я скачал его с нета, так что теперь он уже есть )


Цитата

Вам надо импортировать ф-ии, которые были указаны в моем предыдущем посте. Описание их можно найти в заголовке rasapi.h

Что такое ф-ии
И что за заголовок rasapi.h
??

Автор: KSURi 31.1.2008, 00:57
Цитата(wolter @  30.1.2008,  20:10 Найти цитируемый пост)
Что такое ф-ии

Нуу... Эээ... Даже не знаю, что вам ответить)


Цитата(wolter @  30.1.2008,  20:10 Найти цитируемый пост)
И что за заголовок rasapi.h

Это заголовок (header), в котором описаны прототипы ф-ий, которые в свою очередь хранятся в одноименной библиотеке. Все это уже относится к так называемому Windows API. Который кстати вам уже не нужен, т.к. были предложены альтернативные методы. Если хотите разбираться чисто в познавательных целях - гугель вам в помощь.

Автор: wolter 31.1.2008, 08:46
Цитата(KSURi @ 31.1.2008,  00:57)
Цитата(wolter @  30.1.2008,  20:10 Найти цитируемый пост)
Что такое ф-ии

Нуу... Эээ... Даже не знаю, что вам ответить)


Цитата(wolter @  30.1.2008,  20:10 Найти цитируемый пост)
И что за заголовок rasapi.h

Это заголовок (header), в котором описаны прототипы ф-ий, которые в свою очередь хранятся в одноименной библиотеке. Все это уже относится к так называемому Windows API. Который кстати вам уже не нужен, т.к. были предложены альтернативные методы. Если хотите разбираться чисто в познавательных целях - гугель вам в помощь.

Ну неужели нельзя было что ф-ии это сокрощение от функции

Автор: wolter 31.1.2008, 12:05
неужели никто не может привести пример работы перл скрипта с дозвоном по модему?? smile  smile  smile 

Автор: GeoGeo 31.1.2008, 19:23
Имхо, надо настроить систему , чтоб при попытке соединения с ФТП модем звонил провайдеру , а при простое ,допустим в две минуты , разрывал его .

Автор: wolter 1.2.2008, 11:55
Пока реализовал таким путем
Код


$function = `rasdial "inet" "optima" "optima"`;
print $function;



тоесть тупо используем настоенное под виндоей диалап соединение
Перл его запускает и модем начинает работать
Теперь есть новая проблемма
Как обробатать ответные данные от модема ибо пишет он их на кириле и вот в таком формате
Код

Установка связи с INET...
Проверка имени и пароля пользователя...
Регистрация компьютера в сети...
Установлена связь с INET.
Команда успешно завершена.

Вот это он выдает все и сразу
это вориант удочного соединения
Как мне обработать выходные данные??
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)