Beri bash i ebash / Говнокод #26476 Ссылка на оригинал

0

  1. 1
grep '^-'  /mnt/etc/roskomhui.txt | cut -d' ' -f2  |  sed 's|^\([^/]*\)$|\1/32|'  | xargs -n1 ipcalc | awk -e '{if ($1=="Address:") ADDR=$2; if ($1=="Netmask:") print "route add " ADDR" mask "$2" 172.16.1.2" }'

На старом роутере у меня бы opkg и openvpn с сервачком за пределами России.
Список префиксов, на которые я хотел ходить через него, хранился в файле roskomhui.txt и имел формат

# petuh
-net 1.2.3.0/24 
-host 1.2.3.4

# foo


Файлик этот обрабатывался скриптом при подключении OpenVPN, который делал примерно следующее:
grep '^-' /opt/etc/roskomhui.txt  | xargs -n2 -icmd echo route add cmd gw $REMOTE_VPN_ADDR | sh


На новом роутере оказался встроенный OpenVPN, и смысл в opkg отпал. Но как завернуть нужный траффик в впн без шела? (я вкурсе про push, но мне важно было это сделать именно локально).

Оказалось, что роутер умеет загружать маршруты из файла прямо через веб-морду, но формат там должен быть как у виндового батника
route add 1.2.3.4 255.255.255.255 %ADDR%


Для решения её и был написал скрипт (сам файлик хранился на флешке, потому он в mnt)
Хосты с помощью седа (в исходнике они без масок) превратились в /32, чтобы их понял ipcalc.
После ipcalc превратил маски в формате /bits в четырехбайтовые маски, и наконец awk -- единственный стейтфул товарищ в этом конвеере -- связал адрес с маской из выхлопа ipcalc.

А как поступили бы вы?

Запостил: MAKAKA MAKAKA, (Updated )

Комментарии (5) RSS

  • Аплодирую автору четырьмя руками.

    Я ленивая обезьяна. Обычно я просто не смотрю заблокированные сайты.
    Ответить
      • Точно. «grep», «sed», «awk», «xargs» –— это программы для прыщеадминов. Программист не должен уметь ими пользоваться.
        Ответить
  • > как поступили бы вы?

    Не ходим мы на заблокированные сайты, товарищ майор.
    Ответить
  • 1) Использовал YAML/JSON
    2) Переписал бы не в одну строчку
    3) В sed'e чтобы не экранировать круглые скобки можно добавть флаг -r
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8