LEDE (OpenWrt) felhasználó lettem

Az egész azzal kezdődött, hogy ismerősnek kellett router olcsón, eszembe jutott, lehetőleg legyen OpenWrt támogatása. Így esett a választásom a TP-Link TL-WR841ND v10 routerre bruttó 7146 Ft-ért. :) Annyira lelkesített a dolog, hogy másnap én is vettem magamnak egy ilyet, hiszen a régi több, mint 10 éves, a gyártó - SMC - már rég nem biztosít hozzá firmware támogatást. Ma már tudom, hogy célszerű sok flash-sel és sok RAM-mal megáldott példányt venni, amin van USB port is. Mindegy, amire nekem kell, arra egyelőre ez a picike is elegendő.

Itt a HUP-on akadtam a hírre, hogy az OpenWrt-t forkolták, a project neve LEDE, ez utóbbinak a csomagjai újabbak, például a legfrissebb longterm kernelt szállítja. Mivel a LEDE az OpenWrt-ből származik, s elsősorban a csomagok újabb mivolta a különbség, igen jelentős a két disztribúció közötti kompatibilitás, így lényegében minden információ, amelyet az OpenWrt honlapján vagy azzal kapcsolatban találunk, alkalmazható a LEDE-re is.

A hardware-hez tartozó image kiválasztásában ez az oldal segített: Table of Hardware.

Nekem ezt az oldalt kellett szemügyre vennem. Ebből kiderül, hogy a routeremben van 4 MiB soros elérésű flash - na jó, a soros, SPI-n keresztül történő elérés nem ebből derül ki :) -, valamint 32 MiB DRAM. Ez igen szűkös, nagyjából az alsó határa annak, hogy OpenWrt-t illetve LEDE-t futtassunk. A 650 MHz-es CPU viszont sima otthoni felhasználáshoz bőven elegendőnek bizonyul.

LEDE image-et naponta csinálnak, tehát garantáltan friss. Az első alkalommal, amikor a gyári firmware-ről upgrade-elünk webes felületen, akkor a factory image-re, míg a későbbiekben a sysupgrade képfile-ra lesz szükségünk. Nagyon fontos, hogy a firmware upgrade-et kizárólag UTP kábelen végezzük! A wifi egy rádiós kapcsolat, semmi sem garantálja azt, hogy nem következik be rádiós zavar, ráadásul ez a frekvenciatartomány nem dedikáltan wifi átvitelre van fenntartva, tehát más célra is használhatják. A tápfeszültséget se vagyük el a router-től, hiszen a jelenlegi firmware RAM-ból fut, a flash-t már elkezdtük felülírni. A tápfeszültség elmúlásával a RAM törlődik, bekapcsolást követően flash-ből kerül az operációs rendszer a RAM-ba - már feltéve, hogy az teljes egészében a flash-ben van már.

Alapértelmezetten a 192.168.1.1/24-es címen érhető el a router, ide root-ként lehet rá ssh-val belépni, majd passwd paranccsal jelszót adni neki. Az ssh alap helyzetben csak a LAN-ról érhető el, kintről, a WAN oldalról nem. Természetesen lehet olyan tűzfal szabályt készíteni, hogy a routerünket távolról elérjük.

A file-ok tárolásáról érdemes tudni, hogy van egy nagyon erősen tömörített squashfs image, valamint egy overlayfs jffs2-re formázva. Ezt úgy kell elképzelni, hogy az egész rootfs az overlayfs, amelynek a bázisát a squashfs adja, s amit módosítunk, az az overlayfs upper-ben kerül eltárolásra, ám 4 MiB flash esetén itt nagyon kevés helyünk van. Mindösszesen néhány száz kilobyte. Ezen felül a /tmp az tmpfs, de tekintve, hogy nincs swap, ez egyben azt is jelenti, hogy teljes egészében RAM disk.

Itt mindjárt megemlítek egy fontos tényt: ha letörlünk egy olyan programot, file-t, ami a squasfs image-ben van, nem szabadul fel hely, sőt, még foglalódik. Ennek az az oka, hogy a squashfs image-ből értelemszerűen nem tudunk törölni, az overlayfs upper-be pedig be kell jegyezni, hogy az általunk törölt file-ok ne látszódjanak, tehát azok törölve vannak. Amennyiben valaki úgy szeretne helyet felszabadítani, hogy az image-ből törölni szeretne számára szükségtelen csomagokat, annak saját image-et kell készítenie. Erre megvannak a megfelelő eszközök.

Az én esetemben nagyon kevés software telepítésére volt még hely.

