Сценарий Nodejs, инициированный systemd, не может связаться с SVN - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть скрипт Nodejs, работающий в Ubuntu, который служит HTTP-сервером (используя Express), и когда на сервере выполняется определенный POST, он пытается войти в SVN и выполнить команду svn info, используя командуследующий код:

svn_info = ["info", server, "--xml", "--non-interactive", "--username", svn_username, "--password", svn_password, "--no-auth-cache"];
output = spawnSync("svn", svn_info, { encoding: 'utf8' });
logger.debug(output.output);

Это прекрасно работает как автономный скрипт с использованием командной строки.Выполнение nodejs app.js и отправка соответствующего POST приводит к следующему (имена путей и т. Д. Здесь вручную заменены на «метки», заключенные в квадратные скобки):

<?xml version="1.0" encoding="UTF-8"?>
<info>
    <entry path="my_path" revision="67368" kind="dir">
        <url>https://[svn_server]/[root_path]/[relative_path]/my_path</url>
        <relative-url>^/[relative_path]/my_path</relative-url>
        <repository>
            <root>https://[svn_server]/[root_path]</root>
            <uuid>[UUID]</uuid>
        </repository>
        <commit revision="67334">
            <author>author@domain</author>
            <date>2019-02-07T15:33:15.806240Z</date>
        </commit>
    </entry>
</info>

Мой сценарий systemd, test_server.serviceвызывает скрипт Nodejs следующим образом:

[Unit]
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/nodejs /home/some_path/app.js

[Install]
WantedBy=multi-user.target

Когда скрипт запускается, либо с помощью команды boot, либо с помощью команды service test_server start, и создается такая же команда POST, я вижу следующее в моем файле журнала:

[2019-02-08T15:25:19.251Z] debug: ,<?xml version="1.0" encoding="UTF-8"?>
<info>
,svn: E170013: Unable to connect to a repository at URL 'https://[svn_server]/[root_path]/[relative_path]/my_path'
svn: E000111: Error running context: Connection refused

Скрипт запускается от имени пользователя root как из оболочки, так и при запуске systemd.Я изо всех сил пытаюсь понять, какая тонкая разница может привести к сбою сценария, когда он выполняется systemd.

1 Ответ

0 голосов
/ 05 марта 2019

tldr;

Оказывается, это не имеет ничего общего с кодом, размещенным выше.Это произошло потому, что компьютер, на котором запущен веб-сервер, находится в другой сети, чем компьютер, на котором работает сервер SVN.Этим двум разрешено общаться только через прокси-сервер, который необходимо установить в файле ~/.subversion/servers.

Более длинная история

При входе в систему как "user1msgstr "этот пользователь правильно настроил прокси-сервер SVN в файле ~/.subversion/servers.Запуск sudo svn info для репозитория SVN работал, вероятно, потому, что использовался тот же файл ~/.subversion/servers.

Если я использовал sudo -i (который запускается как «root», со всеми переменными среды, установленными так, как будто явошли в систему как "root") Я обнаружил, что, конечно же, при использовании svn info я получил ошибку "Connection отказано".

После редактирования файла ~/.subversion/servers для использования правильного прокси:

[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = defaultproxy.whatever.com
http-proxy-port = 7000

Все отлично работало!

...