Pull to refresh

Comments 10

Можно же не WebDAV, а просто POST или PUT. И прикрутить обработку этого POST/PUT.
Или оставить WebDAV и прикрутить обработку PUT.
PS. хотя с inotify прикольней, конечно.

inotifywait лучше натравливать не на событие create, а на close_write, а то можно получить ошибки из-за недокачанных файлов. Хотя всё равно можно получить, если залить сразу пачку PRMок так, чтобы createrepo уже стартанул, а файлы ещё качались.


Традиционный способ добавить файл в папку атомарно — качать его во временную папку нпа той же ФС (или в эту папку, но под временным именем) и потом перемещать/переименовывать.

Заменил create на close_write. Спасибо.
Я тестировал заливал несколько rpm — все работало.

Я тестировал заливал несколько rpm — все работало

В одно лицо полдесятка мелких rpm на localhost — я бы тоже работал.

Кстати тоже не нашел ни одной более менее полной реализации webdav кроме апача.

Имхо, как-то все переусложнено у вас, скриптами, бесконечными циклами… пакетами в репозитории.


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 зациклился

я про это и говорил

> и лучше всего триггер вешать на один файл.
>… касание файлу-маркеру.

если развернуть эту мысль (псевдокод, возможны ошибки):

# 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`, то правильнее загружать файл в отдельную папку… и после подписи складывать в нужное место.
  1. в Sonatype "t" прописная.
  2. Высокая доступность (high availability) является платной, потому что это критическая фича, которую вы, скорее всего, продолбаете (потому что это сложно).
  3. Посмотрите на Artifactory, там тоже high availability за деньги, но работает.
Sign up to leave a comment.

Articles