A csomagleírókat le kell tölteni, illetve aktualizálni kell, de ehhez kevés lehet a RAM, így én előbb vi-jal töröltem két sort a /etc/opkg/distfeeds.conf file-ból. Az egyik a telephony, a másik a luci csomagjait tartalmazza. Tehát:

cd /etc/opkg
cp distfeeds.conf distfeeds.conf.orig
vi distfeeds.conf

Nem kell insert mód, ráállunk a törlendő sorra, majd "dd" - idézőjelek nélkül. Utána ":wq", s mentettük a file-t. Nézzük, mit csináltunk:

cat distfeeds.conf

Most már készülhetünk a telepítésre, értelemszerűen internet elérés kell a routernek WAN oldalról:

opkg update
opkg install ddns-scripts etherwake mailsend-nossl nano shadow-su

Nekem ezekre volt szükségem, s nem utolsó sorban helyem. Az mc, vagy például az openssl már nem fért fel.

;--------------------- Folytatás 1 --------------------------

A dokumentáció szerint támogatott a konfigurációs állományok uci segítségével történő módosítgatása, de megengedett a konfigfile-ok közvetlen, manuális szerkesztése is. Az előbbi inkább scriptből, az utóbbi pedig interaktív módon, szövegszerkesztővel célszerű. Viszont közvetlen szerkesztés esetén nem kapunk visszajelzést az esetleges hibákról. Konfigurációs állomány szerkesztését követően újra kell indítani a hozzá tartozó init scriptet is, ha a módosítások érvényre juttatását szeretnénk. Tehát például szerkesztjük a /etc/config/firewall file-t, ezt követően adjuk ki a

/etc/init.d/firewall restart

parancsot. Fontos, hogy a crontab szerkesztését követően szintén csak akkor jut érvényre az új crontab, ha újraindítjuk a cron-t.

Mivel nem tartom túl jónak, hogy a root ssh-n közvetlenül elérje a router-t, így kitiltottam a root ssh-t, és létrehoztam egy saját felhasználót:

echo 'locsemege:x:1000:locsemege' >>/etc/group
echo 'locsemege:x:1000:1000:Zab:/home/locsemege:/bin/ash' >>/etc/passwd
mkdir -p /home/locsemege
chown locsemege:root /home/locsemege
chmod 0700 /root /home/locsemege
passwd locsemege

Aztán megadjuk a kívánt jelszót. A dropbear nevű ssh szerver konfigurációs file-jában többek között az alábbi sorok szerepelnek:

option RootPasswordAuth 'off'
option RootLogin 0

Image frissítés előtt ezeket át kell írni on-ra illetve 1-re. Természetesen nem a 22-es porton figyel az ssh kliens. Ha azt szeretnénk, hogy WAN oldalról be lehessen rá ssh-n lépni, akkor kell egy ilyen szabály a /etc/config/firewall file-ba:

config rule
        option enabled '1'
        option target 'ACCEPT'
        option src 'wan'
        option proto 'tcp'
        option dest_port '22'
        option name 'ssh router'

Itt ugyan most a 22-es port szerepel, de értelemszerűen átírandó arra, ahol a dropbear hallgatózik.

Mivel nagyon jól jön adott esetben a saját gép távolról történő bekapcsolahatósága, az etherwake-et használom. Ehhez írtam az alábbi script-et a /usr/local/bin/wol file-ba:

#!/bin/sh

CONFIG='/usr/local/etc/wol.conf'
PRG='/usr/bin/etherwake'

MAC=''
[ -f "$CONFIG" ] && read MAC <"$CONFIG"
IN="${1:-empty}"
case "$IN" in
    -d|--default|default)
        if [ -z "$MAC" ]; then
            echo "Missing or invalid '$CONFIG' file" >&2
            exit 1
        fi
    ;;
    -h|--help|empty)
        echo -e '\t\x1b[37;1mwol\x1b[m [-h|--help|-d|--default|default|<MAC address>]\n' >&2
        if [ -z "$MAC" ]; then
            echo "Warning: Missing or invalid '$CONFIG' file" >&2
        fi
        [ "$IN" = 'empty' ] && exit 1
        exit 0
    ;;
    *)
        if [ -z "$MAC" ]; then
            echo "Warning: Missing or invalid '$CONFIG' file" >&2
        fi
        MAC="$IN"
    ;;
esac
[ -x "$PRG" ] && exec "$PRG" -b "$MAC"
echo "Missing '$PRG' command" >&2
exit 1

A /usr/local/etc/wol.conf file-ban az alapértelmezetten felélesztendő gép MAC címe legyen efféleképp:

05:27:49:6b:8d:af

Értelemszerűen ez egy példa MAC, nem valós.

A wireless interface be- illetve kikapcsolásához az alábbit írtam a /usr/local/bin/wireless file-ba:

#!/bin/sh

CONF='wireless'
KEY="$CONF.radio0.disabled"

setconf() {
    uci commit "$CONF"
    wifi &>/dev/null
}

duplicate() {
    if [ "${IN:0:1}" = '-' ]; then
        tp='switch'
    else
        tp='parameter'
    fi
    echo "Duplicated $tp: '$IN'" >&2
    exit 1
}

ssid=''
passphrase=''
_ssid=0
_passphrase=0
_get=0
_quiet=0
_help=0
_change=0
_on=0
_off=0
_status=0
subparm=0
parms=$#
while [ $# -gt 0 ]; do
    IN="$1"
    shift
    case "$subparm" in
        1)
            ssid="$IN"
            subparm=0
            continue
            ;;
        2)
            passphrase="$IN"
            subparm=0
            continue
            ;;
        3)
            get="$IN"
            subparm=0
            continue
            ;;
    esac
    case "$IN" in
        --ssid)
            [ ${_ssid} -eq 1 ] && duplicate
            _ssid=1
            subparm=1
            ;;
        --key|--passphrase)
            [ ${_passphrase} -eq 1 ] && duplicate
            _passphrase=1
            subparm=2
            ;;
        -q|--quiet)
            [ ${_quiet} -eq 1 ] && duplicate
            _quiet=1
            ;;
        -h|--help)
            [ ${_help} -eq 1 ] && duplicate
            _help=1
            ;;
        get)
            [ ${_get} -eq 1 ] && duplicate
            _get=1
            subparm=3
            ;;
        x|change|exchange)
            [ ${_change} -eq 1 ] && duplicate
            _change=1
            ;;
        1|on)
            [ ${_on} -eq 1 ] && duplicate
            _on=1
            ;;
        0|off)
            [ ${_off} -eq 1 ] && duplicate
            _off=1
            ;;
        state|status)
            [ ${_status} -eq 1 ] && duplicate
            _status=1
            ;;
    esac
done
case "$subparm" in
    1)
        echo 'Missing SSID' >&2
        exit 1
        ;;
    2)
        echo 'Missing PASSPHRASE' >&2
        exit 1
        ;;
    3)
        echo "Missing 'get' subparameter: ssid|passphrase|key" >&2
        exit 1
        ;;
esac
if [ ${_help} -eq 1 -o $parms -eq 0 ]; then
        echo -e '\t\x1b[37;1mwireless\x1b[m [-h|--help] [-q|--quiet] [--ssid <ssid>] [--key|--passphrase <passphrase>] [[state|status]|[1|on]|[0|off]|[change|exchange|x]|[get ssid|key|passphrase]]\n' >&2
        [ ${_quiet} -eq 0 -a $parms -ne 0 ]
        exit
fi
if [ ${_ssid} -eq 1 ] && ! echo "$ssid" | awk '/^[[:print:]]{1,32}$/ {exit 0;} {exit 1;}'; then
    echo 'Invalid SSID length or character set' >&2
    exit 1
fi
if [ ${_passphrase} -eq 1 ] && ! echo "$passphrase" | awk '/^[[:print:]]{8,63}$/ {exit 0;} {exit 1;}'; then
    echo 'Invalid PASSPHRASE length or character set' >&2
    exit 1
fi
vars="x${_get}${_status}${_on}${_off}${_change}"
case "$vars" in
    x00001)
        STATE=`uci get "$KEY"`
        if [ "$STATE" = 0 ]; then
            STATE=1
        else
            STATE=0
        fi
        uci set "$KEY=$STATE"
        ;;
    x00010)
        uci set "$KEY=1"
        ;;
    x00100)
        uci set "$KEY=0"
        ;;
    x01000)
        :
        ;;
    x10000)
        if [ "${_ssid}${_passphrase}" != '00' ]; then
            echo 'Invalid input parameters' >&2
            exit 1
        fi
        case "$get" in
            ssid)
                uci get 'wireless.@wifi-iface[0].ssid'
                ;;
            key|passphrase)
                uci get 'wireless.@wifi-iface[0].key'
                ;;
            *)
                echo "Invalid 'get' subparameter" >&2
                exit 1
                ;;
        esac
        ;;
    x00000)
        if [ "${_ssid}${_passphrase}" = '00' ]; then
            echo 'Invalid input parameters' >&2
            exit 1
        fi
        ;;
    *)
        echo 'Invalid input parameters' >&2
        exit 1
        ;;
