Russian Qt Forum

Qt => Работа с сетью => Тема начата: unkier от Май 26, 2011, 11:55



Название: автообновление по сети
Отправлено: unkier от Май 26, 2011, 11:55
хотелось бы иметь маленькую программулину, которая каждый раз при запуске лезет в сеть, смотрит какая версия основной проги последняя, качает если есть изменения, устанавливает и запускает основную прогу. короче автообновлялку.
есть ли что то готовое или в любой степени готовности ? может кто то для себя делал и готов заделится ?


Название: Re: автообновление по сети
Отправлено: Пантер от Май 26, 2011, 12:40
Я сейчас такую пишу, но она закрытая (для нашей конторы), так что поделиться не могу. :(


Название: Re: автообновление по сети
Отправлено: merke от Май 26, 2011, 12:43
ну вариантов множество. к примеру пишешь скрипт php который возвращает текущую версию программы, ты обращаешься к скрипту с помощью QNetworkAccessManager и получаешь версию программы, если она выше текущей, скачиваешь файл с сервера. Или ложишь на сервере файлик текстовый туда пишешь текущую версию программы, скачиваешь файлик смотришь версию и так далее.

Я очень давно выдерал функцию для проверки обновлений. можешь глянуть её.

Код
C++ (Qt)
void QSpeedTest::_checkForProgramUpdates()
{
   QNetworkAccessManager manager;
   QNetworkReply *download;
   QEventLoop loop;
   int remoteVersion;
 
   _w.slotLog(trUtf8("Checking online for an updated version of %1").arg(PROGRAMNAME));
   QTimer::singleShot(UPDATECHECKTIMEOUTSECS * 1000, &loop, SLOT(quit()));
   download = manager.get(QNetworkRequest(QUrl(PROJECTVERSIONURL)));    // From here on, download pointer does not require manual deletion!
   connect(download, SIGNAL(finished()), &loop, SLOT(quit()));
   loop.exec();
 
   if(download->isRunning() || download->error())
   {
       download->abort();
       _w.slotLog(trUtf8("Update site unreachable"));
       return;
   }
 
   if((remoteVersion = download->readLine().mid(1).toInt()) > PROJECTVERSION.mid(1).toInt())
   {
       _w.slotLog(trUtf8("%1 update available, remote version: r%2").arg(PROGRAMNAME).arg(remoteVersion));
       int reply = QMessageBox::question(&_w, trUtf8("Update available"), trUtf8("An updated version of %1 (r%2) is available online.").arg(PROGRAMNAME).arg(remoteVersion) + "\n\n" + trUtf8("Would you like to open the download page in your browser?"), QMessageBox::Yes, QMessageBox::No);
 
       if(reply == QMessageBox::Yes)
       {
           _w.slotLog(trUtf8("Opening download page %1").arg(PROJECTDOWNLOADURL));
           QDesktopServices::openUrl(QUrl(PROJECTDOWNLOADURL));
       }
   }
   else {
       _w.slotLog(trUtf8("You are using the latest version of %1").arg(PROGRAMNAME));
   }
}


Название: Re: автообновление по сети
Отправлено: pokidoff от Май 26, 2011, 12:46
Держи. В архиве исходники  и php скрипт. Прогу надо запускать перед стартом основной программы (что стартовать настраивается в инишнике см.архив), она обращается к скрипту на сервак (указывается в инишнике), тот смотрит в лежащую рядом с ним папку BIN, считывает CRC32 всех файлов в ней и отсылает проге в виде XML. Та в свою очередь сверяет CRC своих файлов с XML, и ежели чаго скачивает изменившийся файл.
Я у себя в локалке распространяю апдейтер в дистрибутиве, а он докачивает при первом старте все что нужно для основной проги. Интерфейс дружественный.


Название: Re: автообновление по сети
Отправлено: unkier от Май 26, 2011, 15:57
Держи. В архиве исходники  и php скрипт. Прогу надо запускать перед стартом основной программы (что стартовать настраивается в инишнике см.архив), она обращается к скрипту на сервак (указывается в инишнике), тот смотрит в лежащую рядом с ним папку BIN, считывает CRC32 всех файлов в ней и отсылает проге в виде XML. Та в свою очередь сверяет CRC своих файлов с XML, и ежели чаго скачивает изменившийся файл.
Я у себя в локалке распространяю апдейтер в дистрибутиве, а он докачивает при первом старте все что нужно для основной проги. Интерфейс дружественный.

жесть. спасибо. то что доктор прописал :) а под какой лицензией прога :) ? зарелизил бы проект, было бы много кому полезно я думаю.


