crower: (Crower)
[personal profile] crower
Напомню предысторию. Решил использовать fossil для учёта изменений станционных данных.
Робот регулярно собирает конфигурацию в разные лог-файлы. Это ужасно полезно для выяснения когда какие изменения появились и что было до этого, и самое главное — позволяет по дате найти распоряжения на основании которых эти изменения вносились. Была бы моя воля, я бы заставил всех вести в электронном виде журнал изменений и туда же прикладывать распоряжения на основании которых они вносились.
Но увы, это не в моих силах, и к настоящему времени уже накоплено два шкафа с папками за почти два десятка лет и все продолжают следовать этой методике.

В результате родилась такая идея: робот снимает со станции нужные настройки в логи, а фосилом они комитятся в репу.
Всё замечательно, но…

Возникла проблема: если комитить руками - все прекрасно работает, а если запускать тот же фосил через крон, то он ругается: "fossil: not within an open checkout".
cd path перед фосилом я сразу попробовал — не помогло.
Проверял pwd перед этим — находится где надо.
set > env_data.txt снимал и сравнивал с тем что под логином. Ну, это как небо и земля. Первый куцый (36 строк), второй перегружен взякой хренотенью (11679), которую, похоже, разные проги для себя прописывают. Теперь я понимаю почему когда я захожу на trustics, то интерпретатор появляется мгновенно, а когда на ебунту, то проходит секунды две. Эх, надо будет как-нибудь почистить.
Что там сравнивать непонятно. Из того что там было, PATH различался, конечно, ­— в первом только /usr/bin:/bin, а во втором их в 4 раза больше, включая юзерские пути. И вот тут-то бы и призадуматься, но остановился на том, что: "фосил же запускается? значит путь к нему есть."
И лежала эта проблема несколько месяцев. Временами проскакивали идеи и я их проверял. Ходил на фосиловый сайт и искал разгадку там. Всё безуспешно.
Пока не посетила очередная идея запустить эту заразу через strace. Что имеем в сухом остатке:
...
access("/home/user", W_OK)              = 0
access("/home/user/_FOSSIL_", F_OK)     = -1 ENOENT (No such file or directory)
access("/home/user/.fos", F_OK)         = -1 ENOENT (No such file or directory)
access("/home", W_OK)                   = -1 EACCES (Permission denied)
brk(0)                                  = 0x9d86000


Понятно что ищет открытый чекаут. Ага, _FOSSIL_ — это ещё старый формат, ищет для совместимости. .fos — не понятно, ибо если .fossil, то там всякие настройки всех репок и всех чекаутов, а если нужен текущий чекаут, то вот он лежит, но называется .fslckout. Наружу его, понятное дело, не пустили, а то он и в корне может чекаут искать.
Гадать не хочется. А что в работающей схеме?
...
getcwd("/home/user", 1979)              = 13
access("/home/user/_FOSSIL_", F_OK)     = -1 ENOENT (No such file or directory)
access("/home/user/.fslckout", F_OK)    = 0
stat64("/home/user/.fslckout", {st_mode=S_IFREG|0666, st_size=104448, ...}) = 0
...


Постойте. А почему это в первом варианте он ищет .fos, а во втором — .fslckout?
Может потому что во втором не пытается получить доступ на запись к юзерской папке?
Гадать можно сколько угодно, но изучать и сравнивать 8 метров лога из под залогиненого фосила против 7 кил лога закроненого фосила не только лениво, но и просто не красиво. Надо это дело упростить и mcdiff нам в помощь. И о чудо!
Вы только не сильно ржите. ;)
Закроненый фосил:
execve("/usr/bin/fossil", ["fossil", "com", "-m", …

Залогиненый фосил:
execve("/home/user/bin/fossil", ["fossil", "com", "-m", …


Вот так открывается ларчик. Я уж и не помню что именно там понадобилось, но фосил из штатного пакета 1.21, а собранный вручную и юзерски доставленный - 1.30. И в путях залогиненных ~/bin впереди /usr/bin.
И ведь в кроне-то я прописываю полные пути, а тут из крона скрипт запускается, а там...
Вот такое свинство.

Profile

crower: (Default)
crower

February 2018

S M T W T F S
    123
45678910
11121314151617
181920212223 24
25262728   

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 27th, 2026 03:13 am
Powered by Dreamwidth Studios