esac
[ ${_ssid} -eq 1 ] && uci set "wireless.@wifi-iface[0].ssid=$ssid"
[ ${_passphrase} -eq 1 ] && uci set "wireless.@wifi-iface[0].key=$passphrase"
vars="x${_ssid}${_passphrase}${_on}${_off}${_change}"
[ "$vars" != 'x00000' ] && setconf
STATE="`uci get \"$KEY\"`"
a='OFF'
RETVAL=2
if [ "$STATE" = 0 ]; then
    a='ON'
    RETVAL=0
fi
[ ${_quiet} -eq 1 ] && exit $RETVAL
echo "Wireless interface is $a"
exit 0

Annak érdekében, hogy könnyen mentsem ezeket a scripteket, valamint a /etc tartalmát, továbbá az aktuális csomag listát, a /usr/local/bin/save file-om az alábbi:

#!/bin/sh

opkg list-installed >/tmp/installed.txt
FILE="/tmp/save-`date '+%F_%T'`.tar.gz"
tar -czf "$FILE" /etc/ /usr/local/ /tmp/installed.txt
rm /tmp/installed.txt
echo "File saved to '$FILE'"
exit 0

Ennek az eredményét a host-ról kezdeményezve a kapcsolatot a Midnight Commander Shell link nevű felületén kersztül - vagy scp-vel - másolom a router-ről a host-ra. Miután a file már a host-on van, a hely felszabadítása érdekében érdemes ezt a file-t a /tmp-ből törölni.

;--------------------- Folytatás 2 --------------------------

A /etc/profile file-hoz is hozzányultam. Egyfelől nekem kell, hogy az elérési útban legyen a /usr/local/bin, másfelől színes bejelntkező logót csináltam, továbbá színes root promptot, valamint nullától eltérő exit kód esetén a visszatérési értéket a promptba írom. De, ha ez nem lenne elég, Fedorán nevelkedtem, tehát hasonló stílusú prompt kell nekem. Meg aztán kell ashrc, ami alapból nincs, de a doksi beszél arról, hogyan legyen. A profile file-omból a releváns részletek:

EUID=`id -u`
if [ -f /etc/banner -a "$EUID" != 0 ]; then
    if [ -f /usr/local/etc/bannercolor -a -x /usr/local/bin/printbanner -a "${TERM:0:5}" = 'xterm' ]; then
        /usr/local/bin/printbanner -v colorfile=/usr/local/etc/bannercolor /etc/banner
    else
        cat /etc/banner
    fi
fi

Valamint:

export PATH="/usr/sbin:/usr/bin:/sbin:/bin"
export HOME=$(grep -e "^${USER:-root}:" /etc/passwd | cut -d ":" -f 6)
export HOME=${HOME:-/root}
export PATH="$HOME/bin:/usr/local/bin:$PATH"

RCFILE='/usr/local/etc/ashrc'
[ -f "$RCFILE" ] && export ENV="$RCFILE"

Ezek után álljon itt a /usr/local/etc/ashrc file is:

#!/bin/sh

export UID=`id -ur`
export EUID=`id -u`
case $- in
    *i*)
        if [ "${TERM:0:5}" = 'xterm' ]; then
            export PS1='$(RET=$?; COLOR="\[\e[m\]"; [ $EUID = 0 ] && COLOR="\[\e[32;1m\]"; echo -n "${COLOR}["; [ $RET -ne 0 ] && echo -n "\[\e[33;1m\]$RET$COLOR ")\u@\h \w]\$ \[\e[m\]'
        else
            export PS1='\u@\h:\w\$ '
        fi
        alias ll='ls -alF --color=auto'
esac

A logó színezését leíró /usr/local/etc/bannercolor file tartalma:

1  lred
2  2*lred 4*lgreen
3  lred lblue 2*lred 6*lgreen
4  lred lblue 2*lred 6*lgreen
5  lred lblue lred lgreen norm
6  2*lred lblue lred
7  lred lblue 2*lred yellow
8  lred lblue 2*lred lwhite 2*norm
9  lred yellow

Erről azt érdemes tudni, hogy a magában álló számok komment értékűek, az awk scriptem ignorálja őket, lényegében azért írtam oda, hogy lássam, a logó hanyadik sorára vonatkozik a színek megadása. A szóközt követő nem szóköz elé szúrja be az adott színkódot. Ugyanakkor azok a számok, amelyek után csillag áll, azok valóban szorzók. A 4*lgreen ugyanazt jelenti, mintha egymás után szóközökkel elválasztva négyszer leírtam volna azt, hogy lgreen.

Ezek után a színezést végző /usr/local/bin/printbanner awk script így néz ki:

#!/usr/bin/awk -f

