LINUX.ORG.RU

Конфиг в /etc - локальная отладка

 ,


0

1

Сейчас я пишу некоторый скрипт на питоне, который берёт настройки из конфига в /etc. Пишу и отлаживаю я его локально, не из-под рута, соответственно у меня в /etc такого конфига не лежит.

Сейчас для удобства отладки я сделал так: скрипт в project/usr/bin, конфиг в project/etc/config, и он читает конфиг из пути ../../etc/config, предварительно сделав os.chdir(os.path.dirname(os.path.realpath(__file__))).

Есть ли какой-то способ сделать, чтобы он при отладке брал файлик своей папки, а в продакшене - из другой? Без таких вот ужасных костылей

★★★

Очевидный: $YOURBICICLENAME_CONFIG_FILE в окружении, при отсутствии — дефолтно юзать /etc/чтоугодно.

x3al ★★★★★ ()

Сделай модуль config.py, в нем - переменную rcpath; в продакшене тупо подменяй его.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Не, хочется чтобы можно было выкладывать в подакшен, ничего не меняя: checkout -> create package -> install

selivan ★★★ ()
Ответ на: комментарий от selivan

хочется чтобы можно было выкладывать в подакшен, ничего не меняя

Оставляя в проекте возможность использовать переменную среды для указания места конфига?

checkout -> create package -> install

Переписывание производится во время создания пакета. Можно, конечно, обойтись и merge, но, пожалуй, для тебя это слишком сложно %)

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)

Искать конфиг сначала в ~/.config

KivApple ★★★★★ ()
./run.sh
*** __init__.py ***
*** run.dev.py ***
#!/usr/bin/python3

import builtins

old_open = builtins.open
def proxy_open(file, *args, **kwargs):
  if '/etc/' == file[:5]:
    file = './'+file[5:]
  print('file: >%s<' % file)
  return old_open(file, *args, **kwargs)
builtins.open = proxy_open

import run
*** run.py ***
#!/usr/bin/python3

f = open('/etc/secret/file.txt', 'r')
print('qwe: '+f)
*** run.sh ***
#!/bin/bash

for i in *; do
  echo "*** $i ***"
  cat $i
done
anonymous ()

Usecase походит больше на chroot, ну, а так да как тут посоветовали опция выбора пути конфига.

Ip0 ★★★★ ()

Я делал config.py типа такого:

if hostname == 'mylaptop':
  # my laptop, activating debug mode
  ...
else:
  # this is production, dude
  ...

# common part for prod and devel
true_admin ★★★★★ ()
Ответ на: комментарий от tailgunner

Каждый раз что-то там мутить с svn? Неудобно и лениво.

К нему пришлось прикрутить опции командной строки, так что просто добавлю --config и смогу нормально отлаживаться.

selivan ★★★ ()
Ответ на: комментарий от true_admin

Как-то некрасиво. Но, пока скрипт правит только один человек - удобно.

selivan ★★★ ()
Ответ на: комментарий от selivan

Откуда ограничение на одного человека? Придумай свой триг «не-продакшена». В другом проекте я проверял на наличие файла ~/.devel, например.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Откуда ограничение на одного человека?

В скрипте решил что-то поправить мой коллега, у него другой hostname.

наличие файла ~/.devel

Тоже вариант. Просто меня смущает наличие каких-то неочевидных триггеров, из-за которых программа меняет своё поведение.

Например, был в mail такой исторический баг: при заданной переменной $interactive можно было выполнять из неё команды, даже если она запущена не в терминале. Если установить переменную и передать suidperl хитрое имя скрипта, то он пытался отправить отчёт об ошибке, содержащий имя скрипта, которое превращалось в команду на запуск программы от рута.

selivan ★★★ ()
Ответ на: комментарий от selivan

В скрипте решил что-то поправить мой коллега, у него другой hostname.

if hostname in [...] ....

Но решение плохо масштабируемое, да. Зато точно в продакшене не запустится в debug-режиме.

Просто меня смущает наличие каких-то неочевидных триггеров, из-за которых программа меняет своё поведение.

Передавай параметры явно через командную строку.

был в mail такой исторический баг

это из другой оперы

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Передавай параметры явно через командную строку.

Так в итоге и решил

selivan ★★★ ()
try:
    c = open("/etc/config")
except IOError:
    c = open("./config")
ximeric ()

Фейспалный тред, в сущности.

tailgunner ★★★★★ ()
Ответ на: комментарий от ximeric

Хотя можно и

fp = "/etc/config"
if not os.path.exists(fp):
    fp = "./config"
c = open(fp)

ximeric ()
Ответ на: комментарий от tailgunner

Фейспалный тред, в сущности.

Питонисты, сэр.

anonymous ()
Ответ на: комментарий от tailgunner

Пффф. Я вообще ни разу не программер, имею полное моральное право тупить и не знать основ

selivan ★★★ ()
Ответ на: комментарий от selivan

Он скорее всего имел в виду других комментаторов

buddhist ★★★★★ ()

А просто ключик ком.строки для указания конфига к скрипту добавить — не судьба? ./script.py --config=~/.config/script/script.cfg.

Portnov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.