2011-10-19

Борьба интеллекта пользователей с тупостью программистов :)

проблема:
при использовании штатных средств управления сетевым подключением (network-manager), есть некоторые неудобства:
1) переключение статика/динамика крайне сложное (под кде это только в последних двух релизах можно сделать без бубна)
2) при кратковременном потере линка (привет патчкордам с отломаными защелками) настройки интерфейса сбрасываются.
3) при уходе в спячку сброс
4) локальный прокси-кеш/банерорезка/анонимайзер теряют контакт с реальностью (не сразу отбнаруживают что днс-сервер доступен/изменился/недоступен)
5) системные сбои обычно приводят к полному отсутствию сети ( пока вручную не будет подправлен/удален /var/lib/NetworkManager/NetworkManager.state)
6) и т.д.

а так как network-manager у меня всегда вызывал устойчивый рвотный рефлекс, он был заменен на систему костылей:

1) /etc/network/interfaces:
auto eth0
iface eth0 inet manual
  up dhcpcd-bin -L -N eth0
  down dhcpcd-bin -k eth0

auto wlan0
iface wlan0 inet manual
  up wpa_supplicant -f /var/log/wpa_supplicant.log -dtK -C/var/run/wpa_supplicant.sock -c/etc/wpa_supplicant.conf -iwlan0 -Dwext -B && dhcpcd-bin -N -L -m 20 wlan0
  down dhcpcd-bin -k wlan0

2) /bin/renet:
#!/bin/bash
echo -n "Checking if interface is UP... "
DEVICE=${1:-eth0}
if [[ -n $(ip -o link show ${DEVICE} up) ]]; then
  echo "yes"
else
  echo "Interface is DOWN"
  exit 1
fi
DEFAULTROUTE=$( ip -4 route show to default dev ${DEVICE})
GW=${DEFAULTROUTE##default via }
if [[ ${GW} =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then
  echo -n "Checking if gateway ${GW} is accessible... "
  arping -qfc3 -I ${DEVICE} ${GW} 2>&1 > /dev/null
  REACHABLE=$?
  if [[ ${REACHABLE} != 0 ]]; then
    unset REACHABLE
    echo "no"
  else 
    echo "yes"
  fi
fi
if [[ ${REACHABLE} ]]; then
  echo "Refreshing lease"
  dhcpcd-bin -n -L ${DEVICE}
else
  echo "Restarting dhcpcd"
  dhcpcd-bin -k ${DEVICE}
  dhcpcd-bin -L ${DEVICE}
fi
echo "Refreshing squid3"
squid3 -k reconfigure

3) скрипт отрабатывающий спячку /etc/pm/sleep.d/30_renet
#!/bin/sh
# Restart networking

. "${PM_FUNCTIONS}"

[ -x $BINARY ] || exit $NA
[ -f $CONFIG ] || exit $NA

case "$1" in
  hibernate|suspend)
    # Do nothing
    ;;
  thaw|resume) 
    /bin/renet eth0
    pidof wpa_supplicant || /bin/renet wlan0
    ;;
  *) exit $NA
    ;;
esac

4) вручную править /etc/wpa_supplicant.conf

скрипты на гениальность/красивость не претендуют. но для меня они работают :)

Немає коментарів: