Автообновление программы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Автообновление программы

Сообщение bogdan » 06.10.2015 14:31:56

Подскажите пожалуйста. Как лучше всего реализовать автообновление программы. Как идея, запустить скрипт? Спасибо
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Автообновление программы

Сообщение McLion » 06.10.2015 15:42:54

Моя программа скачивает txt-файл в которой стоит номер новой версии.

Если номер больше того номера, что в программе -> тогда высвечиваю иконочку, что на сайте доступна новая версия или кликнув на эту самую иконку можно напрямую скачать файл.

Если номер равен или меньше того, что в файле, ничего не делаю.

В txt-файл можно конечно и написать, что изменилось в новой версии, и выдавать этот текст.

На первое время пойдет, со временем что то поудобнее придумаю.
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Автообновление программы

Сообщение stanilar » 06.10.2015 16:59:36

Программа - ланчер. Пользователь запускает всегда ее. Уже эта программа проверяет обновления, и скачивает их. А пока идет закачка - запускает предыдущую версию. Если обновление постоянно падает - ланчер запускает предыдущую, стабильную версию. Заодно и проблем и с правами на новые версии экзешника будет меньше - если новую версию ставить не в Program Files, а в какой-нибудь USER\AppData.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Автообновление программы

Сообщение Ichthyander » 06.10.2015 17:19:36

McLion писал(а):Моя программа скачивает txt-файл в которой стоит номер новой версии.

Если номер больше того номера, что в программе -> тогда высвечиваю иконочку, что на сайте доступна новая версия или кликнув на эту самую иконку можно напрямую скачать файл.

Если номер равен или меньше того, что в файле, ничего не делаю.

В txt-файл можно конечно и написать, что изменилось в новой версии, и выдавать этот текст.

На первое время пойдет, со временем что то поудобнее придумаю.

Да, также планирую сделать автообновление. Заодно можно сделать отображение изменений в окошке about. Вот только пока не решил как сделать, чтобы ссылка была скрытой. Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически. К примеру в зависимости от версии, а еще лучше юзера и md5 (к примеру) шифрование конечно.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 698
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Автообновление программы

Сообщение Xenar » 06.10.2015 17:35:05

У меня так.
В программе включена нумерация версий. Сама программа находится в репозитарии (через ftp). При запуске идет проверка на соответствии номера версии в программе с названием пакета (нумерации) в репозитарии.
P/S ну естественно онное реализовано под linux
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Re: Автообновление программы

Сообщение Sharfik » 06.10.2015 20:03:06

Ichthyander писал(а):Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически.

А почему нельзя сделать две ссылки? Одна для скачивания полной платной программы, а вторая только для скачивания обновлений, в наборе которых будет отсутствовать что то типа библиотеки авторизации или т.п.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 808
Зарегистрирован: 20.07.2013 01:04:30

Re: Автообновление программы

Сообщение bogdan » 06.10.2015 20:27:51

Ну а как земнять бинарник уже работающей программы?
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Автообновление программы

Сообщение DYUMON » 06.10.2015 20:41:53

У меня на сервере лежит файлик с полным списком всех файлов программы с каталогами.
структура примерно такая
путь_к_обекту_обьект |признак каталога| контрольная_сумма|
прога когда надо качает файл и проверяет все свои файлы , если какой то файл отличается от того что на сервере то она качает только его.

Добавлено спустя 1 минуту 38 секунд:
bogdan
не знаю как в фри паскале но в делфи можно .exe работающей программы можно переименовать. получить новый, а затем попросить пользователя перезапустить программу.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Автообновление программы

Сообщение Little_Roo » 06.10.2015 21:13:04

Вот у меня (подсмотрел где-то...уже не помню, но работает)
Код: Выделить всё
procedure Tloginform.FormShow(Sender: TObject);
var
  res: Boolean;
  iLDate, iRDate: TDateTime;
