BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Сб 02 фев, 2019 1:13 am 
Не в сети

Зарегистрирован: Ср 04 сен, 2013 10:58 pm
Сообщения: 17
Здравствуйте.

Создаю локальный репозиторий, в котором находятся пакеты (с зависимостями), соответствующие списку нужных мне приложений. Делаю это командами pkg fetch ... и pkg repo. Записываю все это на usb-накопитель. Иногда пользуюсь им для развертывания системы с нужным набором программ без использования интернета на другом компьютере. Возник вопрос: как можно обновить пакеты в локальном репозитории, учитывая, что список нужных приложений не поменялся? Пока удаляю весь репозиторий и создаю его заново. Но этот способ не очень нравится. Есть ли какой-нибудь способ построить список пакетов для предпочитаемых приложений, не скачивая сами пакеты? Не хочется качать уже скаченные пакеты и не хочется оставлять в репозитории ничего лишнего, то есть как бы синхронизировать локальный репозитории с официальным, но только по нужным приложениям.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пн 08 апр, 2019 8:03 pm 
Не в сети

Зарегистрирован: Ср 04 сен, 2013 10:58 pm
Сообщения: 17
Эксперимент с командой pkg fetch (версия pkg 1.10.5):
Код:
pkg fetch -r FreeBSD -o . mc

В подкаталог All текущего каталога загружается файл mc-4.8.22_1.txz

1. Изменяю содержимое загруженного файла (например, заменив какой-либо символ в файле). Размер файла и имя остаются прежними, но архив .txz уже поврежден.
Код:
pkg fetch -r FreeBSD -U -o . mc
Number of packages to be fetched: 1
No packages are required to be fetched.
Check the integrity of packages downloaded? [y/N]: y
Integrity check was successful.

Загрузки не происходит. Файл остается поврежденным.

2. Уменьшаю размер загруженного файла (например, удалив в файле какой-либо символ). Имя файла остается прежним, размер уменьшен, архив .txz оказывается поврежденным.
Код:
pkg fetch -r FreeBSD -U -o . mc
The following packages will be fetched:

New packages to be FETCHED:
        mc-4.8.22_1 (2 MiB: 100.00% of the 2 MiB to download)

Number of packages to be fetched: 1

2 MiB to be downloaded.

Proceed with fetching packages? [y/N]: y
Fetching mc-4.8.22_1.txz: 100%    2 MiB   1.8MB/s    00:01   
pkg: mc-4.8.22_1 failed checksum from repository

Поврежденный файл удаляется. Если загружался не только файл mc, то дальнейшей загрузки не происходит так как работа pkg прерывается.

3. Увеличиваю размер загруженного файла (например, добавив в файл какой-либо символ). Имя файла остается прежним, размер увеличен, архив .txz оказывается поврежденным.
Код:
pkg fetch -r FreeBSD -U -o . mc
The following packages will be fetched:

New packages to be FETCHED:
        mc-4.8.22_1 (2 MiB: 100.00% of the 2 MiB to download)

Number of packages to be fetched: 1

2 MiB to be downloaded.

Proceed with fetching packages? [y/N]: y
pkg: cached package mc-4.8.22_1: size mismatch, fetching from remote
Fetching mc-4.8.22_1.txz: 100%    2 MiB 873.3kB/s    00:02   

Файл загружается, исправляя поврежденный файл. Если загружался не только файл mc, то загрузка продолжается.

Таким образом, pkg fetch хорошо загружает файлы в пустой каталог, но работает «странно», если файлы с такими именами уже есть. Получается, что для обновления существующего локального репозитория, команда pkg fetch в чистом виде не подходит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Чт 11 апр, 2019 6:48 pm 
Не в сети

