jueves, 30 de mayo de 2013

Configurar Servidor de streaming MPD para usar Alsaequal

Existe un pequeño problema al transmitir desde el servidor de streaming integrado a MPD, y ese es que la salida de audio la maneja por Hardware, es decir que tener una herramienta como Alsaequal, (ecualizador para el servidor de sonido Alsa), nos es intrascendente, ya que no lo toma en cuenta y el sonido sale tal cual esta en nuestro equipo.

Si queremos poder darle un poco de sabor a nuestra transmisión debemos cambiar la configuración de MPD, en /etc/mpd.conf modificamos:

audio_output {
 type  "alsa"
 name  "My ALSA EQ"
 device  "plug:plugequal" # optional
 format  "44100:16:2" # optional
# mixer_type      "hardware"      # optional
 mixer_device "default" # optional
 mixer_control "PCM"  # optional
 mixer_index "0"  # optional
}

Agregamos el servicio de mpd al grupo de audio:

# usermod -aG audio mpd

Si queremos revisar que nuestro usuario y mpd estan en la lista del grupo de audio:

# cat /etc/group | grep audio

Y listo!! ya tenemos ecualizador en nuestro servidor de streaming con MPD!!! PD.- Aquí el post original en Ingles.

Servidor de streaming con Debian y MPD, radio por internet.

MPD (Music Player Daemon) es un reproductor de musica por consola, liviano y de fácil acceso, aunque su único defecto (si se le puede llamar así) es que carece de un control de lista de reproducción, pero existen muchos programas que pueden controlarlo desde la consola o con interfaz gráfica.

Una de sus ventajas que se tiene es que se puede administrar vía LAN o Internet a traves del puerto 6600, en lo particular uso GMPC para administrarlo.

Y otra gran ventaja es que trae integrado un servidor de transmisión por http, para hacer streaming por la LAN o Internet, sin necesidad de otro servidor de Streaming como Icecast (que es otro rollo pero lo veremos despues).

El hardware necesario es minimo, lo he tenido trabajando con una pentium II a 333 MHz y 256 en RAM y disco duro de 8 GB, sin teclado, mouse y monitor. La instalación del sistema operativo es Debian Wheezy netinstall, en una instalacion mínima, solo el sistema base.

La instalación en si es muy sencilla, pero vamos a utilizar aptitude para corregir cualquier falta de paquetes necesaria.

Como requisitos es necesario tener instalado alsa o pulseaudio para el audio, lame y vorbis-tools para poder reproducir mp3 y ogg.

En mi caso solo lo hago con [b]alsa[/b]:

# apt-get install alsa-base alsa-oss alsa-source apmd alsa-utils linux-sound-base xapm 

# apt-get install lame vorbis-tools

Reiniciamos alsa para que tome la configuración:

 # /usr/sbin/alsa reload

Instalamos MPD:
# apt-get install mpd

Y vamos a crear las carpetas de configuracion de mpd:

$ mkdir /home/mi_usuario/.mpd

$ mkdir /home/mi_usuario/.mpd /playlist

Y les recomiendo que creen una carpeta en donde tengan la musica que quieren que se reproduzca pro mpd, en este caso creamos esta carpeta así:

$ mkdir /home/mi_usuario/musica

Y vamos a editar nuestro fichero de configuración de mpd.

# nano /etc/mpd.conf

Y vamos a cambiar las siguientes lineas y dejarlas de esta manera, favor de sustituir mi_usuario por el suyo:

music_directory "/home/mi_usuario/musica"

playlist_directory "/home/mi_usuario/.mpd/playlist"

db_file   "/home/mi_usuario/.mpd/tag_cache"

log_file  "/home/mi_usuario/.mpd/mpd.log"

pid_file  "/home/mi_usuario/.mpd/pid"

state_file  "/home/mi_usuario/.mpd/state"

sticker_file                   "/home/mi_usuario/.mpd/sticker.sql"

user    "mi_usuario"

Si queremos dejar solamente nuestro reproductor de uso local, en la siguiente linea la dejamos como viene:

bind_to_address  "localhost"

Si queremos transmitir nuestra musica cambiamos localhost por nuestra direccion ip local, (cambiamos "mi_direccion_ip" por el numero de nuestra dirección ip):

bind_to_address  "mi_direccion_ip"

Descomentamos la linea del puerto, (quitamos el signo de numero):

port    "6600"

Ahora la configuracion de salida por Alsa:

# An example of an ALSA output: 
#
audio_output { 
 type  "alsa" 
 name  "My ALSA Device" 
 device  "hw:0,0" # optional 
 format  "44100:16:2" # optional 
 mixer_device "default" # optional 
 mixer_control "PCM"  # optional 
 mixer_index "0"  # optional 
} 
#

La dejamos tal cual. Y si queremos transmitir por internet, la configuracion del servidor httpd seria esta:

# An example of a httpd output (built-in HTTP streaming server): 
# 
audio_output { 
 type  "httpd" 
 name  "Debiancast" 
 encoder "lame"   # optional, vorbis or lame 
 port  "8000" 
# quality  "5.0"   # do not define if bitrate is defined 
 bitrate  "128"   # do not define if quality is defined 
 format  "44100:16:1" 
}

De aqui lo importante, name es el nombre que le queremos dar a nuestro server de stream, y el encoder podemos usar vorbis si queremos reproducir ogg (por default)o lame si queremos reproducir mp3.

Y ¡listo! Ya terminamos la configuración de mpd. Ahora a crear la lista de reproducción esta la podemos configurar con Sonata, esto lo podemos hacer desde nuestro propio equipo o desde otro equipo en la red en caso de que nuestro servidor no tenga interfaz gráfica.

Con un click derecho del mouse debajo de la barra de reproducción aparece el submenu, entramos a preferencias y creamos un perfil, ahora llenamos la información:


Nombre: nombre_del_servidor
Servidor: direccion_ip
Puerto: 6600
Contraseña:
Directorio de Musica: (aqui siempre lo hace por defecto, segun la configuracion del mpd)


Como podemos ver nos aparece la musica o archivos de audio de nuestra carpeta que configuramos en mpd.conf, de ahi escogemos y hacemos nuestra lista de reproducción y podemos poner que se repita y que sea aleatoria.



