Сайт | Скачать | Видео | Wiki

Голосование

Нужно?

Нужно
10 (71.4%)
Не нужно
4 (28.6%)

Проголосовало пользователей: 14

Автор Тема: mod-up. Обновление загруженных модулей.pfs из репозитория  (Прочитано 66872 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #30 : 07 Январь 2016, 08:43:09 »
Остается локаль.
Код
# locale -a
C
en_US.utf8
POSIX
ru_RU.utf8
root@pra:lib# set |grep LC
LC_ALL=ru_RU.UTF-8
LC_COLLATE=C
Теперь работает! Полезный скрипт!
Попробовал gui сделать на yad, на ntf -k оказалось все же менее удобно, третья колонка скрыта.
В этой 3й колонке глубокий смысл
Сейчас в скрипте надо будет качнуть новый модуль и переименовать старый.
У Вас выводится только имя нового. В эту 3. колонку можно было : новый|старый и распарсить
Если писать не на ntf - надо добавить кнопку справка и там описать что будет в итоге
Еще надо привязаться к /etc/sfs-get/www.list
В целом - очень хорошо. + Не останавливайтесь

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #31 : 08 Январь 2016, 01:31:47 »
Код
root@pra:lib# set |grep LC
LC_ALL=ru_RU.UTF-8
LC_COLLATE=C

Ну вот  :)   
Уж сколько лет твердили миру...
что LC_ALL= не должна быть установленной, она ж перекрывает все остальные LC_ и LANG впридачу.
Код
live@pra:~$ set |grep -E 'LANG|LC_'
LANG=ru_RU.UTF-8
LC_COLLATE=C

live@pra:~$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE=C
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Вот так - нормально.  Все категории LC_ могут быть установлены независимо. А типичное применение LC_ALL - временно переопределить сразу все категории, например
Код
live@pra:~$ LC_ALL=C date
Fri Jan  8 00:25:01 MSK 2016

В этой 3й колонке глубокий смысл
Сейчас в скрипте надо будет качнуть новый модуль и переименовать старый.
У Вас выводится только имя нового. В эту 3. колонку можно было : новый|старый и распарсить
Если писать не на ntf - надо добавить кнопку справка и там описать что будет в итоге
Еще надо привязаться к /etc/sfs-get/www.list
Ну, в данном случае не обязательно иметь для этого отдельную скрытую колонку, проще вывести их все и распарсить.
А в ntf колонок оказалось элементарно маловато - в первой чекбокс, третья скрыта, то есть имена и старого и нового модулей надо писать во вторую, это работало, но из-за разных длин имен выровнять их не получалось, шрифт то не моноширинный, пробелами не подравнять.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #32 : 08 Январь 2016, 09:35:33 »
Осталось только полять откуда взялось LC_ALL ... В /etc и /home поиском не нашел
Код
# cat /etc/locale.conf /etc/profile  
LANG=ru_RU.UTF-8
LC_COLLATE=C
# /etc/profile

#Set our umask
umask 022

# Set our default path
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
export PATH

# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
for profile in /etc/profile.d/*.sh; do
test -r "$profile" && . "$profile"
done
unset profile
fi

# Source global bash config
if test "$PS1" && test "$BASH" && test -r /etc/bash.bashrc; then
. /etc/bash.bashrc
fi

# Termcap is outdated, old, and crusty, kill it.
unset TERMCAP

# Man is much better than us at figuring this out
unset MANPATH
Где еще искать? Или как поправить?

ntf - еще по опыту - несколько колонок неудобно, т.к. по ним не получится искать
В любом случае для типовых случаев ntf удобно. Для сложных им можно вдохновиться
yad менее функционален , но проще и удобнее gtkdialog

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #33 : 08 Январь 2016, 22:31:52 »
Вот.  Страшный програм уже работает.   ;)
Конечно, еще есть, что до ума доводить, но основные функции выполняет.

1. Выкачивает с репозитория список файлов.
2. Смотрит, какие модули в данный момент подключены.  Все модули, включая подключенные на горячую.
3. Проверяет, нет ли в списке репозитория пакетов, похожих по имени на подключенные, но с версией поновее.
4. Выводит диалог с чекбоксами - ну, до этого места уже видели.
5. Выкачивает из репозитория выбранные в диалоге файлы, показывая прогрессбар.
    Если не удалось скачать - сообщает.  Частично скачанный файл удаляется, от греха подальше.
6. Смотрит директорию системы.  Ориентируется при этом на ссылку /mnt/live/porteus/modules
    (DdShurik узнает - предаст анафеме  ;D)
7. Ищет в поддиректориях директории системы обновляемые пакеты, переименовывает их в *.old, рядом кладет скачанный файл,
    создает или дописывает в директории пакета файл update.log -->
    
Код
    Пт янв  8 21:23:39 MSK 2016
    teamviewer-10.0.37742-s02.pfs ==> teamviewer-10.0.37742-s02.pfs.old
    teamviewer-11.0.52520-s02.pfs added
8. Выводится окно с итоговым отчетом, что куда переименовано и положено.
    Если старого пакета не нашел (флешка отмонтирована), переименовать старый файл не смог (прав нет),
    новый файл не перенес (место закончилось) - скачанные файлы остаются в /tmp/mod_update, об этом сообщается пользователю,
    чтобы вручную перенес.
« Последнее редактирование: 09 Январь 2016, 08:11:42 от sfs »

Оффлайн Pro

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 10737
  • Репутация: +113/-2
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #34 : 09 Январь 2016, 04:21:52 »
7. Ищет в поддиректориях директории системы обновляемые пакеты, переименовывает их в *.old, рядом кладет скачанный файл,
может не переименовывать а просто в optional переносить?
Я загружаю новые пакеты сюда: http://file.puppyrus.org/users/ а дальше можно найти самостоятельно.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #35 : 09 Январь 2016, 08:26:56 »
1. Выкачивает с репозитория список файлов.
Надо чтобы читал /etc/sfs-get/www.list
Пока в начале сделал
Код
[ "`uname -m`" != "x86_64" ] && repo="http://www.puppyrus.org/~melvik/puppyrus/ftp/puppyrus/puppyrus
-a/pra03/pfs" \
 ||  repo="www.puppyrus.org/~melvik/puppyrus/ftp/puppyrus/puppyrus-a64/pfs-portable"
В итоге у меня в ПРА64 заканчивается
Код
wget -O >(sed -n 's/.*href="\(.*\.pfs\)".*/\1/p' >repolist.txt) "$repo" 2>&1 \
./newmod.simple.yad.txt: line 36: syntax error near unexpected token `('
./newmod.simple.yad.txt: line 36: `wget -O >(sed -n 's/.*href="\(.*\.pfs\)".*/\1/p' >repolist.txt) "$repo" 2>&1 \'
В ПРА32 так же , но выводит на экран 1 обновление
Я с трудом читаю этот код
 local ver sver - что это в начале splitname()?
5. Выкачивает из репозитория выбранные в диалоге файлы, показывая прогрессбар.
С wget тоже малопонятно
На всякий случай есть wget-progressbar3
6. Смотрит директорию системы.  Ориентируется при этом на ссылку /mnt/live/porteus/modules
Тут без вариантов придется привязываться к инитрд
Не знаю какие там Дядя Шурик стандарты напринимает, но у меня под них переписывать pra-porteus-initrd желания нет
Придется определять тип инитрд и для каждого по своему
7. Ищет в поддиректориях директории системы обновляемые пакеты, переименовывает их в *.old,
может не переименовывать а просто в optional переносить?
Плохая идея. Лишняя путаница - что за модуль и откуда
Думаю - .old или в /modules.old
« Последнее редактирование: 09 Январь 2016, 11:26:10 от sfs »

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #36 : 09 Январь 2016, 19:27:47 »
1. Выкачивает с репозитория список файлов.
Надо чтобы читал /etc/sfs-get/www.list
Пока в начале сделал
Код
[ "`uname -m`" != "x86_64" ] && repo="http://www.puppyrus.org/~melvik/puppyrus/ftp/puppyrus/puppyrus
-a/pra03/pfs" \
 ||  repo="www.puppyrus.org/~melvik/puppyrus/ftp/puppyrus/puppyrus-a64/pfs-portable"
В итоге у меня в ПРА64 заканчивается
Код
wget -O >(sed -n 's/.*href="\(.*\.pfs\)".*/\1/p' >repolist.txt) "$repo" 2>&1 \
./newmod.simple.yad.txt: line 36: syntax error near unexpected token `('
./newmod.simple.yad.txt: line 36: `wget -O >(sed -n 's/.*href="\(.*\.pfs\)".*/\1/p' >repolist.txt) "$repo" 2>&1 \'
Странно.  У меня в pra1512game такая конструкция нормально воспринимается.  В мануале bash такая подстановка процессов описана, так что вроде должна быть стандартной.
Хорошо, попробую упростить, как-нибудь через временные файлы сделаю.  Не хотелось бы отказываться от возможности видеть лог работы wget, у нас тут tele2 сделал новогодний подарок - начиная с вечера 31 декабря интернет работает через раз, без лога сидишь и гадаешь - зацепился wget за сервер или нет.

/etc/sfs-get/www.list приспособлю.  Надо только подумать, как обработать несколько репозиториев.

В ПРА32 так же , но выводит на экран 1 обновление
??? Вообще непонятно.  Не скачав repolist этой самой 36 строчкой он вообще обновлений обнаружить не может - ибо негде.

Я с трудом читаю этот код
 local ver sver - что это в начале splitname()?
Тут за исключением длинных регулярных выражений все просто.  Это объявление двух локальных переменных
в ver потом помещаются куски имени файла, относящиеся к версии.  Поскольку таких кусков может быть больше одного, ver может получиться многострочной.
Например, deadbeef-p-static-0.6.2-full-s04.pfs разберется на имя пакета deadbeef-p-static-.*-full-.*\.pfs и версию 0.6.2-s04
ver при этом содержит '-0.6.2-\n-s04.'
Потом эти кусочки подрезаются до '0.6.2' и 's04' и объединяются в единую строку локальной переменной sver,
одновременно с этим строится регулярное выражение для команды s/// sed, которое вырежет эти кусочки из полного имени файла, заменив их на .*    Потом deadbeef-p-static-.*-full-.*\.pfs можно использовать как шаблон grep, чтобы найти все такие пакеты с разными версиями.

С wget тоже малопонятно
На всякий случай есть wget-progressbar3
Смотрел я его.  Не сказал бы, что он проще :)
У меня там как раз ничего сложного нет:
wget -c --progress=dot "${repo}/${newmod}" 2>&1 - обычная команда wget <url>
"-с" - с докачкой, если файл уже лежит, перекачивать не будет, скажет, что готово
"--progress=dot" чтобы лог работы в более удобном для разбора формате выводил
2>&1 - лог не в sterr, а в stdout, для разбора в прогрессбар

|sed -nu 's/^/#/p;/%/s/^.* \+\([0-9]\+%\).*$/\1/p'
"-n" - не выводить ничего без команды p
"-u" - unbuffered, буфер по минимуму, чтобы по строчке выводил, а не пачкой
's/^/#/p' - все входные строчки закомментировать и отправить на выход, в yad --progress --enable-log эти строки попадут в окно лога
/%/s/^.* \+\([0-9]\+%\).*$/\1/p' - а если во входной строчке есть проценты, то вырезать и напечатать на выход еще раз, эти строки управляют прогрессбаром.
Вот и все навороты вокруг wget

При выкачивании списка там сложнее, поскольку надо разбирать не только лог, но и выкачиваемый файл, он же изначально html,
поэтому и попытался сделать через подстановку процесса >(...), у меня работало, не знаю, почему у вас не так, хоть бы еще кто попробовал запустить.

6. Смотрит директорию системы.  Ориентируется при этом на ссылку /mnt/live/porteus/modules
Тут без вариантов придется привязываться к инитрд
Не знаю какие там Дядя Шурик стандарты напринимает, но у меня под них переписывать pra-porteus-initrd желания нет
Придется определять тип инитрд и для каждого по своему
Ну, обновлялка модулей дистрибутива по-моему принципиально не может быть дистрибутивонезависимой,
все равно особенности везде разные.
« Последнее редактирование: 09 Январь 2016, 19:36:39 от ander »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #37 : 09 Январь 2016, 19:52:56 »
Может другим путём?
Код
# lftp ftp://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pfs/
cd ok, каталог=/puppyrus/puppyrus-a/pra03/pfs                                 
lftp mirror.yandex.ru:/puppyrus/puppyrus-a/pra03/pfs> ls wps-office-p*
-rw-r--r--    1 ftp      ftp      57659392 Jan 17  2015 wps-office-p-9.1.0.4909.pfs
lftp mirror.yandex.ru:/puppyrus/puppyrus-a/pra03/pfs> exit
#
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #38 : 10 Январь 2016, 01:44:11 »
не все так просто
xf86-video-intel-2.99.917-sna.pfs
xf86-video-intel-2.99.917-uxa.pfs
например.
если стоит xf86-video-intel-2.99.917-uxa.pfs
и искать xf86-video-intel-*
то найдется отличающийся от исходного xf86-video-intel-2.99.917-sna.pfs, но это не другая версия, а другой пакет.

А приведенный уже пример: deadbeef-p-static-0.6.2-full-s04.pfs
От балды накидаю вариантов, какие уже видел в названиях других пакетов:
 deadbeef-p-static-0.6.2-full-s04+.pfs
 deadbeef-p-static-0.6.1-full-s05.pfs
 deadbeef-p-static-0.6.3-full-s01.pfs
 deadbeef-p-static-0.6.2-light-s05.pfs
 deadbeef-p-static-0.6.2-full-s04_DEV.pfs
 deadbeef-p-static-0.6.2-full-qt4-s04.pfs
Не так просто разобрать, где тут тот же пакет новой версии, а где уже другой, которым исходный заменять не стоит, по крайней мере не подумав, точно ли именно этого хочешь.

Поэтому одна только функция разбора имени не сильно простая:
Код
#!/bin/bash

# splitname <разбираемое имя файла> <переменная под имя> <переменная под версию>
# пример: splitname $pfsname modname modver
splitname(){
  local ver sver
  ver=$(echo "$1" \
        |sed 's/i[3-6]86\|x86[_-]64\|x64\|[Xx][Ff][_-]\?86\|[Qq][Tt]4/masq/g' \
        |grep -oE '[_-]([A-Za-z]{0,2}[0-9][a-z0-9]*[_.+-])+')
  local re1='\(.*\)' re2='\1' n=1 partver
  for partver in $ver ; do
     n=$(($n+1))
     partver=${partver%?}
     partver=${partver#?}
     re1="${re1}$partver\\(.*\\)"
     re2="${re2}.*\\$n"
     sver="${sver}${sver:+-}$partver"
  done
  declare -g $2=$(echo "$1" |sed 's/'$re1'\.pfs/'$re2'\\.pfs/')
  declare -g $3=$sver
}

splitname $1 name ver

echo "$1"
echo "$name"
echo "$ver"
echo -----------------
« Последнее редактирование: 10 Январь 2016, 15:08:05 от ander »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #39 : 10 Январь 2016, 08:28:33 »
Обратите внимание, что утилита выдаёт не только имя но и дату.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #40 : 10 Январь 2016, 12:31:34 »
/etc/sfs-get/www.list приспособлю.  Надо только подумать, как обработать несколько репозиториев.
Обработку одного ставим в цикл
объявление двух локальных переменных
Чем локальная отличается от обычной?

Не надо упираться в адские фильтры. Пишите - какие модули имеют проблемные названия - переименую

wget-progressbar3 - простотой не отличается, но проверен и работает по ключам. Дорабатывал его вместе с debian-dog-овцами
Следуя linux-way надо юзать (возможно с доработкой) его

Обратите внимание, что утилита выдаёт не только имя но и дату.
Имя по любому разбирать придется. Поэтому дополнительно заморачиваться датой нет смысла
Кроме того с ней могут происходить на фтп чудеса

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #41 : 10 Январь 2016, 12:42:49 »
Обратите внимание, что утилита выдаёт не только имя но и дату.
А можно ли на эту дату ориентироваться?  Это наверняка дата загрузки на сервер, а у точно такого же файла на флешке это может быть дата копирования на флешку.

И опять же, ну вот лежит в репозитории, например, кроме Libreoffice-p-5.0.0-s01.pfs  еще и Libreoffice-p-5.0.0-s01+.pfs
ls Libreoffice-p* выдаст оба этих файла, причем по сортировке тот что с плюсом выглядит новее, дата тоже может быть новее, а вот класть Libreoffice-p-5.0.0-s01+.pfs вместо Libreoffice-p-5.0.0-s01.pfs нельзя - это просто два разных пакета.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #42 : 10 Январь 2016, 12:44:37 »
объявление двух локальных переменных
Чем локальная отличается от обычной?
Тем, что существует только локально внутри функции.  Вне функции может существовать переменная с таким же именем, и она при работе функции не затронется.  Соответственно, функцию с локальными переменными можно вставить куда-нибудь, не заморачиваясь, что там такие же имена переменных используются.
Да вот пару сообщений назад код - внутри splitname ver - локальная, а в последней строчке, где функция вызывается, то же самое имя ver - уже будет глобальной переменной.  А вот sver вне функции вообще не установлена, а если бы была установлена, то после вызова splitname никак бы не изменилась.

Кстати, скопируйте этот код в файл да и примените к именам, сразу будет видно, какие проблемные.

Не надо упираться в адские фильтры. Пишите - какие модули имеют проблемные названия - переименую
Это  вы еще не оценили объем.  Даже с такими фильтрами переименовать придется немало, в основном в репозитории pra64.  Суффикс _64 от версии отличить принципиально невозможно, надо делать -x86_64 или -x64, такие войдут в имя.

А отличить проблемное название от непроблемного - только применить к нему splitname и глазами оценить, что получилось.  По крайней мере я другого способа не придумал, а этот довольно трудоемок.

wget-progressbar3 - простотой не отличается, но проверен и работает по ключам. Дорабатывал его вместе с debian-dog-овцами
Следуя linux-way надо юзать (возможно с доработкой) его
Да в нем 99 строк!  Разберусь со временем, но пока мне проще вставить 10.

Вот, новая версия.  У меня работает.

Изменения:
Cписок репозиториев берет из /etc/sfs-get/www.list, если найден файл с новой версией и он находится в нескольких репозиториях - скачиваться будет из первого по списку.
Список файлов репозитория обрабатывается насчет quoted-printable, а то на яндексе '+' хранится как '%2b'
Часть обработки идет через временные файлы.  Возможно, это будет более переносимо, а то у sfs то локаль не та, то bash подстановку процессов не делает  :)
Перед закачкой файла проверяется, может он уже есть, только не подключен, поскольку не перезагружались.
« Последнее редактирование: 10 Январь 2016, 13:33:48 от ander »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
  • Автор темы
    • PuppyRus-A
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #43 : 10 Январь 2016, 13:25:49 »
Вот, новая версия.  У меня работает.
У меня в ПРА64 - вероятно тоже - обновлений нет (но так оно и есть)
/tmp/mod_update/repolist.txt - правильный
Проскакивает окно с какими-то логами wget - так задумано?
Не пора ставить скрипт в дистр?

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Автообновление автозагружаемых модулей.pfs
« Ответ #44 : 10 Январь 2016, 13:49:21 »
Вот, новая версия.  У меня работает.
У меня в ПРА64 - вероятно тоже - обновлений нет (но так оно и есть)
/tmp/mod_update/repolist.txt - правильный
Проскакивает окно с какими-то логами wget - так задумано?
Не пора ставить скрипт в дистр?

Ну, для пробы надо поставить пару модулей старой версии, я так и делал, из предыдущих версий дистрибутива можно взять,
и посмотреть, как обновлять будет.

А окно с логами у меня не проскакивает, а некоторое время висит, показывая закачку списков из репозиториев, или отсутствие всякой закачки, если интернет глючит.

reportlist.txt - это как раз эти списки, слитые вместе.  Не удаляю его, потом думаю проверку сделать - не перекачивать, если не сильно устарел.  Сейчас каждый раз в начале заменяется свежим.

В дистрибутив ставить - надо хоть как-то оттестировать, да и с именами модулей минимальный порядок навести, а то ведь переименованные он потом не распознает, будет считать, что это другой пакет.