Bug 7765 - wish:больше защиты от отсутствующих опций, как в etcnet 0.7.11-alt1
: wish:больше защиты от отсутствующих опций, как в etcnet 0.7.11-alt1
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/etcnet)
: unstable
: all Linux
: P2 enhancement
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2005-08-27 07:27 by
Modified: 2005-11-12 17:03 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2005-08-27 07:27:35
Помню... вывод на экран был совсем-совсем дикий  :-)
сетевые карточки из серии `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 From 2005-08-27 14:48:10 -------
Да, обработка ошибок не везде нормальная.
------- Comment #2 From 2005-11-10 01:59:10 -------
Единственное место, где type2group() использовалась без проверки возвращаемого
значения --- network.init:check(). Исправлено.
------- Comment #3 From 2005-11-10 11:45:04 -------
Защита добавлена.
------- Comment #4 From 2005-11-12 17:03:17 -------
http://etcnet.org/files/etcnet-0.8.0-alt0.10.noarch.rpm