Создать свой локальный репозиторий pkg

После сборки пакетов в tinderbox хочется инсталироваться с собственного репозитория pkg repository.

Для начала рассмотрим создание метапакета из собственного порта, а затем как создать свой репозиторий pkg.

Метапакет позволит нам установить кучу пакетов одной командой установки этого метапакета.

Наш метапорт:

# cd /usr/local/tinderbox

# cat portstrees/FreeBSD-ports-test10/ports/misc/project-rc-bind/Makefile

#
# $Id: Makefile 795 2012-06-11 16:26:54Z gjb $
#
PORTNAME= project-rc-bind
PORTVERSION= 1.0
CATEGORIES= misc
MASTER_SITES= # Empty
DISTFILES= # None
MAINTAINER= me
COMMENT= LOCAL Metaport for default laptop software

NO_BUILD= YES

BUILD_DEPENDS=

BUILD_DEPENDS+= \
                python:${PORTSDIR}/lang/python \
                puppet:${PORTSDIR}/sysutils/puppet38 \
                nrpe2:${PORTSDIR}/net-mgmt/nrpe-ssl \
                named:${PORTSDIR}/dns/bind99 \
                bash:${PORTSDIR}/shells/bash \
                sudo:${PORTSDIR}/security/sudo \
                vim:${PORTSDIR}/editors/vim-lite

RUN_DEPENDS=
RUN_DEPENDS+= \
                python:${PORTSDIR}/lang/python \
                puppet:${PORTSDIR}/sysutils/puppet38 \
                nrpe2:${PORTSDIR}/net-mgmt/nrpe-ssl \
                named:${PORTSDIR}/dns/bind99 \
                bash:${PORTSDIR}/shells/bash \
                sudo:${PORTSDIR}/security/sudo \
                vim:${PORTSDIR}/editors/vim-lite

DEPENDS= ${PORTSDIR}/net-mgmt/nagios-plugins

# Essential software

do-install:

.include <bsd.port.mk> 


Поясню немного что есть что:

RUN_DEPENDS
В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir[:target], где path - это имя программы или файла, а dir - каталог, в котором можно найти порт в случае, если его нет в системе, и target - это цель, которую нужно вызвать в этом каталоге. Если path начинается со слэша (/), он воспринимается как файл и его существование проверяется командой test -e; в противном случае предполагается, что это выполнимый файл и для определения того, имеется ли программа в пути поиска пользователя, используется команда which -s.

Например,

RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80

проверит, существует ли файл или каталог /usr/local/etc/innd и построит и установит его из подкаталога news/inn дерева портов, если он не будет найден. Он также проверит, имеется ли выполнимый файл с именем wish8.0 в вашем пути поиска, перейдет в подкаталог x11-toolkits/tk80 вашего дерева портов для его построения и установки, если он не будет найден.

BUILD_DEPENDS
В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и RUN_DEPENDS, это список пар path:dir[:target] Например,

BUILD_DEPENDS=unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие выполнимого фала с именем unzip и перейдет в подкаталог archivers/unzip вашего дерева портов для его построения и установки, если последний не будет найден.

DEPENDS
Если имеется зависимость, которая не подпадает ни под одну из вышеперечисленных четырех категорий, или ваш порт требует наличия исходных текстов другого порта в распакованном виде кроме того, что этот порт должен быть установлен, то воспользуйтесь этой переменной. Это список пар dir[:target], потому что, в отличие от предыдущих случаев, ничего не проверяется. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

Теперь можно собрать метапакет из порта. Как это сделать подробно указано в статье  Установка и настройка tinderbox

Итак, метапакет собран. Остается сделать свой репозиторий, подписать пакеты и распространить пакеты на целевую машину.

Я использую 4096-битный RSA ключ для подписания репозитория пакетов. Ключ создается с помощью команды OpenSSL:

# openssl genrsa -out pkg.key 4096

Затем создаем  из сгенерированного ключа сертификат для распространения среди машин, использующих репозиторий:

# openssl rsa -in pkg.key -pubout > pkg.cert

Имя файла сертификата, в моем случае pkg.cert, должно совпадать с именем файла, установленное как PUBKEY в /usr/local/etc/pkg.conf 

Затем пакеты сборки Tinderbox подписываем с закрытым ключом RSA:

# pkg repo /usr/local/tinderbox/packages/corp-resolvers-bind998/All/ /path/to/pkg.key

Готово. Идем на машину клиент:

Правим pkg.conf и обновляем информацию о репозитории пакетов:

# cat /etc/pkg/FreeBSD.conf

 FreeBSD: {

url: "http://tinderbox-ng.infra.local.ru//packages/corp-resolvers-bind998/",

mirror_type: "srv",

enabled: yes

}

# pkg update

# pkg upgrade

# pkg install пакет

 

 

unix-way