Nos conectamos y listo! Ya estamos transmitiendo nuesta lista de reproducción por internet. Para poder escucharla podemos usar el winamp o el audacious, en agregar, seleccionamos URL o dirección IP y la ponemos de este modo:



http://direccion_ip:8000

Esto significa que se esta transmitiendo desde la dirección ip del servidor
por el puerto 8000.


Para poder escucharlo desde fuera de nuestra red local, tenemos que mapear el puerto en nuestro router, es decir redireccionar las llamadas al puerto 8000 a la dirección ip de nuestro servidor en el mismo puerto (8000). Y además tenemos que configurar un cliente de DNS dinámico como no-ip, creamos un host en no-ip e instalamos el cliente en nuestro servidor y con eso es suficiente.

lunes, 7 de mayo de 2012

Herramientas para Stream Server - Alsa y Alsaequal

Ahora vamos a seguir con la instalación de nuestro stream server o servidor de radio por internet.

El Advanced Linux Sound Architecture (ALSA) es uno de los encargados del sistema de audio a los sistemas operativos GNU/Linux, hay otros como pulseaudio, pero el que nos es mas util para nuestros propositos es este.

Una de las ventajas que tiene es que trabaja bien con MPD y con IDJC e Icecast2, ademas existe una herramienta  que se llama alsaequal provista por Digital Machine, que nos permite en pocos pasos ecualizar todo lo que se reproduzca a travez de alsa.

Para un sistema de escritorio esta super genial porque tenemos un ecualizador que sirve desde cualquier reproductor de musica asi como para videos en la web o en cualquier reproductor de video.

Bueno primero por lo primero, así que vamos a hacer la instalación de alsa, en nuestra TTY, nos cambiamos a root, y escribimos:
# apt-get install alsa-base alsa-oss alsa-source alsa-utils linux-sound-base oss-compat xapm apmd





Una vez hecho esto, vamos a instalar las dependencias que harán funcionar nuestro ecualizador, instalamos:
# apt-get install caps libasound2-dev libasound2-plugins libasound2-plugin-equal


Y despues descargamos el paquete alsaequal de la pagina de Digital Machine, con wget:
# wget http://www.thedigitalmachine.net/tools/alsaequal-0.6.tar.bz2

Despues lo descomprimimos:
# tar -xvvf alsaequal-0.6.tar.bz2

Y nos cambiamos al directorio recien creado:

# cd alsaequal

Una vez ahí limpiamos el caché de make:
# make clean

Y compilamos:

# make
# make install

Y volvemos a limpiar el caché, ahora vamos a salir de root y regresar a nuestro usuario común y creamos en nuestra carpeta de /home/mi_usuario el siguiente archivo:
$ touch .asoundrc


Y lo abrimos con nano


$ nano .asoundrc


Y escribimos lo siguiente:
ctl.equal {
      type equal;
    }

    pcm.plugequal {
      type equal;
      # Modify the line below if you don't
      # want to use sound card 0.
      slave.pcm "plug:dmix";
    }

    # pcm.equal {
      # Or if you want the equalizer to be your
      # default soundcard uncomment the following
      # line and comment the above line.
    pcm.!default {
      type plug;
      slave.pcm plugequal;
    }
Una vez hecho esto, regresamos a root y reconfiguramos alsa:

# alsa force-reload

Y listo!!!

Aqui ya podemos controlar el volumen con 

$ alsamixer

Y para entrar al ecualizador escribimos:

$ alsamixer -D equal


Ó dentro de alsamixer :



presionamos F6 y nos aparece una ventana para seleccionar la tarjeta de Sonido, vamos a donde dice enter device name y le damos enter



en la siguiente ventana escribimos equal y damos enter



 y nos hace el cambio al ecualizador. 




 Y eso seria todo por el momento, en el siguiente post veremos la instalación de MPD.


Saludos!




sábado, 5 de mayo de 2012

Actualización del Sistema desde TTY

Despues de hacer la Instalación Minima de Debian Squeeze, necesitamos actualizar nuestro sistema.

Debian al igual que la mayoria de las distribuciones GNU/Linux manejan "paquetes", que son los programas precompilados en formato .deb para poder instalar o actualizar nuestro equipo.

Los servidores en donde se almacenan estos paquetes se llaman "Repositorios", y los hay por todo el mundo, simplemente cuando hacemos la instalacion de Debian nos pide que escojamos el mas cercano a nosotros por razones de velocidad.

De vez en cuando para instalar algun programa o dependencia, se nos pide agregar un repositorio, como en el caso de varios codecs de video y audio que Debian por su politica de "Software 100% Libre" no añade directamente en sus repositorios oficiales, pero no esta en contra de que se instalen en el.

Algo similar ocurre con los repositorios oficiales, ya que podemos agregar al final de la sentencia las palabras contrib (paquetes hechos por la comunidad) y non-free (paquetes no libres o con licencia distinta a GPL).

Una nota importante, nuestro usuario común no tiene la posibilidad de instalar, reinstalar, desinstalar, modificar, crear  o borrar archivos o programas en algunas carpetas, esta resposabilidad es solamente del usuario administrador o mejor conocido como root.

Cuando entramos al sistema con nuestro usuario común, en la linea de comando nos pone algo asi:

avanti@debiansvr:~$

Que es el nombre del usuario, la arroba se usa como la preposicion en, el nombre del equipo y los dos puntos nos dice la ubicacion dentro del arbol de archivos, en este caso la tilde ~ significa nuestra carpeta personal dentro del home ó /home/nuestro_usuario, y el signo de moneda $ nos indica que estamos como usuario normal.

Podemos cambiar a usuario administrador o root con el comando su, este nos pedira la contraseña de root y podremos instalar, reinstalar, etc...

Y como dijo Ben Parker, " todo gran poder lleva una gran responsabilidad", asi que usese con precaucion.

Y entonces podemos ver como cambia a:

root@debiansvr:/home/avanti#

Que es: usuario root en nombre_del_equipo en la ubicacion /home/avanti y al final el signo de numero # que indica que el usuario es administrador.

Todo esto es para que cuando se vea una linea que empieza con $ significa que se hace desde el usuario común y cuando se inicia la sentencia con # se indica que se ejecuta como root.

En los dos casos, los dos simbolos $ y # no se deben agregar a la sentencia solo indican con que usuario se ejecutan.

Entonces visto esto, procedemos a cambiar nuestro archivo de configuracion que es /etc/apt/sources.list.

(Nota: Para la instalación del Stream Server pasa a Actualización de Version)

Nos cambiamos a root:

$ su

Y abrimos el archivo de configuración:

# nano /etc/apt/sources.list


Hasta aqui lo tenemos en la rama Estable o Squeeze,  y lo que hacemos es agregar al final de los repositorios oficiales contrib non-free y de los repositorios de seguridad solo contrib y al principio de los repositorios squeeze-updates (anteriormente volatile) el signo de # para comentarlos. Y los dejamos asi:




Para guardar con ctrl+o y para cerrar con ctrl+x.

Y actualizamos la lista de paquetes, ahora va a leer los que le agregamos:

# apt-get update

Y despues actualizamos:

# apt-get upgrade


En algun momento la actualización se detendra para indicar algunos cambios, solo presionamos la tecla q para que continue

y nos dira que necesita detener algunos servicios para actualizar, le decimos que no y despues aceptar, esto para ver que se va a detener:




Actualización de Versión

Para la instalación del servidor de Streaming, nos vamos a cambiar a la rama Testing o Wheezy, y vamos a agregar los repositorios multimedia

Vamos a editar nuevamente el sources.list como root:

# nano /etc/apt/sources.list


Y vamos a cambiar donde dice squeeze por wheezy, y vamos a agregar al final de los repositorios oficiales contrib non-free y de los repositorios de seguridad solo contrib y al principio de los repositorios squeeze-updates (anteriormente volatile) el signo de # para comentarlos.

Ademas vamos a agregar dos lineas mas para la instalación de los repositorios multimedia:


Despues actualizamos, y nos marcara un error de falta de una llave, la agregamos, como root:

# aptitude install debian-multimedia-keyring

Y volvemos a actualizar:

# apt-get update

Y se actualizara correctamente la lista de repositorios, ahora actualizaremos el sistema:

# apt-get upgrade

e igual que en el anterior, si nos muestra una lista de cambios solo damos q y si nos pregunta que tiene que detener algunos servicios, le damos no y en la siguiente ventana aceptar.

Una vez terminado, veremos que posiblemente hubo una actualización de versión del Kernel:


Seleccionamos la primera y al entrar nos damos cuenta que cambiamos de rama a Wheezy/Sid antes de poner el usuario y la contraseña.


Bueno con esto ya tenemos a punto el equipo para seguir con la instalación.

Saludos!

Aviso importante!

Debido a que apenas estoy resolviendo que rumbo tomara este blog, hay dos grandes inquietudes, primero hacer un manual completo de un Stream Server o Servidor de Radio por Internet (uno con MPD y otro con Icecast e IDJC), asi como instalar entornos livianos para equipos con poco recursos o que como yo no les guste "hacerlo de la manera facil" o por el simple gusto de hacerlo.

Así que la base esta puesta, con el artículo anterior de la Instalación Mínima en Debian Squeeze podemos tomar el rumbo que queramos, algunas herramientas pueden ser usadas por las dos "ramas" (Server y Desktop) pero primero me voy a enfocar en el lado de los servidores.

Asi que los siguientes articulos se van a catalogar en dos:

Herramientas para Stream Server

y

Entornos de Escritorio Ligero


Saludos!

lunes, 23 de abril de 2012

Instalación mínima de Debian Squeeze

Por si no lo han notado, la forma que me gusta usar cualquier distribución de linux es en una instalación mínima, es decir solo el sistema base instalado.

¿Que ventajas representa hacer una instalación de esta forma? la respuesta es sencilla, instalas solo lo que necesitas o requieres.

¿Tiene alguna desventaja hacerlo de esta forma? Posiblemente su mayor debilidad puede ser que se necesita tiempo para dejar el sistema como lo deseamos, es decir totalmente personalizado y funcional.

Pero en el caso de los servidores, es mucho mas sencillo configurar en las TTy's, que encontrar una apliación  gráfica para hacerlo, ya que dependiendo de la distribución esto puede variar un poco.

Y quiza se pregunten ¿Para que me puede servir a mi?, en caso de querer hacer alguno de los proyectos que presentare mas adelante, esta instalación es básica, también en caso de tener un equipo algo obsoleto le podemos dar vida con un sistema mínimo. Pero eso lo veremos más adelante.

Sin mas preambulo, vamos a hacer la instalación de Debian Squeeze (version 6), en mi caso utilizo una maquina virtual en Vmware player para usarlo de ejemplo, pero uds lo pueden hacer en su equipo sin ningun problema, solo una indicación mas, esta instalación esta pensada para ser el único sistema operativo del equipo.

Primero bajamos la imagen de Debian Netinstall o de instalación por red, que solo pesa 180 MB de aquí y lo quemamos en un cd o la cargamos en una USB con Unetbooting.

Arrancamos desde el cd y esta es la primera pantalla:


Podemos presionar Enter para hacer la instalación en modo texto o escoger Graphical Install, en si es lo mismo. Lo vamos a hacer en modo texto, así que damos Enter.

Primero nos pregunta por el idioma, escogemos Spanish (Español).


Podemos escoger nuestro país, en mi caso México:


Tipo de teclado, en mi caso Latinoamericano.


Y aquí vamos a poner el nombre con el que se va a identificar nuestro equipo, para labores del ejemplo usamos debiansvr.


Una de las partes super importantes, la clave del super usuario, Debian como muchos sistemas base Linux, utiliza un usuario con todos los privilegios o super usuario, llamado root, o raíz, este usuario puede crear otros usuarios, cambiar permisos, actualizar el equipo, instalar/desinstalar paquetes, por esta razón es super importante no olvidar la contraseña de root. Aquí la ponemos y la confirmamos en la siguiente ventana:


Después nos preguntará por el nombre completo del usuario, aquí podemos poner nuestro nombre completo, el de la empresa, o algún nickname que usemos o nos represente:


Y luego escogemos el nickname de nuestro usuario, con este nombre se nos reconocerá dentro del sistema. Despues nos pide una contraseña para este usuario "normal" sin privilegios, y que la confirmemos:


Escogemos la zona horaria, según el horario de Estados Unidos, luego lo podemos cambiar, en mi caso, escogo central:


Nos pregunta que Metodo de particionado vamos a usar, en este caso el guiado - utilizar todo el disco duro:


Nos muestra el disco en el que se va a hacer la instalación:


Otra de las partes vitales es el particionado del disco duro, en este caso para fines prácticos hacemos la instalación en una sola particion, después veremos para que sirve hacer otras particiones, por lo pronto escogemos la primera, que es guiado -> utilizar todo el disco


Como ven se crean dos particiones, una que es la del sistema, y la otra es la asignada al swap, lo que en windows se conoce como memoria virtual, escogemos finalizar:


Después pregunta si queremos escribir las particiones en el disco duro, escogemos si y damos enter:


Lo siguiente es escoger el servidor de los repositorios, yo estoy en México y los servidores que se encuentran en el país funcionan muy bien, por esta razón escojo México:


Todos funcionan muy bien, por simplicidad elijo el primero:


Al ser una instalación en red, nos preguntará si tenemos algún proxy que administre nuestra conexión de internet, en caso de no tenerlo solo dar enter:


Aquí, nos pregunta si queremos participar del popularity-contest, con esto ayudamos al los desarrolladores de Debian, con estadísticas anónimas de los paquetes mas usados, en mi caso le digo que si:


Aquí la parte medular de la instalación, de todos los paquetes solo escogemos el sistema base:


Nos pregunta si queremos instalara el grub, que es el gestor de arranque, esto nos permite escoger entre distribuciones instaladas en el mismo pc ó entre versiones del Kernel instalados en el equipo, decimos que si damos enter:


¡¡Felicidades!! terminamos la instalación, retiramos el cd y damos enter para reiniciar el equipo:


Aquí la primer pantalla de nuestro sistema, esto es el grub, y escogemos la primera opción y damos enter ó esperamos 5 segundos y arranca la primera opción automáticamente:


Y aquí nuestras TTY's en todo su esplendor, aqui ponemos nuestro nickname en login y nuestra contraseña para entrar:


En el siguiente post, veremos como manejarnos en las TTY's y actualizar nuestro equipo y vamos ir agregandole algunas cosas, para no hacer tan grande este post.

Saludos y cualquier duda me comentan!!


viernes, 23 de diciembre de 2011

Box Conky en Fedora

Algo que desde hace tiempo me apasiona, es la configuración de conky en mi equipo, y aunque estoy preparando otros temas decidí agregar este para no pasar mas tiempo sin escribir en el blog.

El escritorio actual en mi laptop incorpora Fedora 15 + Tint2 + Conky.


En las últimas versiones de conky ya viene incorporado los archivos para cargar lua y cairo, así que basta solo con instalar la última version de conky de nuestra distro.

Este conky tiene tres archivos, el primero y principal se llama .conkyrc que va en nuestro home (/home/tu_usuario), en donde tu_usuario es como lo indica el nombre de tu usuario con el que te logueas.

Despues creamos una carpeta llamada .boxconky en nuestro home (/home/tu_usuario) dentro de esta carpeta van los archivos box.lua y rings.lua, tambien va el logo de nuestra distro que se debe llamar logo.png para no cambiar el script en .conkyrc, en caso de que no quieran cambiarle el nombre al logo entonces lo tendran que hacer en el script.

Bueno aqui el codigo:
.conkyrc



# Conky settings #
background no
update_interval 1
cpu_avg_samples 2
net_avg_samples 2
override_utf8_locale yes
double_buffer yes
no_buffers yes
text_buffer_size 2048
#imlib_cache_size 0
temperature_unit fahrenheit
# Window specifications #
own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorate,sticky,skip_taskbar,skip_pager,below
border_inner_margin 0
border_outer_margin 0
minimum_size 218 220
maximum_width 220
maximum_height 400
alignment tr
gap_x 10
gap_y 20
# Graphics settings #
draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no


# Text settings #
use_xft yes
override_utf8_locale yes
xftfont Neuropolitical:size=8
xftalpha 0
uppercase no

temperature_unit celsius

default_color FFFFFF
color0 FFFFFF
color1 062b61 
color2 000000 
color3 DE3D00 
color4 dcde1c 
color5 0a57a4 

# Lua Load  #
lua_load /home/tu_usuario/.boxconky/rings.lua
lua_load /home/tu_usuario/.boxconky/box.lua
lua_draw_hook_pre clock_rings
lua_draw_hook_post main_box

TEXT
${voffset 5}${offset 15}${font Neuropolitical:size=36}${color1}${time %e}
${goto 25}${font Neuropolitical:size=18}${color5}${voffset -30}${time %b}${color FFFFFF}${offset 10}${time %Y}
${font Neuropolitical:size=12}${color1}${voffset 5}${goto 20}${time %A}${goto 153}${color5}${time %H}:${time %M}


${font Neuropolitical:size=9}${color1}${voffset 55}${goto 15}CPU 1${goto 118}CPU2
${goto 18}${cpu cpu0}%${goto 122}${cpu cpu1}%
${image ~/.boxconky/logo.png -p 158,13 -s 50x50}


${voffset -18}${goto 15}${font Pragmata:size=9}${color5}${top name 1}${goto 65}${top cpu 1}%${goto 118}${top name 1}${goto 167}${top cpu 2}%
${goto 15}${font Pragmata:size=8}${color2}${top name 2}${goto 65}${top cpu 1}%${goto 118}${top name 2}${goto 167}${top cpu 2}%
#${goto 15}${font Pragmata:size=8}${color1}${top name 3}${goto 65}${top cpu 1}%${goto 118}${top name 3}${goto 167}${top cpu 2}%




${voffset -2}${goto 120}${color2}${font Pragmata:size=8}Uptime: ${uptime_short}
${goto 120}${color2}${font Pragmata:size=8}Processes: ${processes}
${goto 120}${color2}${font Pragmata:size=8}Running: ${running_processes}


${voffset -48}${goto 15}${color1}${font Neuropolitical:size=9}RAM
${goto 18}${memperc}%


${voffset -40}${goto 120}${voffset 56}Swap
${goto 128}${swapperc}%


${goto 15}${voffset 60}${color1}Root${goto 83}Home${goto 155}USB
${voffset 5}${offset 15}${font Pragmata:size=8,weight:normal${alignr}}${color2}Us:${fs_used /}${goto 85}Us:${fs_used /home}${goto 150}Us:${fs_used /mnt/usb} 
${voffset 0}${offset 15}${font Pragmata:size=8,weight:normal${alignr}}${color2}Sz:${fs_size /}${goto 85}Sz:${fs_size /home}${goto 150}Sz:${fs_used /mnt/usb}


${voffset 83}${goto 15}${color1}${font Neuropolitical:size=9}Connections${goto 138}Battery
${goto 10}${color2}${font Pragmata:size=9}IP:${addr wlan0}${goto 122}Charge:${goto 188}${battery_percent BAT0}%
${goto 10}${color2}${font Pragmata:size=9}Gw:${gw_ip}${goto 122}Left:${goto 150}${battery_time BAT0}
${goto 125}Ac${goto 160}${acpiacadapter}

box.lua
 
--[[BOX WIDGET v1.1 by Wlourf 27/01/2011
This widget can drawn some boxes, even circles in your conky window
http://u-scripts.blogspot.com/2011/01/box-widget.html)


Inspired by Background by londonali1010 (2009), thanks ;-) 


The parameters (all optionals) are :
x           - x coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window)
y           - y coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window)
w           - width of the box, default = width of the conky window
h           - height of the box, default = height of the conky window
corners     - corners is a table for the four corners in this order : top-left, top-right,bottom-right, bottom-left
              each corner is defined in a table with a shape and a radius, available shapes are : "curve","circle","line"
              example for the same shapes for all corners:
              { {"circle",10} }
              example for first corner different from the three others
              { {"circle",10}, {"circle",5}  }              
              example for top corners differents from bottom corners
              { {"circle",10}, {"circle",10}, {"line",0}  }   
              default = { {"line",0} } i.e=no corner
operator    - set the compositing operator (needs in the conkyrc : own_window_argb_visual yes)                          
              see http://cairographics.org/operators/
              available operators are :
              "clear","source","over","in","out","atop","dest","dest_over","dest_in","dest_out","dest_atop","xor","add","saturate"
              default = "over"
border      - if border>0, the script draws only the border, like a frame, default=0
dash        - if border>0 and dash>0, the border is draw with dashes, default=0
skew_x      - skew box around x axis, default = 0
skew_y      - skew box around y axis, default = 0
scale_x     - rescale the x axis, default=1, useful for drawing elipses ...
scale_y     - rescale the x axis, default=1
angle    - angle of rotation of the box in degrees, default = 0
              i.e. a horizontal graph
rot_x       - x point of rotation's axis, default = 0,
              relative to top-left corner of the box, (not the conky window)
rot_y       - y point of rotation's axis, default = 0              
              relative to top-left corner of the box, (not the conky window)
draw_me     - if set to false, box is not drawn (default = true or 1)
              it can be used with a conky string, if the string returns 1, the box is drawn :
              example : "${if_empty ${wireless_essid wlan0}}${else}1$endif",              
              
linear_gradient - table with the coordinates of two points to define a linear gradient,
                  points are relative to top-left corner of the box, (not the conky window)
                  {x1,y1,x2,y2}
radial_gradient - table with the coordinates of two circle to define a radial gradient,
                  points are relative to top-left corner of the box, (not the conky window)
                  {x1,y1,r1,x2,y2,r2} (r=radius)
colour      - table of colours, default = plain white {{1,0xFFFFFF,0.5}}
              this table contains one or more tables with format {P,C,A}
              P=position of gradient (0 = start of the gradient, 1= end of the gradient)
              C=hexadecimal colour 
              A=alpha (opacity) of color (0=invisible,1=opacity 100%)
              Examples :
              for a plain color {{1,0x00FF00,0.5}}
              for a gradient with two colours {{0,0x00FF00,0.5},{1,0x000033,1}}        {x=80,y=150,w=20,h=20,
        radial_gradient={20,20,0,20,20,20},
        colour={{0.5,0xFFFFFF,1},{1,0x000000,0}},
              or {{0.5,0x00FF00,1},{1,0x000033,1}} -with this one, gradient will start in the middle
              for a gradient with three colours {{0,0x00FF00,0.5},{0.5,0x000033,1},{1,0x440033,1}}
              and so on ...






To call this script in Conky, use (assuming you have saved this script to ~/scripts/):
    lua_load ~/scripts/box.lua
    lua_draw_hook_pre main_box
    
And leave one line blank or not after TEXT


Changelog:
+ v1.0 -- Original release (19.12.2010)
+ v1.1 -- Adding parameters: operator, dash, angle, skew_x, skew_y, draw_me
          corners are described in a table


--      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 version 3 (GPLv3)
--     
--      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.  




]]


  
require 'cairo'
    
function conky_main_box()


    if conky_window==nil then return end
    
 ---------------------- PARAMETERS BEGIN HERE
    local boxes_settings={
    --FIRST COLUMN
 --Name corners
 {x=10, y=10,w=95,h=30,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=40,w=135,h=30,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"line",0}, {"line",10} }, 
        operator=yes,
        },


 --Logo corners
 {x=153, y=10,w=60,h=60,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 --Date corners
 {x=10, y=75,w=203,h=20,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 --CPU1's corners
 {x=10, y=100,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",10}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=10, y=190,w=98,h=55,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 {x=10, y=155,w=45,h=35,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=10, y=110,w=8,h=45,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"",0} }, 
        operator=yes,
        },
 
 {x=98, y=110,w=10,h=80,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=98, y=190,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-40}, {"",0}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=98, y=109,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"curve",-40} }, 
        operator=yes,
        },


 {x=17, y=109,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"curve",-40}, {"",0} }, 
        operator=yes,
        },


 --CPU2's corners
 {x=115, y=155,w=45,h=35,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"",0} }, 
        operator=yes,
        },
 
 {x=115, y=110,w=8,h=45,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",0}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=115, y=100,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=203, y=110,w=10,h=80,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=203, y=190,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-40}, {"",0}, {"",0}, {"",0} }, 
        operator=yes,
        },


 {x=122, y=109,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"curve",-40}, {"",0} }, 
        operator=yes,
        },


 {x=203, y=109,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"curve",-40} }, 
        operator=yes,
        },


 {x=115, y=190,w=98,h=55,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 --Process corners
 {x=115, y=250,w=98,h=50,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 --Mem corners
 {x=10, y=250,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",10}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=260,w=8,h=82,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },
        
 {x=100, y=260,w=8,h=82,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=342,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 {x=100, y=259,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",0}, {"curve",0}, {"curve",-40} }, 
        operator=yes,
        },


 {x=100, y=342,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-40}, {"line",0}, {"curve",0}, {"curve",0} }, 
        operator=yes,
        },


 {x=17, y=342,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",-40}, {"curve",0}, {"curve",0} }, 
        operator=yes,
        },


 {x=18, y=260,w=35,h=38,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"line",10}, {"curve",0} }, 
        operator=yes,
        },


 --Swap corners
 {x=115, y=305,w=98,h=5,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",5}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=208, y=310,w=5,h=42,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=167, y=330,w=18,h=22,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"line",5}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=115, y=310,w=52,h=42,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 {x=185, y=347,w=23,h=5,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=208, y=347,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-20}, {"",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=208, y=309,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"",0}, {"",0}, {"",0}, {"curve",-20} }, 
        operator=yes,
        },


 {x=166, y=309,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"",0}, {"curve",-20}, {"line",0} }, 
        operator=yes,
        },


 --Storage corners
 {x=10, y=357,w=203,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",10}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=432,w=203,h=35,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"",0}, {"line",10} }, 
        operator=yes,
        },


 {x=10, y=367,w=10,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=88, y=367,w=5,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=159, y=367,w=5,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=208, y=367,w=5,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=19, y=366,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",0}, {"curve",-35}, {"line",0} }, 
        operator=yes,
        },


 {x=88, y=366,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",0}, {"curve",0}, {"curve",-35} }, 
        operator=yes,
        },


 {x=92, y=366,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",0}, {"curve",-35}, {"line",0} }, 
        operator=yes,
        },


 {x=88, y=432,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-30}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=20, y=405,w=31,h=27,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=159, y=366,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",0}, {"curve",0}, {"curve",-30} }, 
        operator=yes,
        },


 {x=164, y=367,w=44,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=93, y=405,w=31,h=27,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=159, y=432,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-30}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=164, y=422,w=44,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=164, y=405,w=20,h=17,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"",0}, {"line",0} }, 
        operator=yes,
        },


 {x=163, y=376,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"curve",-25}, {"line",0} }, 
        operator=yes,
        },


 {x=208, y=376,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"line",0}, {"line",0}, {"curve",0}, {"curve",-25} }, 
        operator=yes,
        },


 {x=208, y=422,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-20}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 --Net corners
 {x=10, y=472,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",10}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=482,w=10,h=76,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=98, y=482,w=10,h=76,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=10, y=558,w=98,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",10} }, 
        operator=yes,
        },


 {x=19, y=481,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",-40}, {"line",0} }, 
        operator=yes,
        },


 {x=98, y=481,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"curve",-40} }, 
        operator=yes,
        },


 {x=98, y=558,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-40}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },
 
 {x=19, y=558,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",-40}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 --Bat corners
 {x=113, y=472,w=98,h=10,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",10}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=113, y=482,w=10,h=76,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=201, y=482,w=10,h=76,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 {x=113, y=558,w=98,h=65,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"line",10} }, 
        operator=yes,
        },


 {x=122, y=481,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",-40}, {"line",0} }, 
        operator=yes,
        },


 {x=201, y=481,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"line",0}, {"curve",0}, {"curve",-40} }, 
        operator=yes,
        },


 {x=201, y=558,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",-40}, {"line",0}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },
 
 {x=122, y=558,w=1,h=1,
        colour={ {1,0x000000,0.2} },
        corners={ {"curve",0}, {"curve",-40}, {"curve",0}, {"line",0} }, 
        operator=yes,
        },


 --Ip corners
 --{x=10, y=603,w=203,h=3,
        --colour={ {1,0x000000,0.2} },
        --corners={ {"curve",0}, {"curve",0}, {"curve",0}, {"line",0} }, 
        --operator=yes,
        --},


        --corners
--        {x=10, y=310,w=200,h=60,


        --the missing corners are repeated
--        corners={ {"",0}, {"circle",30},}
--        },


        --border
--        {x=10, y=210,w=200,h=60,
        --the missing corners are repeated
--        corners={ {"",0}, {"circle",30}, {"",0}, {"circle",30}},
--        border= 3
--        },
    


    }




    ---------------------------- PARAMETERS END HERE
    
    local cs=cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
    local cr=cairo_create(cs)
    
    if tonumber(conky_parse("$updates"))<5 then return end
    for i in pairs(boxes_settings) do
        draw_box (cr,boxes_settings[i])
    end
    cairo_destroy(cr)
    cairo_surface_destroy(cs)    
end


    
function draw_box(cr,t)


 if t.draw_me == true then t.draw_me = nil end
 if t.draw_me ~= nil and conky_parse(tostring(t.draw_me)) ~= "1" then return end 


    local table_corners={"circle","curve","line"}


    local t_operators={
        clear   = CAIRO_OPERATOR_CLEAR,
        source  = CAIRO_OPERATOR_SOURCE,
        over    = CAIRO_OPERATOR_OVER,
        ["in"]      = CAIRO_OPERATOR_IN,
        out     = CAIRO_OPERATOR_OUT,
        atop    = CAIRO_OPERATOR_ATOP,
        dest    = CAIRO_OPERATOR_DEST,
        dest_over   = CAIRO_OPERATOR_DEST_OVER,
        dest_in = CAIRO_OPERATOR_DEST_IN,
        dest_out = CAIRO_OPERATOR_DEST_OUT,
        dest_atop = CAIRO_OPERATOR_DEST_ATOP,
        xor = CAIRO_OPERATOR_XOR,
        add = CAIRO_OPERATOR_ADD,
        saturate =  CAIRO_OPERATOR_SATURATE,
    }
        
    function rgba_to_r_g_b_a(tc)
        --tc={position,colour,alpha}
        local colour = tc[2]
        local alpha = tc[3]
        return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
    end


    function table.copy(t)
      local t2 = {}
      for k,v in pairs(t) do
       t2[k] = {v[1],v[2]}
      end
      return t2
    end


    function draw_corner(num,t)
        local shape=t[1]
        local radius=t[2]
        local x,y = t[3],t[4]
        if shape=="line" then
            if num == 1 then cairo_line_to(cr,radius,0) 
                elseif num == 2 then cairo_line_to(cr,x,radius) 
                elseif num == 3 then cairo_line_to(cr,x-radius,y)
                elseif num == 4 then cairo_line_to(cr,0,y-radius)
            end
        end
        if shape=="circle" then
     local PI = math.pi
           if num == 1 then cairo_arc(cr,radius,radius,radius,-PI,-PI/2)
                elseif num == 2 then cairo_arc(cr,x-radius,y+radius,radius,-PI/2,0)
                elseif num == 3 then cairo_arc(cr,x-radius,y-radius,radius,0,PI/2) 
                elseif num == 4 then cairo_arc(cr,radius,y-radius,radius,PI/2,-PI)
            end
        end
        if shape=="curve" then
            if num == 1 then cairo_curve_to(cr,0,radius ,0,0 ,radius,0) 
                elseif num == 2 then cairo_curve_to(cr,x-radius,0, x,y, x,radius)
                elseif num == 3 then cairo_curve_to(cr,x,y-radius, x,y, x-radius,y)
                elseif num == 4 then cairo_curve_to(cr,radius,y, x,y, 0,y-radius)
            end
        end        
    end   


    --check values and set default values
    if t.x == nil then t.x = 0 end
    if t.y == nil then t.y = 0 end
    if t.w == nil then t.w = conky_window.width end
    if t.h == nil then t.h = conky_window.height end
    if t.radius == nil then t.radius = 0 end
    if t.border == nil then t.border = 0 end
    if t.colour==nil then t.colour={{1,0xFFFFFF,0.5}} end
    if t.linear_gradient ~= nil then 
        if #t.linear_gradient ~= 4 then
            t.linear_gradient = {t.x,t.y,t.width,t.height}
        end
    end 
    if t.angle==nil then t.angle = 0 end


 if t.skew_x == nil then t.skew_x=0  end
 if t.skew_y == nil then  t.skew_y=0 end
 if t.scale_x==nil then t.scale_x=1 end
 if t.scale_y==nil then t.scale_y=1 end 
 if t.rot_x == nil then t.rot_x=0  end
 if t.rot_y == nil then  t.rot_y=0 end
    
    if t.operator == nil then t.operator = "over" end
    if (t_operators[t.operator]) == nil then
        print ("wrong operator :",t.operator)
        t.operator = "over"
    end
    
    if t.radial_gradient ~= nil then 
        if #t.radial_gradient ~= 6 then
            t.radial_gradient = {t.x,t.y,0, t.x,t.y, t.width}
        end
    end 
    
    for i=1, #t.colour do    
        if #t.colour[i]~=3 then 
            print ("error in color table")
            t.colour[i]={1,0xFFFFFF,1} 
        end
    end


    if t.corners == nil then t.corners={ {"line",0} } end
    local t_corners = {}
    local t_corners = table.copy(t.corners)
    --don't use t_corners=t.corners otherwise t.corners is altered


    --complete the t_corners table if needed
    for i=#t_corners+1,4 do    
        t_corners[i]=t_corners[#t_corners]
        local flag=false
        for j,v in pairs(table_corners) do flag=flag or (t_corners[i][1]==v) end 
        if not flag then print ("error in corners table :",t_corners[i][1]);t_corners[i][1]="curve"  end
    end


    --this way :    
    --    t_corners[1][4]=x    
    --    t_corners[2][3]=y
    --doesn't work
    t_corners[1]={t_corners[1][1],t_corners[1][2],0,0}
    t_corners[2]={t_corners[2][1],t_corners[2][2],t.w,0}
    t_corners[3]={t_corners[3][1],t_corners[3][2],t.w,t.h}    
    t_corners[4]={t_corners[4][1],t_corners[4][2],0,t.h}        


    t.no_gradient = (t.linear_gradient == nil ) and (t.radial_gradient == nil )


    cairo_save(cr)
    cairo_translate(cr, t.x, t.y)
    if t.rot_x~=0 or t.rot_y~=0 or t.angle~=0 then
        cairo_translate(cr,t.rot_x,t.rot_y)
        cairo_rotate(cr,t.angle*math.pi/180)
        cairo_translate(cr,-t.rot_x,-t.rot_y)
    end
    if t.scale_x~=1 or t.scale_y~=1 or t.skew_x~=0 or t.skew_y~=0 then
    local matrix0 = cairo_matrix_t:create()
    tolua.takeownership(matrix0)
    cairo_matrix_init (matrix0, t.scale_x,math.pi*t.skew_y/180 , math.pi*t.skew_x/180 ,t.scale_y,0,0)
    cairo_transform(cr,matrix0)    
    end
    
    local tc=t_corners
    cairo_move_to(cr,tc[1][2],0)
    cairo_line_to(cr,t.w-tc[2][2],0)
    draw_corner(2,tc[2])
    cairo_line_to(cr,t.w,t.h-tc[3][2])
    draw_corner(3,tc[3])
    cairo_line_to(cr,tc[4][2],t.h)
    draw_corner(4,tc[4])
    cairo_line_to(cr,0,tc[1][2])
    draw_corner(1,tc[1])
    
    if t.no_gradient then
        cairo_set_source_rgba(cr,rgba_to_r_g_b_a(t.colour[1]))
    else
        if t.linear_gradient ~= nil then
            pat = cairo_pattern_create_linear (t.linear_gradient[1],t.linear_gradient[2],t.linear_gradient[3],t.linear_gradient[4])
        elseif t.radial_gradient ~= nil then
            pat = cairo_pattern_create_radial (t.radial_gradient[1],t.radial_gradient[2],t.radial_gradient[3],
             t.radial_gradient[4],t.radial_gradient[5],t.radial_gradient[6])
        end
        for i=1, #t.colour do
            cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgba_to_r_g_b_a(t.colour[i]))
        end
        cairo_set_source (cr, pat)
        cairo_pattern_destroy(pat)
    end 
     
    cairo_set_operator(cr,t_operators[t.operator]) 


    if t.border>0 then
        cairo_close_path(cr)
        if t.dash ~= nil then cairo_set_dash(cr, t.dash, 1, 0.0) end
        cairo_set_line_width(cr,t.border)
        cairo_stroke(cr)
    else
        cairo_fill(cr)
    end


    cairo_restore(cr)
end

rings.lua


--[[
Clock Rings by Linux Mint (2011) reEdited by despot77

This script draws percentage meters as rings, and also draws clock hands if you want! It is fully customisable; all options are described in the script. This script is based off a combination of my clock.lua script and my rings.lua script.

IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement on line 145 uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num>5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num>3; conversely if you update Conky every 0.5s, you should use update_num>10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error.

To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
    lua_load ~/scripts/clock_rings.lua
    lua_draw_hook_pre clock_rings
    
Changelog:
+ v1.0 -- Original release (30.09.2009)
   v1.1p -- Jpope edit londonali1010 (05.10.2009)
*v Mint-lua -- reEdit despot77 (18.02.2011)
]]

settings_table = {
    
    {
        name='cpu',
        arg='cpu1',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=58, y=150,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
    {
        name='cpu',
        arg='cpu2',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=163, y=150,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
--[[   {
        name='cpu',
        arg='cpu3',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=290, y=40,
        radius=15,
        thickness=15,
        start_angle=-90,
        end_angle=180
    },
    {
        name='cpu',
        arg='cpu4',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=350, y=40,
        radius=15,
        thickness=15,
        start_angle=-90,
        end_angle=180
    },]]
--[[    {
        name='cpu',
        arg='cpu4',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0x92DE00,
        fg_alpha=0.8,
        x=40, y=252,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
    {
        name='cpu',
        arg='cpu5',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0x92DE00,
        fg_alpha=0.8,
        x=163, y=252,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
    {
        name='cpu',
        arg='cpu6',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0x92DE00,
        fg_alpha=0.8,
        x=40, y=330,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
    {
        name='cpu',
        arg='cpu7',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0x92DE00,
        fg_alpha=0.8,
        x=163, y=330,
        radius=25,
        thickness=25,
        start_angle=-90,
        end_angle=180
    },
]]    {
        name='memperc',
        arg='',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=58, y=302,
        radius=25,
        thickness=25,
        start_angle=0,
        end_angle=270
    },
    {
        name='swapperc',
        arg='',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=187, y=328,
        radius=13,
        thickness=8,
        start_angle=-90,
        end_angle=180
    },
    {
        name='fs_used_perc',
        arg='/',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=55, y=400,
        radius=15,
        thickness=30,
        start_angle=-90,
        end_angle=180
    },
    {
        name='fs_used_perc',
        arg='/home',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=128, y=400,
        radius=15,
        thickness=30,
        start_angle=-90,
        end_angle=180
    },
    {
        name='fs_used_perc',
        arg='/mnt/usb',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=187, y=400,
        radius=10,
        thickness=18,
        start_angle=-90,
        end_angle=180
    },
        {
        name='upspeedf',
        arg='wlan0',
        max=210,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=58, y=520,
        radius=30,
        thickness=12,
        start_angle=-90,
        end_angle=270
    },
        {
        name='downspeedf',
        arg='wlan0',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0xa40509,
        fg_alpha=0.8,
        x=58, y=520,
        radius=16,
        thickness=12,
        start_angle=-90,
        end_angle=270
    },
 {
        name='battery_percent',
        arg='BAT0',
        max=100,
        bg_colour=0x000000,
        bg_alpha=0.2,
        fg_colour=0x0a57a4,
        fg_alpha=0.8,
        x=162, y=520,
        radius=25,
        thickness=20,
        start_angle=-90,
        end_angle=270
    },
 
}

-- Use these settings to define the origin and extent of your clock.

clock_r=65

-- "clock_x" and "clock_y" are the coordinates of the centre of the clock, in pixels, from the top left of the Conky window.

clock_x=100
clock_y=150

show_seconds=true

require 'cairo'

function rgb_to_r_g_b(colour,alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

function draw_ring(cr,t,pt)
    local w,h=conky_window.width,conky_window.height
    
    local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
    local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']

    local angle_0=sa*(2*math.pi/360)-math.pi/2
    local angle_f=ea*(2*math.pi/360)-math.pi/2
    local t_arc=t*(angle_f-angle_0)

    -- Draw background ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
    cairo_set_line_width(cr,ring_w)
    cairo_stroke(cr)
    
    -- Draw indicator ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
    cairo_stroke(cr)        
end

function draw_clock_hands(cr,xc,yc)
    local secs,mins,hours,secs_arc,mins_arc,hours_arc
    local xh,yh,xm,ym,xs,ys
    
    secs=os.date("%S")    
    mins=os.date("%M")
    hours=os.date("%I")
        
    secs_arc=(2*math.pi/60)*secs
    mins_arc=(2*math.pi/60)*mins+secs_arc/60
    hours_arc=(2*math.pi/12)*hours+mins_arc/12
         
end

function conky_clock_rings()
    local function setup_rings(cr,pt)
        local str=''
        local value=0
        
        str=string.format('${%s %s}',pt['name'],pt['arg'])
        str=conky_parse(str)
        
        value=tonumber(str)
        pct=value/pt['max']
        
        draw_ring(cr,pct,pt)
    end
    
    -- Check that Conky has been running for at least 5s

    if conky_window==nil then return end
    local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
    
    local cr=cairo_create(cs)    
    
    local updates=conky_parse('${updates}')
    update_num=tonumber(updates)
    
    if update_num>5 then
        for i in pairs(settings_table) do
            setup_rings(cr,settings_table[i])
        end
    end
    
    draw_clock_hands(cr,clock_x,clock_y)
end

Creo que no esta demas aclarar que ninguno de los codigos es de mi autoria, dentro de rings.lua y box.lua viene la referencia a sus autores, yo solo los modifique a mi gusto personal.

Saludos!!