viernes 21 de marzo de 2008

Limitando el bandwidth por host, red y usuario con Linux:

En este articulo muestro dos scripts bastante simples que armé para poder limitar el bandwidth en terminales corriendo linux, o en una red (no digo gnu porque a linus no le gusta).
La idea es que sean simples, pero a la vez ayuden a las tareas de testing de aplicaciones y porque no administracion de la red. No me concidero un scripter, porque para decir la verdad evito bastante esta tarea, pero de en vuando hay que hacer alguno.

NOTA: en esta entrada no me voy a poner a explicar como funcionan tc (con qdisc, class,...) y iptables, pero en la documentación que doy como referencia están muy bien explicados; además para que funcione todo hay que tener un nucleo compilado con soporte QoS (y sus chucherias), tampoco es la idea ponerme a explicar como hacer esto, y también está explicado en la documentacion que pongo como referencia.

DESCRIPCION:

Bueno, este es un problema que surgio en el trabajo, necesitamos testear el sistema que vende la empresa donde trabajo, y entonces un de los puntos importantes es el ancho de banda necesario.

Cada instancia cliente del sistema (un ERP) se conecta por red a un server de base de datos (lo normal es mysql), generando así una bola de trafico de ida y vuelta. El sistema puede correr en windows, linux y mac con versiones nativas.

Llendo al punto, surgió el problema de como limitar el bandwidth en el servidor y cliente para poder hacer los testeos. Luego de googlear unas horas y pasar por varios howtos, llegué a esto: [1]

En síntesis lo que necesitaba era "Poder limitar el ancho de banda de envio y recepcion entre cliente - servidor", así que llegué a tres ideas posibles:

1) Aplicar limitaciones por segmento de red.
2) Aplicar limitaciones entre dos host (cliente y servidor).
3) Aplicar limitacions por servicio (servidor de bases de datos / instancia cliente).

Bueno, al cabo de pelear tres o cuatro horas logré mis objetivos, y claro traian dos scripts atados con ellos.

ANCHO DE BANDA POR HOST O POR RED

Para los puntos (1) y (2), pude resolverlos con el siguiente script, el cual tiene la idea de poder limitar anchos de banda por red destino o por host destino:

---- lbnetng.sh ---
#!/bin/bash
# encoding utf8
# Autor: Jonatan Anauati
# email: barakawins@gmail.com

# USO # ./lbnet ruleId UNIQUEID [[host IP] |[net IP/MASK]] [rate MAXRATE] [unit UNIT] [if INTERFACE] | [clear INTERFACE] | [show_conf INTERFACE]

# Limita el ancho de banda de subida hacia una red o host

# - ruleId: [OBLIGATORIO] Identificador de regla, debe ser un entero unico por

# red (1,2,3,4...).
# - net es la ip a la cual se le aplicara la reduccion en el ancho de banda de
# respuesta desde el servidor (ej: 192.168.0.23) , default: todas las redes.
# - ip es la ip de host a la que se desea aplicar la reduccion.
# - rate: es el rate en kbit/s por defecto (OJO que no son kbits), a 256 por
# default.
# - if: elige una interfaz de red (por defecto eth0:1)
# - unit decide la unidad de trabajo (kbit, kbps,... ver man tc) por defecto
# esta en kbit por segundo
# - clear: limpia todas las reglas para la interfac INTERFAZ.
# - show_conf: muestra la configuracion para la interfaz INTERFAZ

TC='tc'
DEV='eth0'

RULEID=''

MAXRATE='256'

UNIT='kbit'

CLEARFLAG="FALSE"
DSTIP='0/0'
final_config=''
CLEARFLAG="FALSE"
SHOWCONFFLAG="FALSE"

function show_conf_builder ()
{
if [[ -z $final_config ]] ; then
final_config="Configuracion aplicada:"
fi
final_config="$final_config $1=$2"
}

function show_custom_conf ()
{
echo $final_config
}

function show_conf ()
{
echo "Qdiscs"
$TC -s -d qdisc show dev $DEV
echo "Clases"
$TC -s -d class show dev $DEV
echo "Filters"
$TC filter show dev $DEV
}

function set_standard_args ()
{
case $1 in
"rate")
MAXRATE=$2 ;;
"if")
DEV=$2 ;;
"unit")
UNIT=$2 ;;
"clear")
DEV=$2
CLEARFLAG="TRUE" ;;
"show_conf")
DEV=$2
SHOWCONFFLAG="TRUE" ;;
esac
}

function cleanup_rules ()
{
$TC qdisc del dev $DEV root 2> /dev/null > /dev/null
}

function set_custom_args ( )
{
case $1 in
"host")
DSTIP=$2/32 ;;
"net")
DSTIP=$2 ;;
"ruleId")
RULEID=$2 ;;
esac
}


function show_used_ids ( )
{
idlist=$(tc class show dev eth0 | sed -n 's/^class [^ ]\+ 1:\([0-9]\+\).\+$/\1/gp')
echo $idlist
}

case $1 in
"help")
echo
echo "Limita el trafico de subida hacia la red o host."
echo "MODO DE USO: $0 [net net/maskbits | host address] [rate maxRate] [unit bandwidthUnit] [if interface] | [clear INTERFACE]"
echo
exit ;;
"show_conf")
show_conf
exit ;;
esac

i=0
list[0]=""
list[1]=""
for param in $@ ; do
list[$i]=$param
let i+=1
if [[ $i -eq 2 ]] ; then
set_standard_args ${list[0]} ${list[1]}
set_custom_args ${list[0]} ${list[1]}
show_conf_builder ${list[0]} ${list[1]}
let i=0
fi
done

if [[ $CLEARFLAG == "TRUE" ]] ; then
cleanup_rules
exit
elif [[ $SHOWCONFFLAG == "TRUE" ]] ; then
show_conf
exit
fi

USERID=$(cat /etc/passwd | grep $USERNAME | sed -n 's/\([^:]\+:\)\{2\}\([^:]\+\)\(:.\+$\)/\2/gp')
if [[ -z $USERID ]] ; then
echo "El usuario $USERNAME parece no existir"
exit
fi
if [[ -z $RULEID ]] ; then
echo "Debe especificar el ruleId (no sea cobarde, y de cualquiera que no"
echo "halla puesto aun. Puede ser cualquier EXCEPTO los siguientes:"
show_used_ids

echo
exit
fi


$TC qdisc add dev $DEV root handle 1: htb default 60 2> /dev/null > /dev/null
$TC class add dev $DEV parent 1: classid 1:${RULEID} htb rate ${MAXRATE}${UNIT} ceil ${MAXRATE}${UNIT}
$TC filter add dev $DEV protocol ip parent 1: prio 1 u32 match ip dst ${DSTIP} flowid 1:1
$TC filter add dev $DEV protocol ip parent 1: handle 99 fw classid 1:1

show_custom_conf
#vim:sw=4:sts=4:et:syntax=sh:nowrap:nu:filetype=sh
--- fin de lbnetng.sh ---

Ejemplos:

root@dino-thunder:/home/jaa# ./lbnetng.sh host 192.168.1.32 rate 128 if eth0 ruleId 1
Configuracion aplicada: host=192.168.1.32 rate=128 if=eth0 ruleId=1

limita el trafico hacia 192.168.1.32 a un maximo de 128kbit/s (OJO que son kbit por segundo) sobre la interfaz eth0. El parametro ruleId debe ser único, es decir hay que cambiarlo con cada llamada consecutiva a lbnetng.sh (si reinicias la configuracion puede volver a empezar).

root@dino-thunder:/home/jaa# ./lbnetng.sh host 192.168.1.32 rate 128 unit kbps if eth0 ruleId 2
Configuracion aplicada: host=192.168.1.32 rate=128 unit=kbps if=eth0 ruleId=2

limita el trafico hacia 192.168.1.32 a un maximo de 128kbps (OJO que son kbytes
por segundo) sobre la interfaz eth0.


root@dino-thunder:/home/jaa# ./lbnetng.sh net 192.168.1.0/24 rate 1 unit mbit if eth0 ruleId 3
Configuracion aplicada: net=192.168.1.0/24 rate=1 unit=mbit if=eth0 ruleId=3

limita el trafico hacia la red 192.168.1.0 a un maximo de 1 mbit (1 mega bit /s)
sobre la interfaz eth0.


Para ver la configucion actual:


root@dino-thunder:/home/jaa# ./lbnetng.sh show_conf eth0
Qdiscs
qdisc htb 1: r2q 10 default 60 direct_packets_stat 0 ver 3.17
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
Clases
class htb 1:1 root prio 0 quantum 1600 rate 128000bit ceil 128000bit burst 1663b/8
mpu 0b overhead 0b cburst 1663b/8 mpu 0b overhead 0b level 0

Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 106496 ctokens: 106496

class htb 1:2 root prio 0 quantum 12800 rate 1024Kbit ceil 1024Kbit burst 2111b/8
mpu 0b overhead 0b cburst 2111b/8 mpu 0b overhead 0b level 0

Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 16896 ctokens: 16896

class htb 1:3 root prio 0 quantum 12500 rate 1000Kbit ceil 1000Kbit burst 2099b/8
mpu 0b overhead 0b cburst 2099b/8 mpu 0b overhead 0b level 0

Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 17203 ctokens: 17203

Filters
filter parent 1: protocol ip pref 1 u32
filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1
... (continua)

Para limpiar la configuracion:

root@dino-thunder:/home/jaa# ./lbnetng.sh clear eth0

ANCHO DE BANDA POR PROCESO O USUARIO:

Para resolver el puto (3), tambien genere este script:

--- lbnetng.sh ---
#!/bin/bash
# encoding utf8
# Autor: Jonatan Anauati
# email: barakawins@gmail.com
#
# USO # ./lbuser [[user USERNAME] [rate RATE] [unit UNIT] [if INTERFACE] | [show_conf INTERFACE] | [help] | [clear INTERFACE] | [full_clear INTERFACE]]
# Limita el ancho de banda de subida de un usuario en el sistema
# - user: es el usuario para el cual quiere limitarse el bandwidth de envio
# por default actua solo sobre el usuario actual.
# - rate es el rate en kbit/s por defecto (OJO que no son kbits), a 256 por
# default.
# - if: elige una interfaz de red (por defecto eth0:1)
# - unit decide la unidad de trabajo (kbit, kbps,... ver man tc) por defecto
# esta en kbit por segundo.
# - clear: limpia todas las reglas para la interfaz INTERFAZ.
# - full_clear: limpia todas las reglas para la interfaz INTERFAZ, y ademas
# limpia todoas las reglas de la tabla mangle de iptables.
# - show_conf: muestra la configuracion para la interfaz INTERFAZ

#NOTA: falta probar la efectividad del script, si bien pareceriera que tiene que
# funcionar con solo ver la configuracion aplicada, todabia no esta probado
# que el marcado de iptables y las reglas se apliquen correctamente.

USERNAME="$LOGNAME"
TC=tc
DEV="eth0"
MAXRATE=256
UNIT="kbit"
CLEARFLAG="FALSE"
SHOWCONFFLAG="FALSE"
CLEAR_IPTABLES_MANGLE_T="FALSE"
final_config=""
function show_conf_builder ()
{
if [[ -z $final_config ]] ; then
final_config="Configuracion aplicada:"
fi
final_config="$final_config $1=$2"
}

function show_custom_conf ()
{
echo $final_config
}