Название: Re: автообновление по сети
Отправлено: lesav от Май 26, 2011, 16:28
... она обращается к скрипту на сервак (указывается в инишнике), тот смотрит в лежащую рядом с ним папку BIN, считывает CRC32 всех файлов в ней и отсылает проге в виде XML. ...

Есть некоторые ограничения со стороны PHP скрипта - не расчитывает crc32 больших файлов, но этот функционал можно подправить!


Название: Re: автообновление по сети
Отправлено: pokidoff от Май 26, 2011, 16:45
Цитировать
Есть некоторые ограничения со стороны PHP скрипта - не расчитывает crc32 больших файлов, но этот функционал можно подправить!
Лично тестил на файле ~130 Мб - оракловый клиент


Название: Re: автообновление по сети
Отправлено: Странник от Май 26, 2011, 19:43
работаю в организации с сетью филиалов. раньше пользовались подобной схемой, сейчас перешли на клиент-серверное решение на Qt. тот же XML, но на уровне TCP/IP. проверка CRC32, кэширование на стороне сервера, компрессия, возможность докачки. производительность заметно подросла.
проект, к сожалению, закрытый. но если соберусь увольняться.. ;)


Название: Re: автообновление по сети
Отправлено: lesav от Май 26, 2011, 20:09
Цитировать
Есть некоторые ограничения со стороны PHP скрипта - не расчитывает crc32 больших файлов, но этот функционал можно подправить!
Лично тестил на файле ~130 Мб - оракловый клиент
Решение не универсальное, я не могу хостера заставить снять ограничения со стороны php
Но в если написать свой cgi сценарий (или лучше написать его на Си)  то вполне работоспособное!



... сейчас перешли на клиент-серверное решение на Qt. тот же XML, но на уровне TCP/IP. проверка CRC32, кэширование на стороне сервера, компрессия, возможность докачки...

Вот истинное решение! Мне по душе! )))  Пойду в эту сторону! )))


Название: Re: автообновление по сети
Отправлено: pokidoff от Май 27, 2011, 07:51
А закачка идет не через PHP. Скрипт служит только для оценки изменений.


Название: Re: автообновление по сети
Отправлено: Etud от Июнь 21, 2011, 18:04
пишешь скрипт php который возвращает текущую версию программы...
Или ложишь на сервере файлик

очень грамотный консалтинг...

А как лучше PHP-скрипт или текстовик ?

АААааа, крокодилы - бегемоты...


Название: Re: автообновление по сети
Отправлено: Denjs от Июнь 21, 2011, 18:48
Держи. В архиве исходники  и php скрипт. Прогу надо запускать перед стартом основной программы (что стартовать настраивается в инишнике см.архив), она обращается к скрипту на сервак (указывается в инишнике), тот смотрит в лежащую рядом с ним папку BIN, считывает CRC32 всех файлов в ней и отсылает проге в виде XML. Та в свою очередь сверяет CRC своих файлов с XML, и ежели чаго скачивает изменившийся файл.
Я у себя в локалке распространяю апдейтер в дистрибутиве, а он докачивает при первом старте все что нужно для основной проги. Интерфейс дружественный.

жесть. спасибо. то что доктор прописал :) а под какой лицензией прога :) ? зарелизил бы проект, было бы много кому полезно я думаю.
+1. Лицензия какая? GPL, LGPL, PublicDomain?


Название: Re: автообновление по сети
Отправлено: pokidoff от Июнь 22, 2011, 08:59
Лицензия GPL. Архив обновил в четвертом посте.