Bug 58950

Summary: Error resetting database при обновлении
Product: Sisyphus Reporter: Sergey V Turchin <zerg>
Component: stplrAssignee: Maxim Slipenko <maks1ms>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: maks1ms, maxim, pku
Version: unstable   
Hardware: x86_64   
OS: Linux   
Attachments:
Description Flags
скриншот
none
скриншот
none
скриншот none

Description Sergey V Turchin 2026-04-30 14:53:03 MSK
При обновлении на LiveCD с сохранением сессии получаем "Error resetting database" и 2 пакета stplr.

Воспроизводится на образе https://download.basealt.ru/pub/distributions/ALTLinux/p11/images/kworkstation/alt-kworkstation-11.3-live-x86_64.iso
Comment 1 Sergey V Turchin 2026-04-30 14:56:48 MSK
Created attachment 21239 [details]
скриншот
Comment 2 Sergey V Turchin 2026-04-30 14:57:01 MSK
Created attachment 21240 [details]
скриншот
Comment 3 Sergey V Turchin 2026-04-30 14:57:19 MSK
Created attachment 21241 [details]
скриншот
Comment 4 Sergey V Turchin 2026-04-30 15:00:09 MSK
Ну и apt после этого неработоспособен.
Comment 5 Sergey V Turchin 2026-04-30 15:02:31 MSK
На худой конец
%_bindir/%name migrate ||:
Comment 6 Maxim Slipenko 2026-04-30 19:11:40 MSK
Изучил в чем причина. Ошибка связана с тем, что в LiveCD образе /var/cache/stplr/db принадлежит root:root, что было не совсем ожидаемо.

Почему это произошло: migrate во время своей работы меняет пользователя с root на stapler-builder и мигрирует (если ее нет, то создает) БД. 
А т.к. во время сборки пакет ставится в fakeroot среду, то смена пользователя работает не совсем корректно.

Чтобы в hasher это не вызывало проблем:
- добавлю в migrate смену владельца на /var/cache/stplr/db, чтобы исправить миграцию;
- если до миграции база отсутствует, то и создаваться она не будет, чтобы подобных проблем не возникало.

Исправлю в ближайшее время.
Comment 7 Sergey V Turchin 2026-05-01 13:36:10 MSK
(Ответ для Maxim Slipenko на комментарий #6)
> /var/cache/stplr/db принадлежит root:root, что было не совсем ожидаемо.
Еще можно упаковать пустую с нужными правами, тогда будет ожидаемо.
Это приемлемее, чем лишние манипуляции с правами.
Comment 8 Sergey V Turchin 2026-05-01 19:00:27 MSK
А почему база вообще создалась с правами root?
Может, исправить запуск %post, чтоб %_bindir/%name migrate не от root делался или вовремя переключался на нужного пользователя?
Comment 9 Sergey V Turchin 2026-05-01 19:07:47 MSK
(Ответ для Maxim Slipenko на комментарий #6)
> - добавлю в migrate смену владельца на /var/cache/stplr/db, чтобы исправить
> миграцию;
Возможно, правильнее это сделать post-триггером в пакете, чтоб срабатывал только при обновлении до исправленной версии.
Comment 10 Maxim Slipenko 2026-05-01 19:59:53 MSK
(Ответ для Sergey V Turchin на комментарий #8)
> А почему база вообще создалась с правами root?

fakeroot, используемый hasher, дает "root" через подмену системных вызовов (через LD_PRELOAD), поэтому setgid и setuid не делает реальную смену пользователя.

Короче говоря, этот C код:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("uid=%d euid=%d\n", getuid(), geteuid());
    setgid(923);
    setuid(923);
    printf("uid=%d euid=%d\n", getuid(), geteuid());
    FILE *f = fopen("/tmp/fakeroot_test.txt", "w");
    fprintf(f, "foo");
    fclose(f);
    return 0;
}

в системе сделает:

$ sudo ./a
uid=0 euid=0
uid=923 euid=923
$ ls -la /tmp/fakeroot_test.txt
-rw-r--r-- 1 stapler-builder stapler-builder 3 мая  1 19:35 /tmp/fakeroot_test.txt

А в hasher (hsh-shell --rooter):

[root@localhost .in]# /.in/a 
uid=0 euid=0
uid=923 euid=923
[root@localhost .in]# ls -la /tmp/fakeroot_test.txt 
-rw-r--r-- 1 root root 3 May  1 16:37 /tmp/fakeroot_test.txt

В программе на Go ситуация будет немного другая (там подмена через LD_PRELOAD не сработает), но итог такой же -- файл будет под root:root.
Comment 11 Sergey V Turchin 2026-05-02 08:19:12 MSK
Тогда, наверное, не создавать в migrate базу, если её не было и в %triggerin поправить права при обновлении до исправленной версии.
Comment 12 Sergey V Turchin 2026-05-02 09:27:43 MSK
Да, ещё:
* не запускать migrate вообще при установке пакета, а только при обновлении
* упаковать базу при помощи %gost, чтоб удалялась при удалении пакета
Comment 13 Maxim Slipenko 2026-05-02 16:36:22 MSK
Исправлено в 0.1.1-alt1
Comment 14 Sergey V Turchin 2026-05-03 09:37:17 MSK
Всё-таки рекомендую использовать %triggerin , чтоб каждый раз не делать chown при обновлении пакета.
Comment 15 Maxim Slipenko 2026-05-03 09:56:13 MSK
(Ответ для Sergey V Turchin на комментарий #14)
> Всё-таки рекомендую использовать %triggerin , чтоб каждый раз не делать
> chown при обновлении пакета.

Мне не совсем очевидно, как это должно работать.
Если сделать в %triggerin = 0.1.1, то при обновлении 0.0.31 -> 0.2.0 это же не сработает, ведь так?
А если в %triggerin -- %name >= 0.1.1, то это не отличается от %post.

Может быть стоит %triggerun -- %name < 0.1.1, но тогда и migrate должен быть в %triggerun -- %name. 
Но, кажется, при этом подходе у меня не получилось что-то.
Comment 16 Sergey V Turchin 2026-05-03 12:59:22 MSK
(Ответ для Maxim Slipenko на комментарий #15)
> Мне не совсем очевидно, как это должно работать.
В документации по rpm всё есть. Сработает ровно тогда, когда укажете.
Comment 17 Sergey V Turchin 2026-05-03 13:00:55 MSK
Где-то был репозиторий со всеми spec-ами. grep-ните там примеры.