function show_conf ()
{
echo "Qdiscs"
$TC -s -d qdisc show dev $DEV
echo "Clases"
$TC -s -d class show dev $DEV
echo "Filters"
$TC filter show dev $DEV
}

function set_standard_args ( )
{
case $1 in
"rate")
MAXRATE=$2 ;;
"if")
DEV=$2 ;;
"unit")
UNIT=$2 ;;
"clear")
DEV=$2
CLEARFLAG="TRUE" ;;
"show_conf")
DEV=$2
SHOWCONFFLAG="TRUE" ;;
esac
}

function cleanup_rules ()
{
$TC qdisc del dev $DEV root 2> /dev/null > /dev/null
}

function set_custom_args ( )
{
case $1 in
"user")
USERNAME=$2 ;;
"full_clear")
DEV=$2
CLEARFLAG="TRUE"
CLEAR_IPTABLES_MANGLE_T="TRUE"
esac
}

case $1 in
"help")
echo
echo "Limita el trafico de subida de todos los procesos de un usuario."
echo "MODO DE USO: $0 [user userPattern] [rate maxRate] [unit bandwidthUnit] [if interface]"
echo
exit ;;
esac


i=0
list[0]=""
list[1]=""
for param in $@ ; do
list[$i]=$param
let i+=1
if [[ $i -eq 2 ]] ; then
set_standard_args ${list[0]} ${list[1]}
set_custom_args ${list[0]} ${list[1]}
show_conf_builder ${list[0]} ${list[1]}
let i=0
fi
done

if [[ $CLEARFLAG == "TRUE" ]] ; then
cleanup_rules
if [[ $CLEAR_IPTABLES_MANGLE_T == "TRUE" ]] ; then
iptables -t mangle -F
fi
exit
fi

USERID=$(cat /etc/passwd | grep $USERNAME | sed -n 's/\([^:]\+:\)\{2\}\([^:]\+\)\(:.\+$\)/\2/gp')
if [[ -z $USERID ]] ; then
echo "El usuario $USERNAME parece no existir"
exit
fi

iptables -t mangle -A OUTPUT --out-interface $DEV --match owner --uid-owner $USERID -j MARK --set-mark $USERID
#$TC qdisc del dev $DEV root 2>&1 >/dev/null
$TC qdisc add dev $DEV root handle 1: htb default 60 2> /dev/null > /dev/null
$TC class add dev $DEV parent 1: classid 1:$USERID htb rate ${MAXRATE}${UNIT} ceil ${MAXRATE}${UNIT} 2> /dev/null > /dev/null
if [[ $? == 0 ]] ; then
$TC filter add dev $DEV protocol ip parent 1: handle $USERID fw classid 1:$USERID
show_custom_conf

else
echo "El seteo no pudo realizarze, tal vez sea que el usuario ya fue"
echo "configurado por este script."
fi
#vim:sw=4:sts=4:et:syntax=sh:nowrap:nu:filetype=sh
--- fin de lbnetng.sh ---

En este caso quería que la limitacion sea por servicio (solo el servidor de bases de datos) ya que las pruebas son realizadas contra un servidor de produccion y no quería meter la pata dejando a todos sin svn ! jaja.
Vi dos opciones posibles (ambas necesitan la intervencion de iptables en la cocina):

1) Limitar por pid del proceso.
2) Limitar por el usuario que corre el servicio.

Por el hecho de que el servidor de base de datos creo que puede levantar mas procesos a conveniencia cuando el quiere (SUPONGO) y entonces tendría que ir casi adivinando la pid (en realidad sería hacer la conexion primero, luego mirar con
netstat -puta, identificar la pid que se enlaza a la ip de máquina que corre la instancia cliente) lo cual es un poco molesto cuando se hace mas de dos veces, me quedé con la opcion (2): Limitar el ancho de banda por usuario.


Hay que aclarar que si bien esta es la eleccion, es muy sencillo hacer que haga la limitacion solo por la pid (esto es la parte encargada a iptables).

Para empezar el server tiene un so ubuntu 7.10, y el mysql de serie que trae es configurado para correr con el user mysql, entonces no me quedaba mas que limitar el bandwidth para este usuario en el servidor, e ir luego a mi maquina y limitar el bandwidth a mi usuario con el que corro la instancia del sistema (olvidé decir que mi desktop es un ubuntu 7.10 también).

Ejemplos:

NOTA: una forma sencilla de ver con que usuario corre tu proceso puede ser:

jaa@dino-thunder:~$ ps aux | head -n1 && ps aux | grep mysqld
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 5033 0.0 0.0 1712 444 ? S 10:07 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 5077 0.0 1.0 134036 4512 ? Sl 10:07 0:03 /usr/sbin/mysqld ... (coooontinua)
root 5079 0.0 0.1 1640 456 ? S 10:07 0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
jaa 8877 0.0 0.1 2896 764 pts/1 R+ 16:45 0:00 grep mysql

Como se para /usr/sbin/mysqld el usuario (primer columna) es mysql.

root@dino-thunder:/home/jaa# ./lbuserng.sh user mysql rate 512 unit kbit if eth0
Configuracion aplicada: user=mysql rate=512 unit=kbit if=eth0

Si tenés tu mysql server corriendo a nombre del user mysql entonces el ancho de banda de salida del usuario y por lo tanto del servidor va a ser de 512 kbit/s.

root@dino-thunder:/home/jaa# ./lbuserng.sh user jaa rate 10 unit mbit if eth0
Configuracion aplicada: user=jaa rate=10 unit=mbit if=eth0

limita todo el trafico saliente que genere el user jaa por la interfaz eth0 a una tasa de 256 kbit/s.

Por ejemplo si se quiere limitar el bandwidth para apache:

root@dino-thunder:/home/jaa# ps aux | grep apache2

...
www-data 5530 0.0 0.0 9664 380 ? S 10:08 0:00 /usr/sbin/apache2 -k start
www-data 5531 0.0 0.1 231232 584 ? Sl 10:08 0:00 /usr/sbin/apache2 -k start

es muy sencillo notar que corre con www-data:

root@dino-thunder:/home/jaa# ./lbuserng.sh user www-data rate 256 unit kbit if eth0
Configuracion aplicada: user=www-data rate=256 unit=kbit if=eth0

Ver la configuracion:

root@dino-thunder:/home/jaa# ./lbuserng.sh show_conf eth0
Qdiscs
qdisc htb 1: r2q 10 default 60 direct_packets_stat 0 ver 3.17
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
Clases
class htb 1:33 root prio 0 quantum 3200 rate 256000bit ceil 256000bit burst
1727b/8 mpu 0b overhead 0b cburst 1727b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 55296 ctokens: 55296

class htb 1:1000 root prio 0 quantum 125000 rate 10000Kbit ceil 10000Kbit burst
6598b/8 mpu 0b overhead 0b cburst 6598b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 5406 ctokens: 5406

class htb 1:111 root prio 0 quantum 6400 rate 512000bit ceil 512000bit burst
1855b/8 mpu 0b overhead 0b cburst 1855b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 29696 ctokens: 29696

Filters
filter parent 1: protocol ip pref 49151 fw
filter parent 1: protocol ip pref 49151 fw handle 0x21 classid 1:33
filter parent 1: protocol ip pref 49151 fw
filter parent 1: protocol ip pref 49151 fw handle 0x3e8 classid 1:1000
filter parent 1: protocol ip pref 49152 fw
filter parent 1: protocol ip pref 49152 fw handle 0x6f classid 1:111

Limpiar la configuracion:
./lbuserng.sh clear eth0

Pero esta última pimpia las configuraciones aplicadas con tc. Y para este script también aplicamos reglas con iptables.

Si queremos que limpie las reglas de iptables:

./lbuserng.sh full_clear eth0

pero OJO porque elimina todas las reglas de la tabla mangle, entonces esto afecta de dos formas

1) si habias agregados limites para usuarios en otras interfaces entonces ya no se aplicaran porque iptables no hara la parte que le toca (entonces tendras que hacer clear sobre cada interfaz y volver a empezar)

2) Si tenias reglas ya aplicadas en tu tabla mangle de iptables para otros objetivos entonces se esta quemando el culo, tendras que volver a aplicarlas nuevamente ! (si ya se que es un garron, pero controlar todo esto ya demanda mucho mas trabajo y la idea es que este sea un trabajo simple para testing, y a lo sumo setear reglas al arranque del sistema).

NOTAS:

No intentes probar estos scripts unicamente con conexiones a localhost, porque por algun motivo no he logrado que funcionen, lo que si aseguron que funcionaron fantasticamente en conexiones en red. Para realizar todas mis pruebas iniciales lo que hice fue levantar un apache en un server, que comparta un achivo por http, y
desde mi firefox hacia descargas, prueba que para mi resulto perfecta, luego pase a las pruebas con el sistema que antes comente y resultaron bastante acorde con las limitaciones.

Scripts:

[1]: lbnetng.sh (encodeado con base64):
--- lbnetng.b64 ---
--- Para obtener el script ejecutar: ---
--- "openssl base64 -d -in lbnetng.b64 -out lbnetng.sh" ---
IyEvYmluL2Jhc2gKIyBlbmNvZGluZyB1dGY4CiMgQXV0b3I6IEpvbmF0YW4gQW5h
dWF0aQojIGVtYWlsOiBiYXJha2F3aW5zQGdtYWlsLmNvbQoKIyBVU08gIyAuL2xi
bmV0IHJ1bGVJZCBVTklRVUVJRCBbW2hvc3QgSVBdIHxbbmV0IElQL01BU0tdXSBb
cmF0ZSBNQVhSQVRFXSBbdW5pdCBVTklUXSBbaWYgSU5URVJGQUNFXSB8IFtjbGVh
ciBJTlRFUkZBQ0VdIHwgW3Nob3dfY29uZiBJTlRFUkZBQ0VdCiMgTGltaXRhIGVs
IGFuY2hvIGRlIGJhbmRhIGRlIHN1YmlkYSBoYWNpYSB1bmEgcmVkIG8gaG9zdAoj
IC0gcnVsZUlkOiBbT0JMSUdBVE9SSU9dIElkZW50aWZpY2Fkb3IgZGUgcmVnbGEs
IGRlYmUgc2VyIHVuIGVudGVybyB1bmljbyBwb3IKIyAgIHJlZCAoMSwyLDMsNC4u
LikuCiMgLSBuZXQgZXMgbGEgaXAgYSBsYSBjdWFsIHNlIGxlIGFwbGljYXJhIGxh
IHJlZHVjY2lvbiBlbiBlbCBhbmNobyBkZSBiYW5kYSBkZQojICAgcmVzcHVlc3Rh
IGRlc2RlIGVsIHNlcnZpZG9yIChlajogMTkyLjE2OC4wLjIzKSAsIGRlZmF1bHQ6
IHRvZGFzIGxhcyByZWRlcy4KIyAtIGlwIGVzIGxhIGlwIGRlIGhvc3QgYSBsYSBx
dWUgc2UgZGVzZWEgYXBsaWNhciBsYSByZWR1Y2Npb24uCiMgLSByYXRlOiBlcyBl
bCByYXRlIGVuIGtiaXQvcyBwb3IgZGVmZWN0byAoT0pPIHF1ZSBubyBzb24ga2Jp
dHMpLCBhIDI1NiBwb3IgCiMgICBkZWZhdWx0LgojIC0gaWY6IGVsaWdlIHVuYSBp
bnRlcmZheiBkZSByZWQgKHBvciBkZWZlY3RvIGV0aDA6MSkKIyAtIHVuaXQgZGVj
aWRlIGxhIHVuaWRhZCBkZSB0cmFiYWpvIChrYml0LCBrYnBzLC4uLiB2ZXIgbWFu
IHRjKSBwb3IgZGVmZWN0bwojICAgZXN0YSBlbiBrYml0IHBvciBzZWd1bmRvCiMg
LSBjbGVhcjogbGltcGlhIHRvZGFzIGxhcyByZWdsYXMgcGFyYSBsYSBpbnRlcmZh
YyBJTlRFUkZBWi4KIyAtIHNob3dfY29uZjogbXVlc3RyYSBsYSBjb25maWd1cmFj
aW9uIHBhcmEgbGEgaW50ZXJmYXogSU5URVJGQVoKCgpUQz0ndGMnCkRFVj0nZXRo
MCcKUlVMRUlEPScnCk1BWFJBVEU9JzI1NicKVU5JVD0na2JpdCcKQ0xFQVJGTEFH
PSJGQUxTRSIKRFNUSVA9JzAvMCcKZmluYWxfY29uZmlnPScnCkNMRUFSRkxBRz0i
RkFMU0UiClNIT1dDT05GRkxBRz0iRkFMU0UiCgpmdW5jdGlvbiBzaG93X2NvbmZf
YnVpbGRlciAgKCkKewogICAgaWYgW1sgLXogJGZpbmFsX2NvbmZpZyBdXSA7IHRo
ZW4KICAgICAgICBmaW5hbF9jb25maWc9IkNvbmZpZ3VyYWNpb24gYXBsaWNhZGE6
IiAKICAgIGZpIAogICAgZmluYWxfY29uZmlnPSIkZmluYWxfY29uZmlnICQxPSQy
Igp9CgpmdW5jdGlvbiBzaG93X2N1c3RvbV9jb25mICgpCnsKICAgIGVjaG8gJGZp
bmFsX2NvbmZpZwp9CgpmdW5jdGlvbiBzaG93X2NvbmYgKCkKewogICAgZWNobyAi
UWRpc2NzIgogICAgJFRDIC1zIC1kIHFkaXNjIHNob3cgZGV2ICRERVYKICAgIGVj
aG8gIkNsYXNlcyIKICAgICRUQyAtcyAtZCBjbGFzcyBzaG93IGRldiAkREVWCiAg
ICBlY2hvICJGaWx0ZXJzIgogICAgJFRDIGZpbHRlciBzaG93IGRldiAkREVWCn0K
CmZ1bmN0aW9uIHNldF9zdGFuZGFyZF9hcmdzICgpIAp7CiAgICBjYXNlICQxIGlu
CiAgICAgICAgInJhdGUiKQogICAgICAgICAgICBNQVhSQVRFPSQyIDs7CiAgICAg
ICAgImlmIikKICAgICAgICAgICAgREVWPSQyIDs7ICAgICAgICAKICAgICAgICAi
dW5pdCIpCiAgICAgICAgICAgIFVOSVQ9JDIgOzsKICAgICAgICAiY2xlYXIiKQog
ICAgICAgICAgICBERVY9JDIKICAgICAgICAgICAgQ0xFQVJGTEFHPSJUUlVFIiA7
OwogICAgICAgICJzaG93X2NvbmYiKQogICAgICAgICAgICBERVY9JDIKICAgICAg
ICAgICAgU0hPV0NPTkZGTEFHPSJUUlVFIiA7OwogICAgZXNhYwp9CgpmdW5jdGlv
biBjbGVhbnVwX3J1bGVzICgpCnsKICAgICRUQyBxZGlzYyBkZWwgZGV2ICRERVYg
cm9vdCAyPiAvZGV2L251bGwgPiAvZGV2L251bGwKfQoKZnVuY3Rpb24gc2V0X2N1
c3RvbV9hcmdzICggKQp7CiAgICBjYXNlICQxIGluCiAgICAgICAgImhvc3QiKQog
ICAgICAgICAgICBEU1RJUD0kMi8zMiA7OwogICAgICAgICJuZXQiKQogICAgICAg
ICAgICBEU1RJUD0kMiA7OwogICAgICAgICJydWxlSWQiKQogICAgICAgICAgICBS
VUxFSUQ9JDIgOzsKICAgIGVzYWMKfQoKZnVuY3Rpb24gc2hvd191c2VkX2lkcyAo
ICkKewogICAgaWRsaXN0PSQodGMgY2xhc3Mgc2hvdyBkZXYgZXRoMCAgfCBzZWQg
LW4gJ3MvXmNsYXNzIFteIF1cKyAxOlwoWzAtOV1cK1wpLlwrJC9cMS9ncCcpCiAg
ICBlY2hvICRpZGxpc3QKfQoKY2FzZSAkMSBpbgogICAgImhlbHAiKQogICAgICAg
IGVjaG8KICAgICAgICBlY2hvICJMaW1pdGEgZWwgdHJhZmljbyBkZSBzdWJpZGEg
aGFjaWEgbGEgcmVkIG8gaG9zdC4iCiAgICAgICAgZWNobyAiTU9ETyBERSBVU086
ICQwIFtuZXQgbmV0L21hc2tiaXRzIHwgaG9zdCBhZGRyZXNzXSBbcmF0ZSBtYXhS
YXRlXSBbdW5pdCBiYW5kd2lkdGhVbml0XSBbaWYgaW50ZXJmYWNlXSB8IFtjbGVh
ciBJTlRFUkZBQ0VdIgogICAgICAgIGVjaG8gCiAgICAgICAgZXhpdCA7OwogICAg
InNob3dfY29uZiIpCiAgICAgICAgc2hvd19jb25mIAogICAgICAgIGV4aXQgOzsK
ZXNhYwoKaT0wCmxpc3RbMF09IiIKbGlzdFsxXT0iIgpmb3IgcGFyYW0gaW4gJEAg
OyBkbwogICAgbGlzdFskaV09JHBhcmFtIAogICAgbGV0IGkrPTEKICAgIGlmIFtb
ICRpIC1lcSAyIF1dIDsgdGhlbgogICAgICAgIHNldF9zdGFuZGFyZF9hcmdzICR7
bGlzdFswXX0gJHtsaXN0WzFdfQogICAgICAgIHNldF9jdXN0b21fYXJncyAke2xp
c3RbMF19ICR7bGlzdFsxXX0KICAgICAgICBzaG93X2NvbmZfYnVpbGRlciAke2xp
c3RbMF19ICR7bGlzdFsxXX0KICAgICAgICBsZXQgaT0wCiAgICBmaQpkb25lCgpp
ZiBbWyAkQ0xFQVJGTEFHID09ICJUUlVFIiBdXSA7IHRoZW4KICAgIGNsZWFudXBf
cnVsZXMKICAgIGV4aXQgCmVsaWYgW1sgJFNIT1dDT05GRkxBRyA9PSAiVFJVRSIg
XV0gOyB0aGVuCiAgICBzaG93X2NvbmYKICAgIGV4aXQgCmZpCgpVU0VSSUQ9JChj
YXQgL2V0Yy9wYXNzd2QgfCBncmVwICRVU0VSTkFNRSB8IHNlZCAtbiAncy9cKFte
Ol1cKzpcKVx7Mlx9XChbXjpdXCtcKVwoOi5cKyRcKS9cMi9ncCcpCmlmIFtbIC16
ICRVU0VSSUQgXV0gOyB0aGVuCiAgICBlY2hvICJFbCB1c3VhcmlvICRVU0VSTkFN
RSBwYXJlY2Ugbm8gZXhpc3RpciIKICAgIGV4aXQKZmkKaWYgW1sgLXogJFJVTEVJ
RCBdXSA7IHRoZW4KICAgIGVjaG8gIkRlYmUgZXNwZWNpZmljYXIgZWwgcnVsZUlk
IChubyBzZWEgY29iYXJkZSwgeSBkZSBjdWFscXVpZXJhIHF1ZSBubyIKICAgIGVj
aG8gImhhbGxhIHB1ZXN0byBhdW4uIFB1ZWRlIHNlciBjdWFscXVpZXIgRVhDRVBU
TyBsb3Mgc2lndWllbnRlczoiCiAgICBzaG93X3VzZWRfaWRzCiAgICBlY2hvIAog
ICAgZXhpdApmaQoKaWYgW1sgJENMRUFSRkxBRyA9PSAiVFJVRSIgXV0gOyB0aGVu
CiAgICBjbGVhbnVwX3J1bGVzCiAgICBleGl0IAplbGlmIFtbICRTSE9XQ09ORkZM
QUcgPT0gIlRSVUUiIF1dIDsgdGhlbgogICAgc2hvd19jb25mCiAgICBleGl0CmZp
CgokVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDE6IGh0YiBkZWZh
dWx0IDYwIDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbAokVEMgY2xhc3MgYWRkIGRl
diAkREVWIHBhcmVudCAxOiBjbGFzc2lkIDE6JHtSVUxFSUR9IGh0YiByYXRlICR7
TUFYUkFURX0ke1VOSVR9IGNlaWwgJHtNQVhSQVRFfSR7VU5JVH0gCiRUQyBmaWx0
ZXIgYWRkIGRldiAkREVWIHByb3RvY29sIGlwIHBhcmVudCAxOiBwcmlvIDEgdTMy
IG1hdGNoIGlwIGRzdCAke0RTVElQfSBmbG93aWQgMToxCiRUQyBmaWx0ZXIgYWRk
IGRldiAkREVWIHByb3RvY29sIGlwIHBhcmVudCAxOiBoYW5kbGUgOTkgZncgY2xh
c3NpZCAxOjEKCnNob3dfY3VzdG9tX2NvbmYKIyB2aW06c3c9NDpzb2Z0dGFic3Rv
cD00OmV4cGFuZHRhYjpzeW50YXg9c2g6bm93cmFwOm51OmZpbGV0eXBlPXNoCgo=
--- Fin del archivo ---

[2]: lbuserng.sh (encodeado con base 64):
--- lbuserng.b64 ---
--- Para obtener el script ejecutar: ---
--- "openssl base64 -d -in lbuserng.b64 -out lbuserng.sh" ---
IyEvYmluL2Jhc2gKIyBlbmNvZGluZyB1dGY4CiMgQXV0b3I6IEpvbmF0YW4gQW5h
dWF0aQojIGVtYWlsOiBiYXJha2F3aW5zQGdtYWlsLmNvbQojCiMgVVNPICMgLi9s
YnVzZXIgW1t1c2VyIFVTRVJOQU1FXSBbcmF0ZSBSQVRFXSBbdW5pdCBVTklUXSBb
aWYgSU5URVJGQUNFXSB8ICBbc2hvd19jb25mIElOVEVSRkFDRV0gfCBbaGVscF0g
fCBbY2xlYXIgSU5URVJGQUNFXSB8IFtmdWxsX2NsZWFyIElOVEVSRkFDRV1dCiMg
TGltaXRhIGVsIGFuY2hvIGRlIGJhbmRhIGRlIHN1YmlkYSBkZSB1biB1c3Vhcmlv
IGVuIGVsIHNpc3RlbWEKIyAtIHVzZXI6IGVzIGVsIHVzdWFyaW8gcGFyYSBlbCBj
dWFsIHF1aWVyZSBsaW1pdGFyc2UgZWwgYmFuZHdpZHRoIGRlIGVudmlvCiMgICBw
b3IgZGVmYXVsdCBhY3R1YSBzb2xvIHNvYnJlIGVsIHVzdWFyaW8gYWN0dWFsLgoj
IC0gcmF0ZSBlcyBlbCByYXRlIGVuIGtiaXQvcyBwb3IgZGVmZWN0byAoT0pPIHF1
ZSBubyBzb24ga2JpdHMpLCBhIDI1NiBwb3IgCiMgICBkZWZhdWx0LgojIC0gaWY6
IGVsaWdlIHVuYSBpbnRlcmZheiBkZSByZWQgKHBvciBkZWZlY3RvIGV0aDA6MSkK
IyAtIHVuaXQgZGVjaWRlIGxhIHVuaWRhZCBkZSB0cmFiYWpvIChrYml0LCBrYnBz
LC4uLiB2ZXIgbWFuIHRjKSBwb3IgZGVmZWN0bwojICAgZXN0YSBlbiBrYml0IHBv
ciBzZWd1bmRvLgojIC0gY2xlYXI6IGxpbXBpYSB0b2RhcyBsYXMgcmVnbGFzIHBh
cmEgbGEgaW50ZXJmYXogSU5URVJGQVouCiMgLSBmdWxsX2NsZWFyOiBsaW1waWEg
dG9kYXMgbGFzIHJlZ2xhcyBwYXJhIGxhIGludGVyZmF6IElOVEVSRkFaLCB5IGFk
ZW1hcyAKIyAgIGxpbXBpYSB0b2RvYXMgbGFzIHJlZ2xhcyBkZSBsYSB0YWJsYSBt
YW5nbGUgZGUgaXB0YWJsZXMuCiMgLSBzaG93X2NvbmY6IG11ZXN0cmEgbGEgY29u
ZmlndXJhY2lvbiBwYXJhIGxhIGludGVyZmF6IElOVEVSRkFaCgojTk9UQTogZmFs
dGEgcHJvYmFyIGxhIGVmZWN0aXZpZGFkIGRlbCBzY3JpcHQsIHNpIGJpZW4gcGFy
ZWNlcmllcmEgcXVlIHRpZW5lIHF1ZQojICAgICAgZnVuY2lvbmFyIGNvbiBzb2xv
IHZlciBsYSBjb25maWd1cmFjaW9uIGFwbGljYWRhLCB0b2RhYmlhIG5vIGVzdGEg
cHJvYmFkbwojICAgICAgcXVlIGVsIG1hcmNhZG8gZGUgaXB0YWJsZXMgeSBsYXMg
cmVnbGFzIHNlIGFwbGlxdWVuIGNvcnJlY3RhbWVudGUuCgpVU0VSTkFNRT0iJExP
R05BTUUiClRDPXRjIApERVY9ImV0aDAiCk1BWFJBVEU9MjU2ClVOSVQ9ImtiaXQi
CkNMRUFSRkxBRz0iRkFMU0UiClNIT1dDT05GRkxBRz0iRkFMU0UiCkNMRUFSX0lQ
VEFCTEVTX01BTkdMRV9UPSJGQUxTRSIKZmluYWxfY29uZmlnPSIiCmZ1bmN0aW9u
IHNob3dfY29uZl9idWlsZGVyICgpCnsKICAgIGlmIFtbIC16ICRmaW5hbF9jb25m
aWcgXV0gOyB0aGVuCiAgICAgICAgZmluYWxfY29uZmlnPSJDb25maWd1cmFjaW9u
IGFwbGljYWRhOiIgCiAgICBmaSAKICAgIGZpbmFsX2NvbmZpZz0iJGZpbmFsX2Nv
bmZpZyAkMT0kMiIKfQoKZnVuY3Rpb24gc2hvd19jdXN0b21fY29uZiAoKQp7CiAg
ICBlY2hvICRmaW5hbF9jb25maWcKfQoKZnVuY3Rpb24gc2hvd19jb25mICgpCnsK
ICAgIGVjaG8gIlFkaXNjcyIKICAgICRUQyAtcyAtZCBxZGlzYyBzaG93IGRldiAk
REVWCiAgICBlY2hvICJDbGFzZXMiCiAgICAkVEMgLXMgLWQgY2xhc3Mgc2hvdyBk
ZXYgJERFVgogICAgZWNobyAiRmlsdGVycyIKICAgICRUQyBmaWx0ZXIgc2hvdyBk
ZXYgJERFVgp9CgpmdW5jdGlvbiBzZXRfc3RhbmRhcmRfYXJncyAoICkgCnsKICAg
IGNhc2UgJDEgaW4KICAgICAgICAicmF0ZSIpCiAgICAgICAgICAgIE1BWFJBVEU9
JDIgOzsKICAgICAgICAiaWYiKQogICAgICAgICAgICBERVY9JDIgOzsgICAgICAg
IAogICAgICAgICJ1bml0IikKICAgICAgICAgICAgVU5JVD0kMiA7OwogICAgICAg
ICJjbGVhciIpCiAgICAgICAgICAgIERFVj0kMgogICAgICAgICAgICBDTEVBUkZM
QUc9IlRSVUUiIDs7CiAgICAgICAgInNob3dfY29uZiIpCiAgICAgICAgICAgIERF
Vj0kMgogICAgICAgICAgICBTSE9XQ09ORkZMQUc9IlRSVUUiIDs7CiAgICBlc2Fj
Cn0KCmZ1bmN0aW9uIGNsZWFudXBfcnVsZXMgKCkKewogICAgJFRDIHFkaXNjIGRl
bCBkZXYgJERFViByb290IDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbAp9CgpmdW5j
dGlvbiBzZXRfY3VzdG9tX2FyZ3MgKCApIAp7CiAgICBjYXNlICQxIGluCiAgICAg
ICAgInVzZXIiKQogICAgICAgICAgICBVU0VSTkFNRT0kMiA7OwogICAgICAgICJm
dWxsX2NsZWFyIikKICAgICAgICAgICAgREVWPSQyCiAgICAgICAgICAgIENMRUFS
RkxBRz0iVFJVRSIKICAgICAgICAgICAgQ0xFQVJfSVBUQUJMRVNfTUFOR0xFX1Q9
IlRSVUUiCiAgICBlc2FjCn0KCmNhc2UgJDEgaW4KICAgICJoZWxwIikKICAgICAg
ICBlY2hvIAogICAgICAgIGVjaG8gIkxpbWl0YSBlbCB0cmFmaWNvIGRlIHN1Ymlk
YSBkZSB0b2RvcyBsb3MgcHJvY2Vzb3MgZGUgdW4gdXN1YXJpby4iCiAgICAgICAg
ZWNobyAiTU9ETyBERSBVU086ICQwIFt1c2VyIHVzZXJQYXR0ZXJuXSBbcmF0ZSBt
YXhSYXRlXSBbdW5pdCBiYW5kd2lkdGhVbml0XSBbaWYgaW50ZXJmYWNlXSIKICAg
ICAgICBlY2hvCiAgICAgICAgZXhpdCAgOzsKZXNhYwoKaT0wCmxpc3RbMF09IiIK
bGlzdFsxXT0iIgpmb3IgcGFyYW0gaW4gJEAgOyBkbwogICAgbGlzdFskaV09JHBh
cmFtIAogICAgbGV0IGkrPTEKICAgIGlmIFtbICRpIC1lcSAyIF1dIDsgdGhlbgog
ICAgICAgIHNldF9zdGFuZGFyZF9hcmdzICR7bGlzdFswXX0gJHtsaXN0WzFdfQog
ICAgICAgIHNldF9jdXN0b21fYXJncyAke2xpc3RbMF19ICR7bGlzdFsxXX0KICAg
ICAgICBzaG93X2NvbmZfYnVpbGRlciAke2xpc3RbMF19ICR7bGlzdFsxXX0gCiAg
ICAgICAgbGV0IGk9MAogICAgZmkKZG9uZQoKaWYgW1sgJENMRUFSRkxBRyA9PSAi
VFJVRSIgXV0gOyB0aGVuCiAgICBjbGVhbnVwX3J1bGVzCiAgICBpZiBbWyAkQ0xF
QVJfSVBUQUJMRVNfTUFOR0xFX1QgPT0gIlRSVUUiIF1dIDsgdGhlbgogICAgICAg
IGlwdGFibGVzIC10IG1hbmdsZSAtRgogICAgZmkKICAgIGV4aXQgCmVsaWYgW1sg
JFNIT1dDT05GRkxBRyA9PSAiVFJVRSIgXV0gOyB0aGVuCiAgICBzaG93X2NvbmYK
ICAgIGlwdGFibGVzIC10IG1hbmdsZSAtLWxpc3QgCiAgICBleGl0IApmaQoKVVNF
UklEPSQoY2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAkVVNFUk5BTUUgfCBzZWQgLW4g
J3MvXChbXjpdXCs6XClcezJcfVwoW146XVwrXClcKDouXCskXCkvXDIvZ3AnKQpp
ZiBbWyAteiAkVVNFUklEIF1dIDsgdGhlbgogICAgZWNobyAiRWwgdXN1YXJpbyAk
VVNFUk5BTUUgcGFyZWNlIG5vIGV4aXN0aXIiCiAgICBleGl0CmZpCgppcHRhYmxl
cyAtdCBtYW5nbGUgLUEgT1VUUFVUIC0tb3V0LWludGVyZmFjZSAkREVWIC0tbWF0
Y2ggb3duZXIgLS11aWQtb3duZXIgJFVTRVJJRCAtaiBNQVJLIC0tc2V0LW1hcmsg
JFVTRVJJRAojJFRDIHFkaXNjIGRlbCBkZXYgJERFViByb290IDI+JjEgPi9kZXYv
bnVsbAokVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDE6IGh0YiBk
ZWZhdWx0IDYwIDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAKJFRDIGNsYXNzIGFk
ZCBkZXYgJERFViBwYXJlbnQgMTogY2xhc3NpZCAxOiRVU0VSSUQgaHRiIHJhdGUg
JHtNQVhSQVRFfSR7VU5JVH0gY2VpbCAke01BWFJBVEV9JHtVTklUfSAgMj4gL2Rl
di9udWxsID4gL2Rldi9udWxsCmlmIFtbICQ/ID09IDAgXV0gOyB0aGVuCiAgICAk
VEMgZmlsdGVyIGFkZCBkZXYgJERFViBwcm90b2NvbCBpcCBwYXJlbnQgMTogaGFu
ZGxlICRVU0VSSUQgZncgY2xhc3NpZCAxOiRVU0VSSUQKICAgIHNob3dfY3VzdG9t
X2NvbmYKZWxzZQogICAgZWNobyAiRWwgc2V0ZW8gbm8gcHVkbyByZWFsaXphcnpl
LCB0YWwgdmV6IHNlYSBxdWUgZWwgdXN1YXJpbyB5YSBmdWUiCiAgICBlY2hvICJj
b25maWd1cmFkbyBwb3IgZXN0ZSBzY3JpcHQuIgpmaQojIHZpbTpzdz00OnNvZnR0
YWJzdG9wPTQ6ZXhwYW5kdGFiOnN5bnRheD1zaDpub3dyYXA6bnU6ZmlsZXR5cGU9
c2gK
--- Fin del archivo ---

Referencias
[1]: (http://lartc.org/howto/, y en español http://www.gulic.org/comos/LARTC), man tc

Etiquetas: , , , , ,

0 comentarios:

Publicar un comentario en la entrada

Suscribirse a Enviar comentarios [Atom]

<< Página principal