Comments 10
Можно же не WebDAV, а просто POST или PUT. И прикрутить обработку этого POST/PUT.
Или оставить WebDAV и прикрутить обработку PUT.
PS. хотя с inotify прикольней, конечно.
inotifywait
лучше натравливать не на событие create
, а на close_write
, а то можно получить ошибки из-за недокачанных файлов. Хотя всё равно можно получить, если залить сразу пачку PRMок так, чтобы createrepo уже стартанул, а файлы ещё качались.
Традиционный способ добавить файл в папку атомарно — качать его во временную папку нпа той же ФС (или в эту папку, но под временным именем) и потом перемещать/переименовывать.
а чем плох ftp под эти нужды?
вроде бы классика?
www.redhat.com/sysadmin/ftp-yum-dnf-repository
Имхо, как-то все переусложнено у вас, скриптами, бесконечными циклами… пакетами в репозитории.
yum install incron -y
echo root > /etc/incron.allow
echo "${REPO} IN_CLOSE_WRITE,IN_DELETE /usr/bin/createrepo --update "${REPO}" > /var/spool/incron/root
systemctl restart incrond
profit?
Понятно, что всякие условия гонки могут возникать… и лучше всего триггер вешать на один файл.
Но это уже можно дать на откуп автоматизации. Если что-то билдит и заливает десятки файлов, то ничего не стоит сделать одно касание файлу-маркеру.
Вещь хорошая. Но
Нет исключения директорий. Или я не нашел. Incron зациклился
incrond[40907]: PATH (/var/www/repos/repo) FILE (.olddata) EVENT (IN_DELETE,IN_ISDIR)
incrond[40907]: (root) CMD (/usr/bin/createrepo --update /var/www/repos/repo)
Похоже нет блокировок или lock.
python[41022]: detected unhandled Python exception in '/usr/share/createrepo/genpkgmetadata.py'
я про это и говорил
> и лучше всего триггер вешать на один файл.
>… касание файлу-маркеру.
если развернуть эту мысль (псевдокод, возможны ошибки):
# incron
${REPO}/x86_64 IN_CLOSE_WRITE,IN_DELETE /usr/bin/touch /tmp/need_create
${REPO}/SRPMS IN_CLOSE_WRITE,IN_DELETE /usr/bin/touch /tmp/need_create
# crontab
SHELL=/bin/bash
REPO=/var/www/repos/repo
* * * * * repouser [ /tmp/need_create -nt /tmp/last_create ] && flock -xn /tmp/createrepo.lock -c "cp -a /tmp/need_create /tmp/last_create; /usr/bin/createrepo --update ${REPO};"
как-то так
UPD: ну, а вообще, если загружаемый файл изменяется после загрузки, т.е есть `rpmsign` перед `createrepo`, то правильнее загружать файл в отдельную папку… и после подписи складывать в нужное место.
- в Sonatype "t" прописная.
- Высокая доступность (high availability) является платной, потому что это критическая фича, которую вы, скорее всего, продолбаете (потому что это сложно).
- Посмотрите на Artifactory, там тоже high availability за деньги, но работает.
Простой rpm репозиторий используя Inotify и webdav