Bug 7765

Summary: wish:больше защиты от отсутствующих опций, как в etcnet 0.7.11-alt1
Product: Sisyphus Reporter: burov dmitry <the_arioch>
Component: etcnetAssignee: Mikhail Efremov <sem>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P2 CC: ldv, rider, sem, shaba, vseleznv
Version: unstable   
Hardware: all   
OS: Linux   

Description burov dmitry 2005-08-27 07:27:35 MSD
Помню... вывод на экран был совсем-совсем дикий  :-)
сетевые карточки из серии `ls / ` - весь набор директорий и файлов в корне :-)

Кууууча строк из-за наведенных ошибок, забили весь экранный буфер - не увидеть 
было первых.

(в сторону: Жаль, что в bash'e есть 2> но нет 2| :-) )

Получается, что etcnet очень незащищен от ошибок :-(

Отсюда две заморочки-пожелания:
  1) такие функции, как type2group и group2name, если к ним пришла ошибка 
(missing 1st arg или неопознанное значение или два и более аргументов), IMHO 
должны либо срочно прерывать весь скрипт, либо таки возвращать что-то 
неудобоваримое. Сейчас она получает пустую строку - возвращает также пустую 
строку - которая далее восрпинимается как нормальное значение - и пустая строка 
идёт дальше по цепочке наведенных ошибок. В результате добираемся до файловой 
системы, до корня... А если по ошибке, захотим что-то записать или стереть?
     Блин, сам ведь смотрел эти case сколько раз, морщился что нет умолчального 
варианта - да и только. Пока сам в стенку мордой не вписался.

  2) критические переменные, указывающие на файлы, такие как $SYSCTL должны 
проверяться на значение, это даже в TODO есть ;). Но запомнить все переменные и 
проверить их в одном месте - трудно, учитывая постоянное развитие etcnet.
Тогда давайте проверять в месте вызова.

Т.е. например у нас есть строчка
        $SYSCTL -p `profiled_filename /etc/net/sysctl.conf`
Вместо нее мы ставим
        IndirectRun SYSCTL -p `profiled_filename /etc/net/sysctl.conf`

Соотв. функция MustRun - как-то так выглядит:

IndirectRun () {
  local ExecFile=`eval  echo -n $\{$1\} `
# ecли все OK - теперь $ExecFile == $SYSCTL == /sbin/sysctl

  if [[ -x $ExecFile ]] ; then
     shift
     $ExecFile $*
     return $?
  else
     local err_msg="ERROR: Variable \$$1 expected to contain path to executable. 
"
     if [[ -z $ExecFile ]] ; then
        err_msg="$err_msg Instead it is empty!"
     else
        err_msg="$err_msg But the value is \"$ExecFile\" !!! "
     fi

     echo err_msg >&2
     echo err_msg

     exit 404
# жаль я не знаю как вывести еще и стэк вызовов функций :-(
  fi
}

Аналогично можно сделать функции, которая просто проинорирует пустую переменную, 
но запустить команду из переменной для не пустой.

Аналогично можно сделать функцию для выдачи stdout - для использования вместо 
cтрок типа SOME_VAR=`$SOME_COMMANDE some args`

Удачи! и спасибо за etcnet. 

PS: кстати, зачем задавать вручную путь к modprobe, если его можно взять из /
proc ?
Comment 1 Denis Ovsienko 2005-08-27 14:48:10 MSD
Да, обработка ошибок не везде нормальная.
Comment 2 Denis Ovsienko 2005-11-10 01:59:10 MSK
Единственное место, где type2group() использовалась без проверки возвращаемого
значения --- network.init:check(). Исправлено.
Comment 3 Denis Ovsienko 2005-11-10 11:45:04 MSK
Защита добавлена.