begin
//--!!!!!!!!!   AUTO  UPDATE  PROGRAMM   !!!!!!!!!!! ////////
  iLDate:=FileDateToDateTime(FileAge(Application.ExeName));
  if not FileExists('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)) then exit;
  iRDate:=FileDateToDateTime(FileAge('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)));
if iLDate >= iRDate then exit else Application.MessageBox('  Обнаружена НОВАЯ версия программы !'+ #13#13 +
                                                            '     Нажмите ОК для обновления ...'+ #13#13 +
                                                            '     И ПЕРЕЗАПУСТИТЕ ПРОГРАММУ     '+ #13#13 ,
                                                            '   Обновление программы мониторинга...',mb_IconExclamation + mb_OK);
  // Удаляет файл созданный в предыдущем сеансе
    res := DeleteFile(Application.ExeName + '.bak'); //TRUE

    // Сам себя удалить не может!
   //////////////// res := DeleteFile(Application.ExeName); //FALSE

    // Переименование запущенного ехе-шника
    MoveFile(PChar(Application.ExeName),PChar(Application.ExeName + '.bak')); // TRUE

    // НЕ Удаляет файл созданный в текущем сеансе
    res := DeleteFile(Application.ExeName + '.bak'); //FALSE

    // Копирование вак-файла на место и с именем текущего запущенного ехе-шника
    CopyFile(PChar('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)),PChar(Application.ExeName),True); // TRUE

    // Запуск нового ехе-шника (старый [текущий] еще активный)
    WinExec(PChar(Application.ExeName), SW_SHOW); // TRUE
    // Закрывает текущий сеанс (программу).
    Close;
//----------------------------------------------------
end;           

Проверка не по номеру версии , а времени компиляции

Lazarus 1.5 rUnknown FPC 3.1.1 i386-win32-win32/win64
WinXP SP3 32 bit
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Автообновление программы

Сообщение Ichthyander » 07.10.2015 06:32:26

Sharfik писал(а):
Ichthyander писал(а):Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически.

А почему нельзя сделать две ссылки? Одна для скачивания полной платной программы, а вторая только для скачивания обновлений, в наборе которых будет отсутствовать что то типа библиотеки авторизации или т.п.

Ну, модуль исполняемый у меня один. Делать отдельно библиотеку авторизации и прочее нет смысла. Кроме того, путь к платной "полной" программе тоже неплохо бы зашифровать в Вашем случае

Добавлено спустя 6 минут 24 секунды:
Little_Roo писал(а):Вот у меня (подсмотрел где-то...уже не помню, но работает)
Код: Выделить всё
procedure Tloginform.FormShow(Sender: TObject);
var
  res: Boolean;
  iLDate, iRDate: TDateTime;
begin
//--!!!!!!!!!   AUTO  UPDATE  PROGRAMM   !!!!!!!!!!! ////////
  iLDate:=FileDateToDateTime(FileAge(Application.ExeName));
  if not FileExists('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)) then exit;
  iRDate:=FileDateToDateTime(FileAge('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)));
if iLDate >= iRDate then exit else Application.MessageBox('  Обнаружена НОВАЯ версия программы !'+ #13#13 +
                                                            '     Нажмите ОК для обновления ...'+ #13#13 +
                                                            '     И ПЕРЕЗАПУСТИТЕ ПРОГРАММУ     '+ #13#13 ,
                                                            '   Обновление программы мониторинга...',mb_IconExclamation + mb_OK);
  // Удаляет файл созданный в предыдущем сеансе
    res := DeleteFile(Application.ExeName + '.bak'); //TRUE

    // Сам себя удалить не может!
   //////////////// res := DeleteFile(Application.ExeName); //FALSE

    // Переименование запущенного ехе-шника
    MoveFile(PChar(Application.ExeName),PChar(Application.ExeName + '.bak')); // TRUE

    // НЕ Удаляет файл созданный в текущем сеансе
    res := DeleteFile(Application.ExeName + '.bak'); //FALSE

    // Копирование вак-файла на место и с именем текущего запущенного ехе-шника
    CopyFile(PChar('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)),PChar(Application.ExeName),True); // TRUE

    // Запуск нового ехе-шника (старый [текущий] еще активный)
    WinExec(PChar(Application.ExeName), SW_SHOW); // TRUE
    // Закрывает текущий сеанс (программу).
    Close;
//----------------------------------------------------
end;           

Проверка не по номеру версии , а времени компиляции

Lazarus 1.5 rUnknown FPC 3.1.1 i386-win32-win32/win64
WinXP SP3 32 bit

Кстати, спасибо за примерчик. Наверное использую в своей проге. Думал перезапуск и замена икзешника будет ручным, а оказывается и так можно сделать
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 698
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Автообновление программы

Сообщение PapaNT » 07.10.2015 16:41:57

Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Автообновление программы

Сообщение Sharfik » 07.10.2015 18:02:08

PapaNT писал(а):Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?

google это знает, со своими беспардонными автообновлениями из маркета?)))

Проверка прав администратора и проблемы нет, нет?)
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 808
Зарегистрирован: 20.07.2013 01:04:30

Re: Автообновление программы

Сообщение vitaly_l » 07.10.2015 20:51:41

Sharfik писал(а):Проверка прав администратора и проблемы нет, нет?)

Приведённый код не сработает если программа запущена под пользователем. И он не предложит запустить под администратором.
В смысле PapaNT прав, код будет работать только если программа установлена в "свободную от прав" директорию (только для Win).

Рекомендую решать поставленную задачу, обыкновенным батником

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Автообновление программы

Сообщение Alex2013 » 08.10.2015 18:24:20

Есть более "крутой" способ: написать настоящий Ланчер с собственной загрузкой настройкой и передачей управления ...
(Для Дос когда-то писал подобное как часть пакета навесной защиты для готовых EXE-шников )
Да, попотеть придется но зато гарантия что обновление не "уползет" будет повыше ...

А вообще для большинства случаев для нужд обновления достаточно упрятать часть кода в скрипты
(Как пример смотри мой вчера выложенный Редактор скриптовили проект "Дополнение к реальности " (Nv_BETA003M.zip )
По идее можно вообще каждый раз качать все "мясо" приложения с удаленного сервера виде кодированного сжатого скрипта ... А уж просто обновления будут вообще качаться "на раз два " ! И проблемы с правами доступа сразу станут совершенно неактуальны .
Alex2013
долгожитель
 
Сообщения: 3140
Зарегистрирован: 03.04.2013 11:59:44

Re: Автообновление программы

Сообщение resident » 09.10.2015 12:16:19

PapaNT писал(а):Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?

Вот именно, ИМХО, поэтому автообновления нужны только для программ, связанных с этой самой безопасностью.
Для остальных программ, автообновление - понт, за который можно и ответить.

Допустим, скачанный "начальный" дистрибутив, который потом можно под микроскопом в лаборатории изучить, предоставляется AS IS, пользователь ставит галочку, что согласен с этим. Так ведь пользователя еще в лицензии требуется заставить дать согласие на то, что эта программа скачает с интернета АБСОЛЮТНО ЛЮБОЕ Г-НО, которое будет что-то подменять на компе пользователя, писать не пойми куда, играться с правами, да делать все что угодно, а потом еще и подотрет за собой следы. И автор этой программы, а по сути уже лоадера вирусов, не будет ни за что отвечать.

vitaly_l писал(а): код будет работать только если программа установлена в "свободную от прав" директорию (только для Win)

Видел как некоторые чудаки ставятся в \AppData\Roaming или \AppData\Local

vitaly_l писал(а):Рекомендую решать поставленную задачу, обыкновенным батником

Вы, как специалист по лицензиям, эти действия описываете в свой лицензии как?

Alex2013 писал(а):достаточно упрятать часть кода в скрипты

Alex2013 писал(а):проблемы с правами доступа сразу станут совершенно неактуальны

На каком-нить хакерском форуме это наверное бы оценили

з.ы.
https://ru.wikipedia.org/wiki/%D0%9A%D0 ... 1%83%D1%81
Компью́терный ви́рус — вид вредоносного программного обеспечения, способного создавать копии самого себя и внедряться в код других программ, системные области памяти, загрузочные секторы, а также распространять свои копии по разнообразным каналам связи.

Даже если автор вируса не запрограммировал вредоносных эффектов, вирус может приводить к сбоям компьютера из-за ошибок, неучтённых тонкостей взаимодействия с операционной системой и другими программами. Кроме того, вирусы, как правило, занимают место на накопителях информации и потребляют некоторые другие ресурсы системы.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 226

Рейтинг@Mail.ru