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

Автор Тема: Содержимое пакетов и аддонов в текстовом файле  (Прочитано 31495 раз)

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

Оффлайн Hatch

  • Старожил
  • ****
  • Сообщений: 229
  • Репутация: +2/-0
Что-то вроде этого:
 Название      версия ОС      версия ПО      зависимости  
 Firefox      Jeans 1.3.0      3.5.10      нет  
 Firefox      Puppy4.20-ru      3.5.10      библиотека 1  
  библиотека 2  
  библиотека 3
здесь бы, на мой взгляд, не помешало добавить описание. Или ссылку на форум, если там описание есть. Зачем, думаю и так понятно.
Lexeii, Lexeii,
если мы всем сообществом хотя-бы раз в неделю опишем каждый по одному пакету, то это будет примерно 3-4 пакета
Lexeii, исходя из ваших расчетов, выходит что в сообществе 3-4 человека.  ;D
Как я уже выше писал, вопрос тут в том, что бы не только эти 3-4 человека могли выполнять эту работу, но в том чтобы любой желающий мог это сделать. А тут 2 пути, как минимум, или желающий опишет какой то пакет и отыщет одного из тех, кто это описание может внести в общую базу,или же сделать форму на сайте/форуме где это описание можно вбить и отправить в туже базу.
  • Обрабатываем один пакет, создаём таблицу с одной записью (как пример).
  • Размещаем результат на той же вики
.
Опять вопрос: а кто будет размещать? Вариант 1- вручную, вариант 2- автоматом?
« Последнее редактирование: 22 Июль 2010, 16:19:53 от Hatch »

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
Lexeii, Lexeii,
если мы всем сообществом хотя-бы раз в неделю опишем каждый по одному пакету, то это будет примерно 3-4 пакета
Lexeii, исходя из ваших расчетов, выходит что в сообществе 3-4 человека.  ;D
Вы не поняли всей иронии сказанного  :D
При всём уважении к былым заслугам, сейчас я вижу в сообществе именно этих 3-4 человек. Остальные как бы «проходящие мимо».

вопрос тут в том, что бы не только эти 3-4 человека могли выполнять эту работу, но в том чтобы любой желающий мог это сделать.
Я думал, это очевидно.
Эй, «любой желающий», пишите мне в личку! Регистрируйтесь в вики! Либо отписывайтесь в форуме! Мы уж сами заполним все таблицы! Ау-у-у!

Я, например, сильно скован размером трафика и был бы благодарен каждому, кто смог бы загрузить себе какой-нибудь пакет, обработать его скриптом (который мы напишем) и отправить мне, или просто на форум, результат.
Linux is user friendly... It's just picky about who it  becomes friends with.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Я, например, сильно скован размером трафика и был бы благодарен каждому, кто смог бы загрузить себе какой-нибудь пакет, обработать его скриптом (который мы напишем) и отправить мне, или просто на форум, результат.
 Давайте список пакетов и необходимой информации.
Прикрепил то, что успел сегодня, пока связь не оборвалась.
Моноблок 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

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
я вечерком отпишусь.
Вечерком закончился трафик, были пиво и разговоры в реале :)
Но я продолжал обдумывать скрипт. Сегодня примерно за 3 часа, 2 кружки кофе и несколько сигарет родился скрипт:
Код
#!/bin/sh
PACK_PATH=/root/packs
NAME=`basename $1 .pet`
mkdir -p $PACK_PATH
# выходные файлы
OUT_FILES=$PACK_PATH/$NAME.files
OUT_LDD=$PACK_PATH/$NAME.ldd

# выводим список файлов в пакете
tar -tvf $1 > $OUT_FILES

# распаковываем пакет в /tmp
tar -x -C /tmp -f $1

# список файлов
FILELIST=`find /tmp/$NAME -type f`

# "грязный" список зависимых библиотек
for FILENAME in $FILELIST
do
if file $FILENAME | grep -q ELF                                 # Внимание: исправил
then
echo "`ldd $FILENAME`" >> $OUT_LDD
fi
done

# удаление распакованного пакета из /tmp
rm -r /tmp/$NAME

# удаление мусора, сортировка и удаление дубликатов
sed -i 's/\t//g' $OUT_LDD
sed -i 's/ (0x........)//g' $OUT_LDD
sed -i 's/not a dynamic executable//g' $OUT_LDD
cat $OUT_LDD | sort | uniq > $OUT_LDD
Его нужно положить туда, где его найдет система (не забыв и про флажок исполнимости). У меня этот скрипт — /usr/bin/files

Скрипт принимает один параметр — полное имя pet-пакета. Мои примеры:
Код
files /mnt/home/data/soft/games/frozen-bubble-2.2.0-i686-1as.pet
files /mnt/home/data/soft/games/pingus-0.6.0.pet
А так хотелось бы из текущей папки дать просто команду:
Код
files ./frozen-bubble-2.2.0-i686-1as.pet
Но я «ниасилил» :) Зато, клавиша Tab помогает как и прежде.

В результате работы скрипта в папке ~/packs появляются два файла, например:
Код
pingus-0.6.0.files
pingus-0.6.0.ldd
В первом файле — список всех файлов в пакете, во втором — список файлов библиотек, от которых зависит этот пакет.
Для чего нужен второй файл? В дальнейшем хочется, с помощью сообщества создать базу данных библиотек по каждому из дистрибутивов PuppyRus. Написать скрипт, который будет говорить, подходит ли данный пакет для конкретного дистрибутива, или нужно доустановить конкретные библиотеки (которые находятся в таких-то пакетах).

UPD: Я поторопился со следующим кодом, в результате то, что он выдавал невозможно было использовать как базу данных. Теперь я это исправил (sorry, f329):

Если кто-то готов сделать сейчас список файлов своего дистрибутива, то вот вам скрипт so-list:
Код
#!/bin/sh
DIRS="/bin /etc /lib /opt /sbin /usr /var"

for DIR in $DIRS
do
find $DIR -xtype f -name "*.so*" >> so2.txt
done

for LINE in `cat so2.txt`
do
echo "`ls -l $LINE`" >> so.txt
done

rm so2.txt
После этого прикрепите файл so.txt к сообщению в форуме, указав название дистрибутива.

Обращаю ваше внимание на то, что запускать этот скрипт нужно на «голой» системе, как она идет «из коробки», до установки разного постороннего софта.
« Последнее редактирование: 24 Июль 2010, 16:08:33 от Lexeii »
Linux is user friendly... It's just picky about who it  becomes friends with.

Оффлайн f329

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 288
  • Репутация: +29/-0
Не уверен, что это правильно, но держи, тёзка, список моих пакетов из PuppyRus  Seamonkey 2 + стоит OpenOffice, Skype, Wine.. все должно быть справедливо и для 4.20 Opera v.5..
« Последнее редактирование: 29 Март 2016, 15:58:18 от sfs »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
 Здесь генератор справочных html-страничек. Я его немного подновил и вставил кусок кода проверки зависимостей.
Моноблок 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

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
Вот, примерно так будет выглядеть в вики База данных пакетов PuppyRus.

Это — примерно половина того, что было собрано DdShurick (у меня сегодня уже времени нету).
Отличительная особенность — разные версии одного и того же пакета описаны на одной странице (например Firefox).
В описания пакетов мы со временем включим ссылку на список файлов и информацию о совместимости с различными версиями PuppyRus.

На саму страничку со списком пакетов пока не обращайте сильно внимание — она сделана второпях, нужно будет разбить пакеты по темам: «Офис», «Мультимедиа», «Интернет»...

Какие будут предложения?
Linux is user friendly... It's just picky about who it  becomes friends with.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
 А у меня автоматически получились такие заготовки страничек. (Не забудьте. что нужны ещё /images и style.css, они в архиве с генератором)
Моноблок 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

Оффлайн dim-kut

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 1021
  • Репутация: +41/-0
  • Автор темы
Вот, примерно так будет выглядеть в вики База данных пакетов PuppyRus.
.........
Какие будут предложения?

Здорово ! Только, как я понимаю, в разных версиях системы разный набор библиотек и у одного пакета будут разные наборы зависимостей в разных системах. Как я уже предлагал, что-то вроде
[System: PuppyRus 1.3.0] зависимости
[System: PuppyRus 2.0] зависимости
Если где-то пакет работать не будет, то ставим no.
« Последнее редактирование: 24 Июль 2010, 09:17:00 от dim-kut »
Engineering is the art of making what you want from things you can get.

Оффлайн RulllJazzz

  • Постоялец
  • ***
  • Сообщений: 172
  • Репутация: +16/-1
Вот мой список на Puppy-4.20

Оффлайн Lego

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 900
  • Репутация: +60/-0
Lupurus
AMD Phenom 9500 Quad-Core, GF-8600, 2gb RAM
Asus Eee PC-901 (Intel Atom N270, 1Gb RAM, 12Gb SSD)
Puppyrus-13.12-xfce-4.12

Оффлайн bit777

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1037
  • Репутация: +127/-0
puppy431_RU-m4

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
Кто умеет программировать на bash? Я прошу вашей помощи. У меня уже «кипит мой разум возмущенный».

Нужно доработать скрипт, отслеживающий зависимости.
Идея такая. В цикле проверяются все файлы из пакета. Если это исполнимый ELF-файл, то обрабатываем его дальше.
Назовем этот файл binarnik.
Команда ldd binarnik выдаст список библиотек, с которыми затребована зависимость у этого бинарника.
Но дело в том, что не все эти зависимости используются!
Команда ldd -u binarnik выдаст список неиспользуемых зависимостей.
Нам нужно выделить только используемые зависимости.

Тело цикла. Переменная FILENAME — имя тестируемого бинарника.

Код
# Узнаём все зависимости
ALLDEP="`ldd $FILENAME`"

# Если бинарник собран без динамических библиотек, то код возврата будет равен 1 и мы дальше не идем
# Узнаём код возврата предыдущей операции
CODE1=$?
# Если он равен 0, то идем дальше
if [ "$CODE1" -eq 0 ]
then

# Теперь нам нужно зависимости из переменной ALLDEP разбить построчно и обрабатывать каждую строчку

КАК?

# Я захотел воспользоваться циклом
# for DEP in $ALLDEP
# но он не разделяет ALLDEP построчно, а разделяет «слова» пробелами и переводом строк

В общем, дальше — муть голубая.

Из каждой отдельной строчки в ALLDEP (строчка у нас лежит в DEP) выделяем первое поле — имя файла:
Код
DEP1=`echo $DEP | awk '{print($1)}'`

Накапливаем куда-нибудь эти выводы — у нас будет список файлов «всех зависимостей».

Дальше проверяем неиспользуемые зависимости:
Код
UNUSEDDEP="`ldd -u $FILENAME`"
Эта операция всегда возвращает код возврата 1. Но в случае настоящей ошибки (Segmentation Fault) просто ругается в консоль, но в переменную UNUSEDDEP ничего не отдает.
А ежели отдаст, то этот список тоже нужно будет обработать — выделить только имена. А потом в цикле обрабатывать список всех зависимостей и удалять из него поодиночке неиспользуемые зависимости.
Для этого можно воспользоваться таким приемом:
Пусть DEPFILE — имя файла со всеми зависимостями, а UNDEP — одна из неиспользуемых зависимостей, тогда команда
Код
sed -i 's/$UNDEP//g' $DEPFILE
должна будет вычистить из файла DEPFILE всякое упоминание об UNDEP.

Вопрос остается, как в цикле работать с файлом построчно?
Ну и в целом, может есть более элегантные решения?
Linux is user friendly... It's just picky about who it  becomes friends with.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Может такое решение подойдёт?
Код
ALLDEP=`ldd $FILENAME | cut -f 3 -d " "`
UNUSEDDEP=`ldd -u $FILENAME | sed -e 's/^ //'`
echo "$ALLDEP" "$UNUSEDDEP" | sort | uniq -u
Моноблок 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

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
Спасибо, DdShurick! Спасибо, bit777 (удаливший свое сообщение из темы, но не из моего ящика)!
Я не пробовал ваши варианты, но благодарен за помощь. Я временно отхожу от дел, но не забрасываю эту тему. До понедельника у меня не будет времени заняться чем-то кроме работы (разве что, немного поспать).
До встречи!

UPD: Про cut я раньше не знал. А uniq -u - это вообще ход конем, браво!
« Последнее редактирование: 25 Июль 2010, 04:30:59 от Lexeii »
Linux is user friendly... It's just picky about who it  becomes friends with.