BEGIN {
    a["norm"]="\x1b[m";
    a["black"]="\x1b[30m";
    a["red"]="\x1b[31m";
    a["green"]="\x1b[32m";
    a["brown"]="\x1b[33m";
    a["blue"]="\x1b[34m";
    a["magenta"]="\x1b[35m";
    a["cyan"]="\x1b[36m";
    a["white"]="\x1b[37m";
    a["lred"]="\x1b[31;1m";
    a["lgreen"]="\x1b[32;1m"
    a["yellow"]="\x1b[33;1m";
    a["lyellow"]=a["yellow"];
    a["lblue"]="\x1b[34;1m";
    a["lmagenta"]="\x1b[35;1m";
    a["pink"]=a["lmagenta"];
    a["lcyan"]="\x1b[36;1m";
    a["lwhite"]="\x1b[37;1m";
    s="";
    while (getline colors <colorfile) {
        tn=split(colors, t);
        for (i=1; i<=tn; i++) {
            un=split(t[i], u, /\*/);
            if (u[un] ~ /^[0-9]+$/) {
                continue;
            }
            if (un==2) {
                if (u[1] ~ /^[0-9]+$/) {
                    mul=int(u[1]);
                    if (mul>99) {
                        mul=99;
                    }
                } else {
                    mul=0;
                }
                for (j=0; j<mul; j++) {
                    s=s u[2] " ";
                }
            }
            if (un==1) {
                s=s u[1] " ";
            }
        }
    }
    colornum=split(s, c);
    FS="";
    p=1;
}

{
    s="";
    last=" ";
    for (i=1; i<=NF; i++) {
        if ($i!=" " && last==" ") {
            if (p<=colornum) {
                if (c[p] in a) {
                    s=s a[c[p]];
                } else {
                    s=s a["norm"];
                }
                p++;
            } else {
                s=s a["norm"];
            }
        }
        if ($i==" " && last!=" ") {
            s=s a["norm"];
        }
        s=s $i;
        last=$i;
    }
    s=s a["norm"];
    printf("%s\n", s);
}

Azt érdemes tudni, hogy a busybox awk implementáció nem ismeri a switch() case szerkezetet, így ezt nem lehet használni, ugyanakkor remek asszociatív tömb kezelése van az awk-nak, így aztán a switch() case-re nincs is szükség.

Tartozom még a futtatható állományok jogosultságaival. Mindenki root:root tulajdonban van, a printbanner script 0755 jogú, hiszen sima felhasználónak is futtatni kell a profile-ból, míg a többi scriptet csak a root futtathatja, így azokra (save, wireless, wol) 0744 jogot adtam.

;--------------------- Folytatás 3 --------------------------

Volt még két megoldandó probléma. Az egyik a dinamikus dns, ehhez feltelepítettem a ddns-scripts csomagot. Itt csak annyit jegyzek meg, hogy a service_name opció nem URL, hanem egy hivatkozás a /usr/lib/ddns/services file egyik leírójára. Ha itt nincs meg a template, akkor a szolgáltatás igényeinek megfelelően nekünk kell azt megírnunk.

A másik probléma, hogy a frissítéssel az ember megnyert egy rakás kellemetlenséget. Konfiguráció visszamentése, saját csomagok frissítést követő újratelepítése, sőt, lehet olyan csomag, amely már a belépéshez is kellene, de mivel nincs, figyelni kell a dropbear ideiglenes átkonfigurálására, hogy be lehessen lépni. Ez nekem kényelmetlen, erre kellett valami megoldás.

A megoldás az lett, hogy letöltöttem a lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz file-t, kitömörítettem, majd annak gyökerébe létrehoztam egy files alkönyvtárat, amelybe a mentésemből bemásoltam azokat a file-okat, amelyekre szükségem van, vagy módosítottam. Ezen felül szintén ennek a kicsomagolt anyagnak a gyökerébe írtam egy build nevű file-t az alábbi tartalommal:

#!/bin/bash

make clean
make image PROFILE='tl-wr841-v10' PACKAGES='coreutils-base64 ddns-scripts etherwake mailsend-nossl nano shadow-su uhttpd -ppp -ppp-mod-pppoe' FILES=files/

Ezt követően mondtam neki:

. build

Előállította a saját image-emet ennek az egésznek a gyökeréhez képest valahova a bin alkönyvtárba, pontosabban mélyebben, de meglesz az. A sok file közül a lede-ar71xx-generic-tl-wr841-v10-squashfs-sysupgrade.bin nevűre volt szükségem. Ezt követően ezt a file-t a router /tmp alkönyvtárába - ez tmpfs, tehát ebben az esetben RAM - másoltam. A dropbear konfigurációjában megengedő lettem, azaz a root login-t engedélyeztem. Nem kell újraindítani a dropbear-t, úgyis reboot után kellhet ez. Aztán vettem egy nagy levegőt, majd az alábbi parancsokkal éltem:

cd /tmp
sysupgrade -v lede-ar71xx-generic-tl-wr841-v10-squashfs-sysupgrade.bin

Mivel az image tartalmazza azon programokat, amelyeket fel kellett volna utólag telepíteni, aztán a saját scriptjeimet is, valamint a konfigurációs állományaimat, ideértve a shadow, passwd, group file-okat is, meg persze a /home/locsemege alkönyvtárat, egyből be tudtam lépni a régi jelszóval, nem root-ként, továbbá a színes banner fogadott. A dropbear beállításait újra szigorúbbra vettem, újraindítottam a dropbear ssh daemon-t, beállítottam a /home/locsemege és a /root jogait, mentést csináltam az aktuális konfigurációról, s most örülök, mert egész kevés munkával megúsztam a router frissítését.

;--------------------- Folytatás 4 --------------------------

Most ott tartok, hogy ha már nem fér fel a luci, de az uhttpd igen, néhány apróságnak megcsinálnám a webes állíthatóságát. Rögtön az első akadály az autentikáció. Mivel nem vagyok webprogramozó, fogalmam sem volt, hogyan kapom meg a httpd-től a POST-ot. Nem, PHP-re nincs helyem, szóval biztosan nem egy tömbben. :) Kiderült, a http daemon úgy hívja a CGI scriptet, hogy pipe-olja neki a POST-ot, valahogy úgy, hogy egy folytonos stream esik be, amely a form-ból jön, s key=value párokat tartalmaz '&' karakterekkel szeparálva. Speciális - például épp az '&' - karakterek %hh alakúak, ahol a '%' jel után két hexadecimális karakter az átvinni kívánt karakter ASCII-kódja. Mindegy is, felfaltam a problémát awk-val.

Azért volt benne kaland: hajtépést követő debugolás, majd doksi olvasás és kipróbálás során kiderült, hogy az ash nem ismeri a tömböket, így nem tudtam POST_KEY&lsqb;index&rsqb;='kulcs', POST_VALUE&lsqb;index&rsqb;='érték' formájú változókat létrehozni. Szerencsére ez megkerülhető, eval azért még van, így csináltam POST_KEY_0='kulcs0', POST_VALUE_0='érték0' típusú változókat a pipe-on beömlő borzalomból. Akit persze a szerver oldali scriptelés nem igazán hoz lázba, annak nem túl érdekes, amit az imént írtam.

;--------------------- Folytatás 5 --------------------------

Annak érdekében, hogy frissítés után a jogosultságokkal ne keljen bajlódni, a /etc/rc.local file tartalma ez lett:

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

law="`ls -ld /root | cut -d' ' -f1`"
if [ "$law" != 'drwx------' ]; then
    chmod 0700 /root
fi
user='locsemege'
workdir="/home/$user"
if [ -d "$workdir" ]; then
    law="`ls -ld \"$workdir\" | cut -d' ' -f1`"
    if [ "$law" != 'drwx------' ]; then
        chown -Rh "${user}:users" "$workdir"
        chmod 0700 "$workdir"
    fi
fi
daemons='etherwake'
for i in $daemons; do
    if [ -e /etc/rc.d/S*$i ]; then
        /etc/init.d/$i stop
        /etc/init.d/$i disable
    fi
done

exit 0

A változónevek én dolgom, nem beszólni, tudom. :) A daemons változóban szóközzel elválasztva azon szolgáltatások vannak, amelyeket tiltani és leállítani szeretnénk, miközben telepítve vannak.

Hozzászólások

Korábbi fórum topicod alapján nem értem a luci dolgot.

Ott azt írtad, hogy nem fér fel rá, ebből arra következtettem, hogy alapból nincs a képfájlban, valaki írta is, hogy az openWRT snapshot képfájlban sincs, csak a stable kiadásban.

Itt meg, hogy a lucit hogy kell törölni.

Most akkor van luci a snapshot képfájlban, vagy nincs? :P

Másik: a LEDE tervez stabil kiadást, vagy amolyan rolling marad napi snapshotokkal? A honlapjukon nem találtam erről semmi konkrétat, te tudsz erről valamit?

Megint másik: csomagkezelővel lehet frissen tartani, vagy ahhoz a sysupgrade képfájl kell?

Szerintem félreértettél. A luci nincs az image-ben. Nem kell tehát törölni. A distfeeds.conf a repository-t írja le, s a telefóniának és a lucinak a hivatkozását töröltem azért, mert ha minden marad, akkor letölti RAM-ba a csomaglistát, s már az olyan nagy lehet adott esetben, hogy out of memory lesz belőle. Most ugyan megnéztem, ezek néhány száz kilobyte-os file-ok, de lehet, hogy a függőségi fát építi fel, s akkor szalad tele a memória, nem tudom. Az a lényeg, hogy már az opkg update parancs sem futott le, odáig már el sem jutottam, hogy telepíthessek. Utánaolvastam, s azt javallották, a repók közül ki kell venni azt, ami nem kell. S valóban ez volt a megoldás. Mivel luci* dolgot nem akartam telepíteni, így a repóra sem volt szükségem.

Nem tudom, hogy terveznek-e a napi snapshot-on kívül mást is. Az az igazság, nekem ezzel semmi bajom, megy jól, frissek a csomagok.

Csomagkezelővel elvileg frissen lehetne tartani, ha van elég flash-ed, s az overlayfs upper-be elférnek a módosított file-ok. Ezek idővel nyilván egyre többen lesznek, szóval sok hely kell. Mivel alig több, mint 7000 Ft-ért egy routerben nincs sok memória, nekem egyedüli alternatíva a teljes image cseréje néha.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

sub

Köszi ez hasznos lesz. Ahogy látom Netgear R7000-re is van már valami berhelés (https://www.mail-archive.com/lede-dev@lists.infradead.org/msg02173.html) így lehet megpróbálkozok vele ugyanis az alap Netgear firmware egész gány, egy router restart konkrétan 2 percig tart és gyakorlatilag nincs olyan beállítás amit megúsznék restart nélkül, ami azért problémás mert gyakran mozgatom, otthon/koli/suli között és mindenütt más beállításokat szeret, koliban pl. meg vagyok lőve airtimes fairnesség miatt.

Lehetett volna, így jutott eszembe. Amúgy 0700-as jognál édesmindegy szerintem. Különben itt szinte csak root-ként lehet használni az eszközt, igazából csak azért csináltam felhasználót, mert talán nagyobb biztonság, ha nem tudják a felhasználónevet, s két jelszót kell kitalálni, mire gyökér lesz a támadó. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A mostani napi snapikban milyen verziójú kernel van?

Nagyon fontos, hogy a firmware upgrade-et kizárólag UTP kábelen végezzük! A wifi egy rádiós kapcsolat, semmi sem garantálja azt, hogy nem következik be rádiós zavar, ráadásul ez a frekvenciatartomány nem dedikáltan wifi átvitelre van fenntartva, tehát más célra is használhatják.

WAT

--
„Spiró ótvar, Konrád átok, Nádastól meg mindjárt hányok!”

Egy ideje keresem, mit jelent a szlengben ez a rövidítés, de nem sikerült megfejtenem, segíthetnél. Így igazából azt sem tudom, hogy az idézett két mondatommal nem értesz egyet, vagy helyesled.

Azt akartam írni, hogy rossz ötlet wifi-n firmware-t frissíteni, mert a rádiós kapcsolat bizonytalan, semmi sem garantálja annak megbízhatóságát, hiszen az elektromágneses teret bárki bárhogyan alakíthatja. Nincs olyan, hogy az a frekvencia illetve sávszélesség csak a tiéd arra az időre. A csavart érpár sem árnyékolt kábel, de szimmetrikus átvitel esetén a közös módusú zavarok nem igazán okoznak bajt, differenciális zavart pedig nehezen tudsz kívülről okozni.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Én is így tudom, sőt, én előbb az image-et átmásoltam a RAM-jába, s utána adtam ki a frissítő parancsot úgy, hogy azt az image-et töltse a flash-be, ami már helyben van a RAM-ban. Ettől függetlenül saját felelősségre, talán épp itt a HUP-on olvastam valakinek a segítségkérését, ami úgy kezdődött, hogy wifin frissített, de elveszítette a kapcsolatot közben a routerrel. Ilyenkor jön a pánik, mindent kikapcsol, újraindít, s épp ebből van a baj.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem gondolom teljesen értelmetlennek, amit írtam. Ugyan tudom, hogy az image már RAM-ban van, amikor frissítünk, az nem röptében történik - bár, ha jól emlékszem, ez utóbbira is van lehetőség -, ugyanakkor egy elhaló kapcsolat esetén könnyebb mellényúlni, bepánikolni, újraindítani. Minden attól függ, hogyan csinálja valaki. Amúgy nem vagyok érintett, a host UTP kábellel csatlakozik a routerhez, wifit csak akkor használok, ha van nálam gép karbantartásra. Okostelefonom nincs, még mielőtt ebbe történne a belekötés. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

> Azt akartam írni, hogy rossz ötlet wifi-n firmware-t frissíteni, mert a rádiós kapcsolat bizonytalan, semmi sem garantálja annak megbízhatóságát, hiszen az elektromágneses teret bárki bárhogyan alakíthatja.

Te jó ég! Ezek szerint valaki egy rádiós zavaróval átírhatja az e-mailjeimet? (Nem.) Avagy: ugyan okozhatsz zavart a fizikai rétegben, de a fölöte levő rétegekben ez detektálható, korrigálható. Detektálandó, korrigálandó. De ez a vezetékesre is igaz. Ott is bele lehet nyúlni, legfeljebb köztes állomás kell hozzá.

Mondhatni az érvelésed ebben a formában marhaságnak tűnik.

Ezt te állítod, nem én. Sehol nem írtam, hogy átírhatom az e-mailjeidet azzal, ha megakadályozom a csatorna használatát. Miért írtam volna ilyen hülyeséget? Igen, a TCP-nek valóban az a dolga, hogy átvigye az adatot hibátlanul. A felsőbb rétegek képesek ugyan CRC-t ellenőrizni, csomagot ismételni, nem képesek viszont a csodára, azaz a megszűnő, nem létező csatornán adat átvitelére. Tehát, ha teszem azt, az adott sávon sugárzok valamit, ami a spektrumot lefedi, kérheted újra és újra a csomagot, előbb-utóbb timeout lesz belőle. Vagy végtelen ciklus, de adatátvitel az nem.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Tény, hogy frissítésnél az új image másolása hálózaton RAM-ba, majd azt követően RAM-ból flash-be másolása elkülönül időben, így wifin történő frissítés sem okozhat problémát. Ugyanakkor lehetőség van arra, hogy a hálózaton küldött image-et közvetlenül a pipe bufferből írjuk a flash-be. Ez hasznos lehet, ha kevés a RAM, s az image nem fér a RAM-ba. Ebben az esetben bizony kifejezetten rossz ötlet Wifi-n intézni az upgrade-et.

http://hup.hu/node/73963&comments_per_page=9999#comment-816303

Valamint:

https://wiki.openwrt.org/doc/howto/generic.sysupgrade

Direct method

Netcat could be employed if you cannot free enough RAM. See netcat. Netcat needs to be installed first.

This method is NOT recommended!

On your Linux PC run:

nc -q0 192.168.1.1 1234 <openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin

On the router run:

nc -l -p 1234 | mtd write - firmware

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Frissült. Új tartalom „folytatás 3” után.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az én wake_on_lan script-em így néz ki:

#!/bin/sh

HOST_MAC="12:23:34:45:67:78";
HOST_NAME="host";

PING=`which ping`;
WOL=`which etherwake`;

$WOL $HOST_MAC;
while [ /bin/true ];
do
$PING -q -c 1 -w 1 $HOST_NAME >/dev/null 2>&1
if [ "$?" -eq 0 ];
then
break
fi
sleep 1
echo -n "."
done
echo "pingni pingik";

Opcionálisan a végén van egy ssh $HOST_NAME is, mert általában ez a következő lépés ilyenkor.

Én nem vagyok ilyen türelmetlen. Felébresztem, valamennyi idő a BIOS POST, aztán 5 másodperc a Grub, majd közel 15 másodperc, amíg eljut a bejelentkezésig. Szóval élesztést követően nagyjából 30 s múlva elérem a gépem. Addig kilépek a router ssh session-ből, s akár ugyanabból a terminál ablakból ssh-zhatok a hostra.

Szerk.: lustább vagyok, az ilyen örökhajtós while-okat így szoktam írni:

while :; do

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

off

       : [arguments]
              No effect; the command does nothing beyond  expanding  arguments
              and  performing any specified redirections.  A zero exit code is
              returned.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Némileg specifikus, nem túl konkrét és rövid a folytatás. Szerver oldali scriptelésről tettem említést benne.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Aktualizáltam néhány scriptet, illetve, hogy kevésbé legyen munkás a frissítés, a jogosultságok beállítása bekerült az rc.local-ba.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszönöm! A banner színezős részt én is átvettem, nagyon jól néz ki!

A banner-t még kiegészítettem obsy sysinfo scriptjét (http://eko.one.pl/) kicsit átszabva és most elég jól néz ki már a login/logout screen.

A snapshot már OpenWrt, így az új színdefíniciós file-t megcsináltam (/usr/local/etc/bannercolor):

1  3*lgreen
2  6*lgreen
3  12*lgreen
4  3*lgreen
5  lgreen lwhite 7*norm lwhite 6*norm
6  yellow
7  2*lwhite red
8  yellow

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Kifejlesztették belőle a hostnevet:

[root@(none) ~]# grep hostname /etc/config/system 
        option hostname 'router'

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE