Compartiendo experiencias - Crear Addon BFW3. (Parte 1)

Compartiendo experiencias - Crear Addon BFW3. (Parte 1)

Mensagempor Lelouch » Ter Mai 08, 2012 11:06 pm

Imagem
Bangladesh birds by joiseyshowaa Imagem

Hola todos,

Hoy decidí armar este post para compartir con ustedes lo mucho que aprendí durante la creación de mis primeros 2 addons, espero que más compañeros se animen a compartir su experiencia y conocimiento al respecto, y que de esta forma, podamos lograr algo más amplio e interesante para luego publicarlo en la sección tutoriales y finalmente en la wiki.

Aprovecho este hilo para agradecer nuevamente a Fabiosammy, Daniel, Bruno, Jhonfw, Blackbyte, a una buena parte del staff y a aquellas personas que en este momento olvido nombrar, pero que saben que siempre les estaré agradecido, ya que directa o indirectamente siempre han compartido su conocimiento y es gracias a ellos que aprendí lo que hoy es mi deseo compartir con todos ustedes.

░░░░No tengas miedo de dar lo mejor de ti en las pequeñas cosas.
░░░░Cada vez que logras algo te vuelves mas fuerte.
░░░░Si haces pequeñas cosas bien,
░░░░cuando tengas que hacer algo grande sera muy facil.

░░░░[i]Dale Carnegie
[/i]


Imagem
A continuación describo los pasos a seguir para el desarrollo de un addon usando bash scripting, luego crearemos su respectiva interfaz para el webadmin.

Ingredientes:
  • Un editor de texto: Usen el que más les guste, personalmente recomiendo:
    ░░░Imagem░░░░░░░░░░░░Imagem░░░░░░░░░░░░Imagem
    Notepad++ (Windows)░░░Geany (GNU/Linux)░░░Komodo (GNU/Linux-Windows)
    Geany es el que uso actualmente, también tiene una versión para Windows).
  • Un BrazilFW3: Preferiblemente virtualizado y corriendo en la misma máquina en que van a desarrollar sus addons, la idea es ir haciendo pruebas, viendo el avance y ver como todo va encajando. Recomiendo vmware player: Windows | GNU/Linux (archivo .bundle)

    Para Windows:
  • WinSCP
  • Putty
  • sftp-net-drive

    Para GNU/Linux:
    Para enviar un archivo al BFW
    Código: Selecionar todos
    scp archivo_a_copiar root@ip_del_bfw:/_directorio
    Para conectarse vía ssh al BFW
    Código: Selecionar todos
    ssh root@ip_del_bfw
    O desde un admnistrador de archivos como Nautilus presionan ctrl+b, o buscan el botón "conectar con el servidor...", luego escriben la direccion ssh://root@ip_de_bfw
  • Conceptos y comandos básicos de GNU/Linux, estar familiarizado con la consola.
  • Ganas de buscar, leer e intentar. Una buena dosis de paciencia y perseverancia no están de más.

Una pequeñisima lista de comandos útiles:
  • ls -> Muestra o lista el contenido de un directorio si utilizas la opción ls -a te muestra mas información de los archivos y directorios
  • pwd -> Te muestra el directorio donde te encuentras actualmente
  • cd ruta_directorio -> Te lleva a ruta_directorio
  • cd .. -> sube un nivel en el directorio.
  • mkdir nombre_directorio_nuevo -> Crea una nueva carpeta
  • rm nombre_archivo -> Borrar archivo (Hay que tener especial cuidado con este comando)
  • rmdir nombre_directorio -> Borrar directorio si está vacío (Hay que tener especial cuidado con este comando)
  • cp ruta_origen ruta_destino -> Copia un archivo de un lugar origen a un lugar destino.
  • mv ruta_origen ruta_destino -> Mueve un archivo de un lugar origen a un lugar destino. También se utiliza para cambiar el nombre a un archivo ejemplo: mv nombre_viejo nombre_nuevo.
  • clear -> Limpia la ventana del terminal
  • touch nombre_archivo -> Crea un archivo vacío con nombre_archivo como nombre
  • ps -a -> Muestra todos los procesos visibles que están corriendo en el sistema.
  • chmod -> Cambia los permisos* de un archivo o directorio.
*Permisos: Las acciones que se pueden realizar a un archivo o directorio, como por ejemplo abrirlo o ejecutarlo, editarlo, compartirlo, etc.

Imagem
Preparación:
Para simplificar las cosas, decidí dividir el “proceso” en partes:
  1. Breve introducción al bash scripting:
    1. Variables y Condicionales
    2. Bucles y Funciones
    3. Variables Predefinidas, Operadores de comparación, Tuberías y Redirección
  2. El script principal
  3. Archivo de configuración del script
  4. Script de inicio /etc/init.d/00#-nombre_servicio
  5. La interfaz para el webadmin: menu y archivo.cgi
  6. Los archivos de idioma para el webadmin
  7. Empaquetado del addon
  8. Archivos .info

Breve script de introducción:
Los script para bash son archivos de texto, con permisos de ejecución (chmod +x) y que su contenido inicia con el encabezado (shebang) #!/bin/sh, el resto de contenído serán los comandos, procesos y sentencias que deberán ser ejecutadas.

En el siguiente ejemplo se crea un archivo bash directamente en el BFW3 y sin usar ningún editor externo. Para ello vamos a usar el comando “edit” disponible en el BrazilFW3:
Código: Selecionar todos
touch hola.sh #creamos el archivo hola.sh
edit hola.sh
luego escribimos las siguientes líneas
Código: Selecionar todos
#!/bin/sh
var_hora=$(date +%T) #ejecuta el comando date +%T, el cual corresponde a la hora y guarda el dato en la variable llamada “var_hora”
echo "Hola Mundo"
echo "Son las $var_hora"
echo "Hasta pronto!"
Presionamos ctrl+Q y luego “Y” para guardar los cambios.Luego le damos permisos de ejecución:
Código: Selecionar todos
chmod +x hola.sh
Finalmente para ejecutarlo simplemente escribimos ./hola.sh
File: 
Hola Mundo
Son las 21:01:56
Hasta pronto!

También se puede hacer lo mismo usando directamente $(date +%T):
Código: Selecionar todos
#!/bin/sh
echo "Hola Mundo"
echo "Son las $(date +%T)"
echo "Hasta pronto!"
O lo que da lo mismo usar date y agregarle el texto:
Código: Selecionar todos
#!/bin/sh
echo "Hola Mundo"
date +"Son las %T"
echo "Hasta pronto!"


Intentaré mejorar y continuar desarrollando este hilo mínimo una vez por semana.

Abrazos,



Lelouch
P.S.: Comentarios sobre este assunto, favor postar neste tópico => http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=83427#p292418
.
Editado pela última vez por Lelouch em Qua Jul 04, 2012 11:54 am, em um total de 20 vezes.
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

variables y condicionales

Mensagempor Lelouch » Qui Mai 10, 2012 7:36 pm

Hola todos,

Quiero agradecer al admin que dividió el post, la verdad que no había pensado en eso pero creo que así queda más organizadito. A todos aquellos que escribieron en el post de comentarios sobre esta entrada:, a los que me enviaron mp, a los que me enviaron mail, etc.. quiero decirles: muchas gracias por la buena vibra, por valorar este trabajo, por permitirme ayudar. Con sus comentarios, me hicieron ver que cosas más debía incluir ya que como cosa extraña nunca se por donde comenzar...

He aquí la segunda entrada, espero les guste, llegué hasta donde la creatividad se me agotó, y para no comenzar a publicar de forma aburrida decidí dejar así por hoy y publicar lo que alcanze a redactar. \`´/
Imagem

Variables
Forma simple de definir una variable:
nombre_variable=valor
Código: Selecionar todos
#!/bin/sh
var1="Buen día" #var1 y su valor
var2="mundo." #var2 y su valor
echo "$var1 $var2" #mostrar $var1 y $var2
File: Ejemplo de salida
Buen día mundo.

Pedir datos al usuario y guardar el dato en una variable:
Código: Selecionar todos
#!/bin/bash
echo "IP a dar ping:"    #Muestra la frase "IP a dar ping:"
read ip     #lee el dato y lo guarda en la variable llamada "ip"
ping $ip     #Hace un ping a la ip dada por el usuario

Ahora un ejemplo con números:
Código: Selecionar todos
#!/bin/bash
echo "***********************"
echo "Sumar dos números:"
echo "***********************"
echo "Ingrese el primer número:"
read num1
echo "Ingrese el segundo número:"
read num2
echo "La suma de los dos números es $(( $num1 + $num2 ))"
File: Ejemplo de salida
Ingrese el primer número:
1
Ingrese el segundo número:
2
La suma de los dos números es 3

Imagem
Condicionales

.: Condicional if :.
Evalúa una condición, si se cumple dicha condición ejecuta el código, si no se cumple, continua con el programa normalmente.
(En lenguaje terricola → Si sucede tal cosa, entonces haga esto: ...)
(Como en varias ocaciones Ramiro Pampa me ha dicho que me gusta babosear, pues ha llegado el momento, de ahora en adelante a las bobadas le llamaremos “Time to talk drivel”
Time to talk drivel → Si alguna vez se te aparece un zombie, entonces corre!
Código: Selecionar todos
#!/bin/bash
echo "Ingrese un número:"
read num1
echo "Ingrese otro número:"
read num2
#Comprobar si num1 y num2 son iguales:
if [ $num1 = $num2 ]; then
    echo "los números $num1 y $num2 son iguales"
fi
echo "Nada que hacer, no se me pareció un zombie :("

* En este ejemplo nótese que si los dos números son iguales muestra el mensaje de “son iguales”, pero si no lo son, entonces simplemente sigue de largo.
Imagem

.: if else :.
Evalúa una condición, si se cumple dicha condición ejecuta el código sino se cumple ejecuta otro código.
(En lenguaje terrícola → Si sucede tal cosa, entonces haga esto:..., pero si no se sucede entonces haga esto: ….)
Time to talk drivel → Si ves un zombie y está solo; entonces picale un ojo y sal corriendo!. Si no está solo, entonces corre!
Código: Selecionar todos
#!/bin/bash
echo "Ingrese un número:"
read num1
echo "Ingrese otro número:"
read num2
#Comprobar si num1 y num2 son iguales:
if [ $num1 = $num2 ]; then
    echo "los números $num1 y $num2 son iguales"
else
    echo "los números $num1 y $num2 no son iguales"
fi

Imagem

.: case :.
Brinda a nuestro script una forma de “tomar decisiones” en base al valor de una variable, también permite tener una opción “predeterminada” en caso tal que el valor de la variable no corresponda a ninguna de las opciones. Esto evita crear escaleras de condicionales.
(En lenguaje terrícola → En caso de …, haga esto:..., si sucede esto, haga esto:..., si sucede esto otro, haga esto...)
Time to talk drivel → Cuando veas un gnomo; pidele su olla con monedas de oro, cuando veas un troll; distráelo hasta que salga el sol, cuando veas un ogro; no te le acerques. Si no ves ninguno de esos seres no te preocupes, es normal que se escondan...
Código: Selecionar todos
#!/bin/bash
echo "Ingrese un número de día (entre 1 y 7):"
read dia
case $dia in    #Inicia casos para la variable llamada dia
    1) echo "Lunes";; #En caso de que la variable dia sea 1)
    2) echo "Martes";; #En caso de que la variable dia sea 2)
    3) echo "Miercoles";; #En caso de que la variable dia sea 3)
    4) echo "Jueves";; #En caso de que la variable dia sea 4)
    5) echo "Viernes";; #En caso de que la variable dia sea 5)
    6) echo "Sabado";; #En caso de que la variable dia sea 6)
    7) echo "Domingo";; #En caso de que la variable dia sea 7)
    *) echo "Ese día no existe, pero creo que es el del fin del mundo?"
esac #Finaliza case, nótese que esac es la palabra ‘case’ pero al revez

En cada case “1), 2), 3), …” pueden varias líneas de de código, es decir que no siempre es de una sola línea, por ejemplo:
Código: Selecionar todos
1) echo "Usted"
    echo "Seleccionó"
    echo "Lunes"
;;
2) echo "Usted"
    echo "Seleccionó el día"
    echo "Martes"
;;
El signo “;;” es el que finaliza la las líneas que deben ser ejecutadas para cada caso.

Case no solo trabaja con números sino con otros tipos de variables tambień:
Código: Selecionar todos
#!/bin/bash
echo "Ingrese el nombre de un día:"
read dia
case $dia in
    lunes|Lunes) echo "primer día de la semana";;
    martes|Martes) echo "segundo día de la semana";;
    miercoles|Miercoles) echo "tercer día de la semana";;
    jueves|Jueves) echo "cuarto día de la semana";;
    viernes|Viernes) echo "quinto día de la semana";;
    sabado|Sabado) echo "sexto día de la semana";;
    domingo|Domingo) echo "septimo día de la semana";;
    *) echo "No estoy seguro, pero creo que ese día es el día del fin del mundo..."
esac

El signo | se usa como una “o”; lunes (minuscula) o Lunes (mayúscula).
Otra forma de usar case con la variable $dia y no preocuparnos si está en minuscula o mayúsculas es usando: ${dia,,} o ${dia^^} para “usarlas” en minúsculas o MAYUSCULAS respectivamente. Más adelante se destinara una entrada a cosas como estas que se pueden hacer con las variables y que en la mayoría de casos llegan a ahorrar mucho tiempo y código. También una entrada que mostrará de forma breve como "abreviar" algunas líneas de código
Código: Selecionar todos
case ${dia,,} in
    lunes) echo "primer día de la semana";;
    martes) echo "segundo día de la semana";;
    miercoles) echo "tercer día de la semana";;
    jueves) echo "cuarto día de la semana";;
    viernes) echo "quinto día de la semana";;
    sabado) echo "sexto día de la semana";;
    domingo) echo "septimo día de la semana";;
    *) echo "No estoy seguro, pero creo que ese día es el día del fin del mundo..."
esac


Abrazos,



Lelouch
P.S.: Comentarios sobre este assunto, favor postar neste tópico => http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=83427#p292418
P.S.: Ajude Aqui => Imagem
Editado pela última vez por Lelouch em Qua Mai 23, 2012 8:26 pm, em um total de 2 vezes.
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

Bucles y Funciones

Mensagempor Lelouch » Seg Mai 14, 2012 10:44 pm

He aquí la tercera entrada, un poco corta y sin contenido cómico para distraer (ya no hay zombies :-( ).

Imagem

Bucles
Los bucles permiten ejecutar un trozo de código una o más veces dependiendo de si se cumple o no una condición.

.: While :.
Permite ejecutar un trozo de código mientras una condición se cumpla, y sólo se detiene cuando dicha condición es falsa, o también, cuando dentro del mismo trozo de código que se está ejecutando por medio de while hay alguna interrupción.
(En lenguaje humano → Mientras que tal cosa sea cierta, repita...)
Código: Selecionar todos
CONTADOR=1
#mientras el valor de la variable llamada CONTADOR sea menor a 5 haga:
while [ $CONTADOR -le 5 ]; do
   echo "CONTADOR es igual a $CONTADOR"
   CONTADOR=$(( $CONTADOR + 1 ))
done
-le es un comparador que significa menor, una de las entradas estará destinada a ese tipo de comparadores.
File: Ejemplo de salida
CONTADOR es igual a 1
CONTADOR es igual a 2
CONTADOR es igual a 3
CONTADOR es igual a 4
CONTADOR es igual a 5

Ahora, supongamos que tenemos un archivo llamado ip_ping.lst con la siguiente lista de IPs a las que queremos hacer ping:
File: ip_ping.lst
173.194.37.69
173.194.37.70
173.194.37.71
69.171.242.11
66.220.149.11
La forma de hacer ping a cada dirección por medio de un while sería:
Código: Selecionar todos
#!/bin/sh
while read direccion_ip; do
   echo "Haciendo ping a $direccion_ip"
   ping -c1 $direccion_ip
done < ip_ping.lst

Otro ejemplo con más información en el archivo ip_ping.lst, el cual contendrá ahora la siguiente estructura:
ip del sitio a dar ping (espacio) nombre del sitio (espacio) bytes a enviar (espacio) numero de “ecos” a enviar. Ejemplo:
File: ip_ping.lst
173.194.37.69 google.com 64 1
173.194.37.70 google.com 128 5
173.194.37.71 google.com 64 2
69.171.242.11 facebook.com 64 3
66.220.149.11 facebook.com 64 4
En otra entrada veremos como cambiar el "espacio" por un caracter. La idea de poner más datos en el archivo es poder leer cada dato como una variable diferente:
Código: Selecionar todos
#!/bin/sh
while read ip nombre size ecos; do
   echo "Haciendo ping al sitio $nombre"
   ping -c $ecos -z $size $ip
done < ip_ping.lst
“ip nombre size ecos” son nombres de variables que decidí usar para cada palabra que se encuentre en el archivo ip_ping.lst
Imagem

.: for :.
En bash scripting el bucle for se usa de manera un poco diferente a como se usa en C.
Para cada elemento de una lista de elementos repite la accion:
Código: Selecionar todos
#!/bin/bash
#para cada elemento haga:
for ELEMENTO in bra zil fw; do
   echo "$ELEMENTO blablabla"
done
La salía seria:
File: Ejemplo de Salida
bra blablabla
zil blablabla
fw blablabla

Ahora, cada ip del archivo ip_ping.lst ahora podría estar separado por espacios así:
File: ip_ping.lst
173.194.37.69 173.194.37.70 173.194.37.71 69.171.242.11 66.220.149.11
Código: Selecionar todos
#!/bin/sh
for element in $(cat ip_ping.lst); do
   echo “Haciendo ping a $element”
   ping -c1 $element
done


Imagem
Funciones
Al igual que en la mayoria de lenguajes de programación, en bash es posible utilizar funciones. Una funcion es como tener otro script dentro del mismo script “principal”, esto evita tener que crear un archivo diferente para cada script, también es ideal cuando tenemos que repetir código, las funciones nos evitan tener que estar escribiendo el mismo código una y otra vez. En fin tienen muchas ventajas que se resumen en ahorro de tiempo, facilidad de leer, mantener y programar el script.
Código: Selecionar todos
#!/bin/bash
function fn_salir() {
   clear
   exit
}
function fn_saludar() {
   echo "Hola mundo!"
}

fn_saludar
fn_salir
echo “esto nunca se mostrará...”
Con el anterior script se crean dos funciones, una llamda fn_saludar y otra llamda fn_salir. Finalmente se llama a cada una de las funciones: primero llamamos la funcion fn_saludar y luego la funcion fn_salir, por lo tanto la frase “esto nunca se mostrará...” nunca saldrá en pantalla.

Las funciones también se pueden declarar sin la palabra "function" como:
Código: Selecionar todos
#!/bin/bash
fn_salir() {
   clear
   exit
}
fn_saludar() {
   echo "Hola mundo!"
}

Ahora, un ejemplo con argumentos:
Código: Selecionar todos
#!/bin/bash
#declaramos la funcion llamada sumar:
function sumar(){
   resultado=$(( $1 + $2 ))
}
echo "Ingrese primer número"
read num1
echo "Ingrese el segundo número"
read num2
sumar $num1 $num2
echo "el resultado es $resultado"
exit
O lo que da lo mismo:
Código: Selecionar todos
#!/bin/bash
function sumar(){
   echo "el resultado es $(( $1 + $2))"
}

echo "Ingrese primer número"
read num1
echo "Ingrese el segundo número"
read num2
sumar $num1 $num2
exit
Cuando llamamos a la funcion sumar:
Código: Selecionar todos
sumar $num1 $num2
también le estamos pasando los valores de $num1 y $num2, la funcion leerá el primer argumento en este caso $num1 como $1 y el segundo argumento como $2
Código: Selecionar todos
 resultado=$(( $1 + $2 ))

Ultimo ejemplo:
Código: Selecionar todos
#!/bin/bash
function fn_ping(){
   ping -c1 $1
}

function fn_arping(){
   arping -c1 $1
}

function fn_menu(){
   echo ":::: Que desea hacer? ::::"
   echo -e "1. hacer ping\n2. hacer arping\n3. Salir"
   read opcion
   case $opcion in
       1) fn_ping $ip;;
       2) fn_arping $ip;;
       3) exit;;
       *) echo "opcion no válida";;
   esac
   fn_menu
}

echo "Ingrese una ip para comenzar:"
read ip
fn_menu


Abrazos,



Lelouch
P.S.: Comentarios sobre este assunto, favor postar neste tópico => http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=83427#p292418
P.S.: Ajude Aqui => Imagem
Editado pela última vez por Lelouch em Qua Mai 23, 2012 8:28 pm, em um total de 1 vez.
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

Variables Predefinidas, operadores, Tuberías y redirección

Mensagempor Lelouch » Qui Mai 17, 2012 9:41 pm

Hola Mundo!.

Esta es la última entrega de esta sección de “breve introducción al bash scripting” no salió tan “breve” ¿eh!? y para variar tampoco hay zombies ^^

Advertencia: Tal vez me quedó un poco aburrida de leer, pero bue... que se le va a hacer, ni modo, hay que tener en cuenta que su contenido es jocoso, aquí está el principio de lo que muchos esperaban y desesperaban cha cha cha chan... Con esto y con lo que relatan los post hasta ahora, ya pueden ir creando sus scripts que es la parte principal de sus addons. Sin más preámbulos:

Acerca de los comandos usados en esta entrada:
Los comandos descritos a continuación tienen muchas más aplicaciones al igual que todos los comandos que se han usado hasta el momento. NO TE LIMITES!!!

Imagem

Variables predefinidas o especiales
A continuación está la lista de variables predefinidas con una corta descripción:

$0 contiene el nombre de nuestro script
$1...$9,${10}... Contiene los parámetro que se le pasan al script
$# es el número de parámetros que se le pasan al script
$@ Contiene una lista de TODOS los parámetros que se le pasan al script
$* Contiene TODOS los argumentos como única palabra, se usa el “_” como separador
$$ Corresponde al PID (número de proceso) de nuestro script
$? Resultado de la ejecución del comando anterior
Ver más »

Imagem

Operadores de comparación
Imagem
Ver más »

Los operadores “&&” y “||” pueden ser usados como un “si y solo si...”
Código: Selecionar todos
[ condicion1 ] && [ condicion2 ]
condicion2 se ejecutará si y solo si el “estado de salida” correspondiente al proceso de ejecutar la condicion1 fue satisfactoria (exit 0)
Código: Selecionar todos
[ condicion1 ] && [ condicion2 ] || [ condicion3 ]
condicion 3 se ejecutará si y solo si el “estado de salida” correspondiente al proceso de ejecutar la condición 2 devuelve un número diferente a 0 (1-255)

Lo anterior nos permite “abreviar” algunas líneas de código, tomando el ejemplo del if-else que originalmente teníamos escrito como:
Código: Selecionar todos
#!/bin/bash
echo "Ingrese un número:"
read num1
echo "Ingrese otro número:"
read num2
#Comprobar si num1 y num2 son iguales:
if [ $num1 = $num2 ]; then
   echo "los números $num1 y $num2 son iguales"
else
   echo "los números $num1 y $num2 no son iguales"
fi


Usando && y || podríamos escribirlo de la siguiente forma:
Código: Selecionar todos
#!/bin/bash
echo "Ingrese un número:"
read num1
echo "Ingrese otro número:"
read num2
#Comprobar si num1 y num2 son iguales:
[ $num1 = $num2 ] && echo "los números $num1 y $num2 son iguales" || echo "los números $num1 y $num2 no son iguales"


Las siguientes comparaciones son un “if” en escencia, y son utiles para saber por ejemplo si un archivo existe, podemos saber si es un archivo o un directorio, podemos saber si si está o no vacio, etc...

[ -e FILE ] Verdadero si FILE existe
[ -d FILE ] Verdadero si FILE existe Y es un directorio
[ -r FILE ] Verdadero si FILE existe Y tiene permisos de lectura
[ -s FILE ] Verdadero si FILE existe Y su tamaño ES MAYOR a cero
[ -w FILE ] Verdadero si FILE existe Y tiene permisos de escritura
[ -x FILE ] Verdadero si FILE existe Y tiene permisos de ejecución
[ -L FILE ] Verdadero si FILE existe Y es un enlace simbólico
[ -N FILE ] Verdadero si FILE existe Y fue modificado la última vez que fue leído.
Ver más »

Imagem

Los Parámetros
Los addons para BrazilFW que usan bash scripting por lo general aceptan parámetros. Dicho en otras palabras, es posible pasarle datos a la hora de ejecutar el script, lo que permite interactuar con el addon desde la consola, y lo que se hace desde el webadmin es enviarle parámetros a dicho script para facilitar la administracion o interaccion.

Los parámetros se pasan al script a la hora de ejecutarlos:
./mi_script.sh param1 param2 param3 …

Cuando ejecutamos:
Código: Selecionar todos
/etc/init.d/squid stop
se está pasando el parámetro “stop” al script del squid.

El siguiente script es un ejemplo un poco tonto, al cual le faltarían muchas cosas, pero para fines de introducción nos sirve:
Código: Selecionar todos
#!/bin/sh
sume(){
   echo "el resultado es $(( $1 + $2))"
}

reste(){
   echo "el resultado es $(( $1 - $2))"
}

if [ "$#" -ne 3 ]; then
    echo "Faltan parámetros";
    echo "Debe ser: $0 operacion num1 num2"
    exit 1;
fi

case $1 in
    sumar) sume $2 $3;;
    restar) reste $2 $3;;
    *) echo "operación no encontrada"
esac

exit 0;
al ejecutar ./mi_script.sh
nos va a mostrar:
File: Ejemplo de Salida
Faltan parámetros
Debe ser: ./mi_script.sh operacion num1 num2

El “exit 1” determina el “estado de salida” del script. Así que al ejecutar echo $? nos devolverá un “1” que quiere decir que el script o comando terminó de forma incorrecta.

$? solo es 0 cuando el script terminó de forma correcta, si arroja un número entre 1-255 quiere decir que terminó de forma incorrecta.

Por lo tanto al ejecutar
Código: Selecionar todos
./mi_script.sh sumar 2 5
La salida será:
File: Ejemplo de Salida
el resultado es 5
Por consiguiente $? será 0

Imagem

Tuberías y Redirección
El carácter “|” en una línea de comandos nos permite utilizar la salida de una orden como entrada para otra orden, programa o comando:
Código: Selecionar todos
cat /etc/brazilfw/brazilfw.cfg | grep mysql

cat se encarga de leer el archivo brazilfw.cfg línea por linea y “mostrarlo” al comando grep, el comando grep a su vez lee lo que el comando cat le envía y dentro de las líneas busca la palabra “mysql”, finalmente cuando la encuentra la muestra en pantalla.

Por otro lado una redirección utiliza los carácteres “>”, “&>” y “>>”:
comando > un_archivo envía la salida del comando a un_archivo, si un_archivo ya existe entonces reemplaza (BORRA) el contenido actual con el contenido de la salida del comando.

comando >> un_archivo envía la salida del comando a un_archivo, si el archivo ya existe y tiene contenido entonces agrega al final del archivo el contenido de la salida del comando.

comando &> un_archivo Es similar al >, si el archivo existe cambia el contenido por el contenido nuevo, mas adelante veremos el uso de esto para enviar las cosas a /dev/null

Abrazos,



Lelouch
P.S.: Comentarios sobre este assunto, favor postar neste tópico => http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=83427#p292418
P.S.: Ajude Aqui => Imagem
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

El Script Principal

Mensagempor Lelouch » Qua Mai 30, 2012 5:33 pm

.: Capítulo 2 :.
Imagem
Birds & graffiti by jphilipg Imagem

Imagem

El Script Principal

:!: A tener en cuenta: Es bueno dedicarle algunas horas a escribir y “garabatear” en lapiz y papel sobre lo que queremos que haga nuestro addon, escribir como lo va a hacer, ver que necesitamos. Todas esascosas ayudan en el proceso...

El script principal no es más que un script comun y corriente, que acepta parámetros en línea de comandos. La estructura que he trabajado hasta el momento es:

  • Shebang (#!/bin/sh)
  • Licencia (GNU/GPL claro!)
  • Declaracion de variables (opcional: asignar variables a parámetros)
  • Declaracion de funciones
  • Condicionales (si se requiere)
  • Uso de "case" para cada primer argumento que se le pasa al script por línea de comandos.
Imagem

.: Shebang :mrgreen: :.
Código: Selecionar todos
#!/bin/sh


.: La licencia :mrgreen: :.
Código: Selecionar todos
#  exaple.sh

#  Copyright 2012 Carlos R. <carlosrincon2005@gmail.com>

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.


.: Declaración de Variables :.
Algunas veces suelo asignar el valor de un parámetro a una variable es decir que se puede invocar con $1 o con $_parametro1,
es útil algunas veces para tener nombres de variables más amigables y no perdernos entre tantos signos.
Código: Selecionar todos
_nombre_script="$0"
_numero_params="$#"
_parametro1="$1"
_parametro2="$2"
_parametro3="$3"


.: Declaración de Funciones :.
Para este ejemplo usaremos:
Una funcion llamada "fn_ver" que nos listará el contenido de la carpeta en la que nos encontremos ubicados al correr el script
Código: Selecionar todos
fn_ver(){
   ls "$(pwd)"
   #pwd es un comando que indica la ruta (carpeta) en la cual nos encontramos actualmente.
}
Una función para buscar archivos:
Código: Selecionar todos
fn_buscar(){
    find "$(pwd)" -name "$1"
    #pwd es un comando que indica la ruta (carpeta) en la cual nos encontramos actualmente.
    #$1 es el primer argumento que se le pasa a la función fn_buscar
}
Una función para crear un archivo o una carpeta:
Código: Selecionar todos
fn_crear(){
   [ "$1" = "file" ] && touch "$2"
   [ "$1" = "directory" ] && mkdir "$2"
}


.: Condicionales :.
Aqui uso condicionales para comprobar la cantidad de parámetros que el usuario pasa al script, no siempre se necesitan y más teniendo en cuenta que los parámetros los vamos a pasar la mayoría de veces desde el webadmin, y whosman hizo un gran trabajo con el webadmin; crear el formulario con verificación
de datos es cuestión de minutos.

Por ejemplo, para comprobar que se pasen minimo 2 y máximo 3 parámetros al script, excepto si _parametro1 es la palabra "ver" usaríamos:
Código: Selecionar todos
if [ "$_parametro1" != "ver" ]; then
   if [ "$_numero_params" -le 1 -o "$_numero_params" -gt 3 ]; then
      echo "Este addon requiere minimo dos y maximo tres parámetros"
       exit 1;
   fi
fi


.: Uso de CASE :.
Se debe definir una acción para la primera variable $1.
Recuerden que $1 es el primer parámetro que el usuario le pasa al script, y por lo tanto es la que le indica al script que que acción tomar:
Código: Selecionar todos
case "$_parametro1" in
   #En caso que el primero parámetro que se le pasa al script sea la palabra "ver" se realizará la llamada a la funcion fn_ver":
   ver) fn_ver;;

   # En caso que el primer parámetro que se le pasa al script sea la palabra "buscar":
   buscar) fn_buscar "$_parametro2"
      # Llamamos a la funcion fn_buscar y le pasamos el valor
      # del segundo parámetro introducido por el usuario, el cual será el nombre del archivo a buscar:
      # Fijense que aquí el nombre del archivo a buscar es el parámetro $2,
      # y se la enviamos así a la funcion fn_buscar, ...
      # pero la funcion fn_buscar la lee como $1 por ser el primer parámetro que se le envía.
   ;;

   crear)
   # En caso que el primer parámetro que se le pasa al script sea la palabra "crear":
   # Comprobamos si el segudno parámetro que se le pasó al script es la palabra "archivo":
   if [ "$_parametro2" = "archivo" ]; then
         # En caso de ser "archivo" entonces llamamos la funcion fn_crear y le pasamos
         # el parámetro "file" y el tercer parámetro introducido por
         # el usuario  el cual corresponderá al nuevo nombre del archivo:
         fn_crear "file" "$_parametro3"
   # Si  la primera palabra no es "archivo" entonces verificamos si es "directorio":
      elif [ "$_parametro2" = "directorio" ]; then
         # De ser verdadero, entonces llamamos la funcion fn_crear, le pasamos
         # el parámetro "directory" y el tercer parámetro dado por el usuario:
         fn_crear "directory" "$_parametro3"
   else
      # Si el segundo parámetro no es ni la palabra "archivo", ni la palabra "directorio",
      # entonces mostramos en pantalla un mensaje informando como se debe usar:
      echo "debe ser: $_nombre_script crear archivo/directorio nombre_para_fichero_creado"
   fi
;;

*) echo "Uso: $nombre_script { ver | buscar | crear }"
esac


Imagem
.: Código Completo :.
Código: Selecionar todos
#!/bin/sh

#  exaple.sh

#  Copyright 2012 Carlos R. <carlosrincon2005@gmail.com>

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.


# ___________Declaración de Variables____________
# Algunas veces suelo asignar el valor de un parámetro a una variable
# es decir que se puede invocar con $1 o con $_parametro1,
# es útil algunas veces para no perdernos entre tantas variables.
_nombre_script="$0"
_numero_params="$#"
_parametro1="$1"
_parametro2="$2"
_parametro3="$3"

# ___________Declaraciń de funciones_____________

# Una funcion llamada "fn_ver" que nos listará el contenido de la carpeta en la que nos encontremos ubicados al correr el script
fn_ver(){
   ls "$(pwd)"
}

# Una función para buscar archivos:
fn_buscar(){
    find "$(pwd)" -name "$1"
    #pwd es un comando que indica la ruta (carpeta) en la cual nos encontramos actualmente.
    #$1 es el primer argumento que se le pasa a la función fn_buscar
}

# Una función para crear un archivo o una carpeta
fn_crear(){
   [ "$1" = "file" ] && touch "$2"
   [ "$1" = "directory" ] && mkdir "$2"
}

# __________Condicionales___________________
# Aqui uso condicionales para comprobar la cantidad de parámetros
# que el usuario pasa al script, no siempre se necesitan y más
# teniendo en cuenta que los parámetros los vamos a pasar la
# mayoría de veces desde el webadmin, y whosman hizo un gran
# trabajo con el webadmin; crear el formulario con verificación
# de datos es cuestión de minutos.

# para comprobar que se pasen minimo 2 y máximo 3 parámetros al script,
# excepto si _parametro1 es la palabra "ver":
if [ "$_parametro1" != "ver" ]; then
   if [ "$_numero_params" -le 1 -o "$_numero_params" -gt 3 ]; then
      echo "Este addon requiere minimo dos y maximo tres parámetros"
       exit 1;
   fi
fi

# _____________Uso de "case"________________
# se debe definir una acción para la primera variable $1.
# Recuerden que $1 es el primer parámetro que el usuario
# le pasa al script, y por lo tanto es la que le indica
# al script que que acción tomar:

case "$_parametro1" in
   #En caso que el primero parámetro que se le pasa al script sea la palabra "ver":
   ver) fn_ver;;

   # En caso que el primer parámetro que se le pasa al script sea la palabra "buscar":
   buscar) fn_buscar "$_parametro2"
      # Llamamos a la funcion fn_buscar y le pasamos el valor
      # del segundo parámetro introducido por el usuario, el cual será el nombre del archivo a buscar:
      # Fijense que aquí el nombre del archivo a buscar es el parámetro $2,
      # y se la enviamos así a la funcion fn_buscar, ...
      # pero la funcion fn_buscar la lee como $1 por ser el primer parámetro que se le envía.
   ;;

   crear)
   # En caso que el primer parámetro que se le pasa al script sea la palabra "crear":
   # Comprobamos si el segudno parámetro que se le pasó al script es la palabra "archivo":
   if [ "$_parametro2" = "archivo" ]; then
         # En caso de ser "archivo" entonces llamamos la funcion fn_crear y le pasamos
         # el parámetro "file" y el tercer parámetro introducido por
         # el usuario  el cual corresponderá al nuevo nombre del archivo:
         fn_crear "file" "$_parametro3"
   # Si  la primera palabra no es "archivo" entonces verificamos si es "directorio":
      elif [ "$_parametro2" = "directorio" ]; then
         # De ser verdadero, entonces llamamos la funcion fn_crear, le pasamos
         # el parámetro "directory" y el tercer parámetro dado por el usuario:
         fn_crear "directory" "$_parametro3"
   else
      # Si el segundo parámetro no es ni la palabra "archivo", ni la palabra "directorio",
      # entonces mostramos en pantalla un mensaje informando como se debe usar:
      echo "debe ser: $_nombre_script crear archivo/directorio nombre_para_fichero_creado"
   fi
;;

*) echo "Uso: $nombre_script { ver | buscar | crear }"
esac


.: Salidas de Ejemplo: :.
El script anterior lo he guardado con el nombre de example.sh y le he dado permisos de ejecución (chmod +x)
Si ejecutamos: ./example.sh
File: ./example.sh
Este addon requiere minimo dos y maximo tres parámetros

Si ejecutamos: ./example.sh ver
File: ./example.sh ver
bin    dev    etc    example.sh    lib    mnt    partition    proc    root    sbin    sys    tmp    usr    var

Si ejecutamos: ./example.sh asd jlk
File: ./example.sh asd jlk
Uso:  { ver | buscar | crear }

Si ejecutamos: ./example.sh buscar partition
File: ./example.sh buscar partition
/partition


Abrazos,



Lelouch
P.S.: Comentarios sobre este assunto, favor postar neste tópico => http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=83427#p292418
P.S.: Ajude Aqui => Imagem
Editado pela última vez por Lelouch em Ter Jun 26, 2012 3:13 pm, em um total de 2 vezes.
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

El archivo de configuración del script

Mensagempor Lelouch » Dom Jun 03, 2012 9:06 pm

Imagem

El archivo de configuración del script

Es un archivo de texto que se guardará en /etc/brazilfw/nombre_addon.cfg (puede tener cualquier otra extensión, pero para seguir con la uniformidad es recomendable usar la extensión .cfg).

Este archivo contiene una serie de variables que serán usadas por el addon. Es decir que dado el caso que un script requiera hacer una conexión a una base de datos, se usaría el archivo .cfg para guardar las variables correspondientes al usuario, contraseña, host, nombre de la base de datos, etc...

Un ejemplo simple sería suponer que tenemos un script que va a verificar la conexión a internet; para esto nuestro archivo de configuración contendrá 3 sitios a los cuales hacer ping y una variable que contendrá la lista de interfaces de red usadas por el servidor para conectarse a Internet:
File: /etc/brazilfw/example.cfg
# Use este archivo para declarar tres sitios a los cuales se hará ping.
# Las interfaces de red que conectan a internet así deberán ser declararlas así: Si tiene solo una interfaz que conecta a internet y es eth1 deberá declararla así wan=”eth1”, si tiene más de una interfaz que conecta a internet use espacios: wan="eth1 eth2 eth3 …"
site1="google.com"
site2="yahoo.com"
site3="facebook.com"
wan="eth1 eth2 eth3"

Y en nuestro script usaríamos:
Código: Selecionar todos
. /ruta/al/archivo.cfg
NOTA: Es un signo “punto” seguido de un “ESPACIO”, luego la ruta al archivo.cfg.
La traducción de esto sería algo similar a: “Vamos a usar información de... /ruta/al/archivo.cfg”

Código: Selecionar todos
#!/bin/sh

# Indicamos la ruta al archivo example.cfg:
. /etc/brazilfw/example.cfg

# Declaramos la función que hará ping a cada uno de los sitios
# y que devolverá un valor de 0 a 3 dependiendo de los resultados del ping a cada sitio:
fn_ping(){
   ESTADO=0
   for i in `seq 1 3`; do
       eval ping -c1 -I $1 "\${site${i}}" > /dev/null 2>&1
       [ "$?" = 0 ] && ESTADO=$(( $ESTADO + 1 ))
   done
   return "$ESTADO"
}

for tarjeta in $wan; do
   fn_ping $tarjeta
   case "$ESTADO" in
       0) echo "$tarjeta: Sin respuesta" ;;
       #Se usará el mismo texto de respuesta para los ESTADOS 1 y 2:
       1|2) echo "$tarjeta: Conexion intermitente o alguno de los host configurados en example.cfg no estan disponibles" ;;
       3) echo "$tarjeta: Perfecto" ;;
       *) echo "$tarjeta: Algo extraño ocurrió durante las pruebas"
   esac
done
El bucle FOR usado por este script lee la variable “wan” que está en el archivo example.cfg, y para cada interfaz que esté declarada en dicha variable hará un ping a los diferentes valores de site1, site2, site3 que tamibén estan en el archivo example.cfg.
Finalmente dependiendo de la cantidad de sitios que contesten mostrará si la conexión tiene respuesta para cada una de las interfaces declaradas como "wan"

Esto es todo por ahora :D
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.

El script de servicio

Mensagempor Lelouch » Qua Jun 06, 2012 3:31 pm

Imagem

:!: No todos los addons requieren de un script de servicio

.: Características :.
Un script de servicio tiene las siguientes características:

  • permiten iniciar el servicio
  • permiten recargar el servicio
  • permiten detener el servicio
  • permiten ver el estado del servicio
  • Se ejecutan al arrancar el sistema
  • Se alojan /etc/init.d/###-nombre_servicio

.: Orden de arranque :.
El número ### indica el orden de carga del servicio, aquí está la lista de servicios actuales del BrazilFW 3 tras una instalación limpia:
Código: Selecionar todos
001-acpi
002-named
003-sshd
004-webadmin
005-cron
006-dhcp
007-squid
008-mysql
009-ipupdate
010-l2tp
010-openvpn
010-pptp
En caso que nuestro addon requiera de un script de servicio para iniciar al arrancar el sistema, se deberá tener en cuenta los otros servicios de los cuales dependerá nuestro addon.

Por ejemplo, el bfwcache usa el nombre 009-bfwcache como nombre para su script de servicio. Esto se debe a que bfwcaché usa squid y mysql para funcionar, por lo tanto bfwcaché tiene que iniciarse después de que 007-squid y 008-mysql hallan cargado. Esto evita que la carga de bfwcaché falle.

.: Estructura básica :.
La estructura básica de un script de servicio es la siguiente:
Código: Selecionar todos
#!/bin/sh
# Autor y licencia...

#Primero las funciones:
fn_start(){
    echo "Iniciando servicio... "
    ... codigo
}

fn_stop(){
    echo "Deteniendo servicio... "
    ... codigo
}

fn_estado(){
   codigo
   echo "Estado $"
}

#Luego el CASE:
case $1 in
   start) fn_start;;
   stop) fn_stop;;
   restart)
      fn_stop
      [ "#?" = 0 ] && fn_start
   ;;
   status) fn_estado;;
   *) echo "Usage of /etc/init.d/$0 { start|stop|restart|status}"
    exit 1
esac
exit 0


Lo lamento mucho pero me urge terminar el contenido de estos post lo antes posible :? y pido perdon pr estas dos ultimas entradas tan cortas, se está explicando solo la base, pero con la base y el resto de entradas ya se puede comenzar a armar algo, en caso de que se les presente algun inconveniente, creo que con un poco de investigación podría solucionarse, o si lo desean pueden preguntar en el foro correspondiente.

sekai wa kawaru
GNU/Linux addict, instead of Linux addict.
Sou, machigatteita no wa ore ja nai! Sekai no hou da!...
Sekai wa kawaru! Kaerareru...

Hangyaku no Rurūshu...

New scheme: BFW3(LB) - BFW3BridgeCache - ArgentoBridgeQoS
Avatar do usuário
Lelouch
BFW Beneméritos
 
Mensagens: 1324
Registrado em: Dom Out 05, 2008 7:39 pm
Localização: #!/bin/sh
BrazilFW Box: BrazilFW: RAM 3GB, ATHLON X2 5600+, HDD 160GB+120GB, LB: 2Mb+8Mb.
BFW3 BuildTree on GNU/Linux Archlinux 64 bits.


Voltar para BrazilFW 3.x

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron