1. bash / Говнокод #26476

    +1

    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, 07 Марта 2020

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

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

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

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

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