Зарегистрирован: Ср 04 сен, 2013 10:58 pm
Сообщения: 17
Команда pkg fetch с параметром -d загружает указанные пакеты со всеми зависимостями. Извлечь список этих пакетов из вывода команды можно, но весьма неудобно, так как pkg fetch интерактивная команда, которая хочет общаться с пользователем. Кроме этого, хотелось бы знать контрольную сумму (sha256) этих пакетов для сравнения с суммами уже имеющихся пакетов. Все это можно найти в базе данных.
Код:
printf "%s\n\%s"  '.open /var/db/pkg/repo-FreeBSD.sqlite' 'pragma table_info(packages);' | pkg shell

0|id|INTEGER|0||1
1|origin|TEXT|0||0
2|name|TEXT|1||0
3|version|TEXT|1||0
4|comment|TEXT|1||0
5|desc|TEXT|1||0
6|osversion|TEXT|0||0
7|arch|TEXT|1||0
8|maintainer|TEXT|1||0
9|www|TEXT|0||0
10|prefix|TEXT|1||0
11|pkgsize|INTEGER|1||0
12|flatsize|INTEGER|1||0
13|licenselogic|INTEGER|1||0
14|cksum|TEXT|1||0
15|path|TEXT|1||0
16|pkg_format_version|INTEGER|0||0
17|manifestdigest|TEXT|0||0
18|olddigest|TEXT|0||0
19|dep_formula|TEXT|0||0
20|vital|INTEGER|1|0|0

В общем получился такой sql-запрос (удобнее писать в отдельном файле, например, query):
Код:
.open /var/db/pkg/repo-FreeBSD.sqlite
with recursive myCTE(origin) as (
  values ('ports-mgmt/pkg'),('x11/xorg'),('x11-wm/fluxbox')
  union
  select deps.origin from deps,myCTE where package_id in (select id from packages where origin=myCTE.origin)
)
select packages.origin, packages.name, packages.version, packages.cksum from packages, myCTE where packages.origin=myCTE.origin;

Выполняем команду:
Код:
cat query | pkg shell

И получаем нужный список.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пт 19 апр, 2019 8:05 pm 
Не в сети

Зарегистрирован: Ср 04 сен, 2013 10:58 pm
Сообщения: 17
Написал сценарий. Немного потестировал. Попробовал использовать построенный мини-репозиторий на «чистой» ОС. Вроде все работает. Выкладываю сценарий, может кому-нибудь будет интересно.

Сценарий miniRepo
Код:
#!/bin/sh

# Name: miniRepo
# Date: 14.03.2019
# Vers: 1.0
# Desc: Постороение мини-репозитория
#
# Параметры: $1 - текстовый файл со списком желаемых приложений
#                 (Приложения заносятся построчно в виде 'название' (name)
#                 или 'категория/название' (origin). Строки, начинающиеся
#                 с символа '#' игнорируются. Пустые строки также
#                 игнорируются)
#            $2 - путь к мини-репозиторию
#                 (Мини-репозиторий - локальный репозиторий, который является
#                 частью эталонного репозитория. Мини-репозиторий содержит
#                 все необходимые пакеты для установки желаемых приложений.
#                 На момент запуска скрипта может как отсутствовать -
#                 загрузятся все пакеты, так и существовать - загрузятся
#                 только отсутствующие пакеты, а ненужные удалятся)
#
# Принятые обозначения:
#            refRepo - эталонный репозиторий
#            minRepo - мини-репозиторий

# Название эталонного репозитория
repo='FreeBSD'
#repo='atHand'

manpage(){
  echo 'Usage:'
  echo '      miniRepo <file> <directory>'
  echo
  echo '      <file>      - file containing a list of preferred applications'
  echo '      <directory> - directory in which the local repository will be'
  echo '                    created/updated '
}

printf "\n%s\n\n" 'This is miniRepo'

# [1]
# Проверка входных параметров

if [ $# -ne 2 ] ; then
  manpage
  echo
  exit
fi

if [ ! -f $1 ] ; then
  echo 'Error:'
  echo "       File '$1' not found"
  echo
  exit
fi

if [ ! -d $2/All ] ; then
  echo 'Warning:'
  echo -n "       The '$2/All' directory does not exist. Create? [y/N]:"
  read ch
  case $ch in
  y)
    echo
    echo -n "Creating a directory '$2/All'..."
    mkdir -p $2/All 1>/dev/null 2>&1
    if [ $? -eq 0 ] ; then
      echo successfully
    else
      echo not successfully
      exit
    fi
    ;;
  *)
    printf "\n%s\n\n" "Execution stopped."
    exit
    ;;
  esac
fi

touch $2/All/some.tmp 1>/dev/null 2>&1
if [ $? -eq 0 ] ; then
  rm $2/All/some.tmp
else
  echo 'Error:'
  echo "      It is not possible to write anything to the '$2/All' directory"
  echo
  exit
fi


# [2]
# Сбор начальных сведений

# Получение информации о всех пакетах в refRepo в виде id|origin|name

pkg update -r $repo

if [ $? -ne 0 ] ; then
  echo
  echo 'Error:'
  echo '      Could not connect to remote repository. Execution aborted.'
  echo
  exit
fi

fPkgInRefRepoAll=allPkgInRefRepo

printf "%s\n%s" ".open /var/db/pkg/repo-${repo}.sqlite" 'select id,origin,name from packages;' | pkg shell > $fPkgInRefRepoAll

# Получение информации об уже имеющихся пакетах в каталоге $2/All

fPkgInMinRepo=pkgInMinRepo
> $fPkgInMinRepo

echo
echo "Inventory of existing packages in '$2/All' (it will take some time):"
path=`pwd`

c=`ls $2/All/ | grep "\.txz$" | wc -l`
if [ $c -ne 0 ] ; then
  cd $2/All
  sha256 -r *.txz | sort -o $path/$fPkgInMinRepo
  cd $path
  echo "There are $c packages in the '$2/All' directory"
else
  echo "Directory '$2/All' is currently empty"
fi


# [3]
# Разбор входного файла.
# Разделение списка приложений на два: обнаруженные/не обнаруженные в refRepo

# Приложения из списка желаемых, которые не удалось обнаружить в refRepo
fAppNotFound=notApp
> $fAppNotFound

cntApp=0
cntAppFound=0
cntAppNotFound=0

f=1

# id желаемых приложений, обнаруженных в refRepo, перечисленных через запятую
l=

for app in `sed 's/^[[:space:]]*//;/^$/d;/^#/d' $1`
do
  let cntApp=$cntApp+1 > /dev/null

  p=`sed -En "s%^([0-9]*)\|($app\|.*$|.*\|$app$)%\1%p" $fPkgInRefRepoAll`

  if [ -z $p ]
  then
    let cntAppNotFound=$cntAppNotFound+1 > /dev/null
    echo $app >> $fAppNotFound
  else
    let cntAppFound=$cntAppFound+1 > /dev/null
    if [ $f -eq 1 ]
    then
      l=$p
      f=0
    else
      l=$l\,$p
    fi
  fi
done

rm $fPkgInRefRepoAll

printf "\n%s\n%s" "Of the $cntApp specified applications, $cntAppFound were found and $cntAppNotFound were not found (Look at the list in the file '$fAppNotFound')." "Continue? [y/N]:"
read ch
case $ch in
y)
  ;;
*)
  printf "\n%s\n\n" "Execution stopped."
  rm $fPkgInMinRepo
  exit
;;
esac

# [4]
# Получение списка пакетов из refRepo, которые потребуются при установке
# желаемых приложений (с учетом зависимостей)

fPkgInRefRepo=pkgInRefRepo

# SQL-запрос к базе данных refRepo

printf "%s\n%s\n%s\n%s\n%s\n%s\n%s" \
".open /var/db/pkg/repo-${repo}.sqlite" \
"with recursive myCTE(name) as (" \
  "select name from packages where id in ($l)" \
  "union" \
  "select deps.name from deps,myCTE where package_id in (select id from packages where name=myCTE.name)" \
")" \
"select packages.name,packages.version,cksum from packages,myCTE where packages.name=myCTE.name;" | \
pkg shell | sed -n 's/^\(.*\)|\(.*\)|\(.*\)/\3 \1-\2.txz/p' | sort -o $fPkgInRefRepo

# [5]
# Сравнение списков файлов (из refRepo и из minRepo)

# Список существующих, но ненужных файлов, которые надо удалить из minRepo
fDeleteList=deleteList

# Построение списка удаления
comm -13 $fPkgInRefRepo $fPkgInMinRepo | sed -n 's/^.* \(.*txz\)/\1/p' > $fDeleteList

# Список файлов для загрузки из refRepo (может потребоваться при загрузке
# файлов при помощи внешних программ, например, aria2)
#fFetchList=fetchList
# Построение списка загрузки
#comm -23 $fPkgInRefRepo $fPkgInMinRepo | sed -n 's/^.* \(.*txz\)/\1/p' > $fFetchList

rm $fPkgInMinRepo
rm $fPkgInRefRepo

# Удаление лишних файлов
printf "%s %s %s" "Warning:" `cat $fDeleteList | wc -l` "files will be deleted (see '$fDeleteList'). Continue? [y/N]:"
read ch
case $ch in
y)
  cat $fDeleteList | xargs printf "$2/All/%s\n" | xargs rm
  ;;
*)
  printf "\n%s\n\n" "Execution stopped."
  exit
  ;;
esac

# Загрузка недостающих файлов
printf "%s\n%s" ".open /var/db/pkg/repo-${repo}.sqlite" "select name from packages where id in ($l);" | pkg shell | xargs pkg fetch -r $repo -U -y -d -o $2

rm $fDeleteList
#rm $fFetchList


# [6]
# Построение minRepo

printf "\n%s" "Create repository located in '$2'? [y/N]:"
read ch
case $ch in
y)
  pkg repo $2
  ;;
*)
  printf "\n%s\n\n" "Execution stopped."
  exit
  ;;
esac


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Сб 20 апр, 2019 12:35 am 
Не в сети

Зарегистрирован: Вс 05 июн, 2005 4:19 pm
Сообщения: 3147
Откуда: Мезозой Пангея
poudriere религия не позволяет использовать?

_________________
Ми можемо все - що здатні собі уявити!
uname -a
Linux nonamehost 5.0.15-zen-my-ksm-muqss+ #6 ZEN SMP Sat May 11 16:10:09 EEST 2019 x86_64 x86_64 x86_64 GNU/Linux


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Сб 20 апр, 2019 8:54 pm 
Не в сети

Зарегистрирован: Ср 04 сен, 2013 10:58 pm
Сообщения: 17
poudriere вроде бы из портов пакеты собирает. Если готовые пакеты устраивают, то наверно не нужно их собирать еще раз. Или poudriere умеет скачивать готовые пакеты?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Сб 20 апр, 2019 11:10 pm 
Не в сети

Зарегистрирован: Вс 05 июн, 2005 4:19 pm
Сообщения: 3147
Откуда: Мезозой Пангея
JBrown писал(а):
poudriere вроде бы из портов пакеты собирает. Если готовые пакеты устраивают, то наверно не нужно их собирать еще раз. Или poudriere умеет скачивать готовые пакеты?


дописать кусок кода в poudriere.d/hooks и poudriere сразу скачает нужные пакеты с оф реп - а потом пересоберет только те, в которых изменились зависимости.
либо можно man poudriere-bulk -F...
вариантов достаточно.

_________________
Ми можемо все - що здатні собі уявити!
uname -a
Linux nonamehost 5.0.15-zen-my-ksm-muqss+ #6 ZEN SMP Sat May 11 16:10:09 EEST 2019 x86_64 x86_64 x86_64 GNU/Linux


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа


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

Зарегистрированные пользователи: Bing [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика