Hola!

January 23, 2010

Seducido por la Manzana Prohibida


Después de mas de una decada codeando sobre Sistemas Operativos Unix BSD y UnixLike Libres, debo asumir que me he dejado seducir por el encanto e inigualable belleza entregada por una manzana, que aunque está mordida en sus principios, me dejo encantado por la forma en la cual logra integrar lo mejor del mundo Unix BSD con el principio KISS. Si bien es una relación que recien comienza, tengo la esperanza que será una larga y comprometida relación (espero no estar escupiendo al cielo).

September 01, 2009

Nuevo Mirror Svn de FreeBSD

Tenemos nuevo mirror: svn://svn.freebsd.cl/base
Se actualiza cada 1 hora.

August 29, 2009

cvsup.freebsd.cl

El mirror cvsup de FreeBSD (src, ports, docs, www) queda oficialmente abajo....
:(

August 12, 2009

PostgreSQL: Actualizar nulidades en columnas

Algo que se podría pensar como trivial en un motor de bases de datos, como lo es el actualizar/modificar las nulidades de una columna, en PostgreSQL resulta ser un poco mas complejo que un simple alter. He decidido compartir esto, ya que es algo que resulta bastante normal cuando se trabaja con bases de datos y por lo demás una problemática mas común de lo que se puede pensar.

A continuación un ejemplo en donde se define attnotnull como FALSE (Se permite NULL):

BEGIN;
UPDATE
pg_attribute
SET
attnotnull = FALSE
WHERE
attname = 'nombre_columna'
AND
attrelid = ( SELECT oid FROM pg_class WHERE relname = 'nombre_tabla') ;
COMMIT;
Para el caso contrario basta con dejar attnotnull como TRUE (No Se permite NULL), ya que este es de tipo boolean.
test=# \d pg_attribute
Tabla «pg_catalog.pg_attribute»
Columna | Tipo | Modificadores
---------------+------------+---------------
attrelid | oid | not null
attname | name | not null
[...]
attalign | "char" | not null
attnotnull | boolean | not null
atthasdef | boolean | not null
[...]
Una de las cosas que creo que es importante acotar, es que la columna relname de la tabla pg_class almacena el nombre de las tablas sin determinar el SCHEMA, esto lo pueden averiguar de manera sencilla haciendo la consulta por separado:
SELECT oid FROM pg_class WHERE relname = 'nombre_tabla'
Si retorna el oid es que esta bien, en caso contrario, algo estan haciendo mal.

Con todo esto la columna ya debería contar con el nuevo atributo, permitiendo continuar con la música...

August 05, 2009

PL/PgSQL: Obtener días hábiles de un rango de fechas


En mi trabajo nos surgió la necesidad de desarrollar un algoritmo que nos permitiese calcular y generar los días hábiles de un determinado rango de fechas. Este debía ser capaz de excluir de manera automática los días Sábado, Domingo y Festivos y retornar solo el resto de los días de lunes a viernes. El planteamiento a seguir fue el siguiente:
  • Elegir la tecnología para implementar el algoritmo:
Como la base de datos institucional está en PostgreSQL, pensamos que lo mejor era apegarnos a esto y utilizar como lenguaje PL/PgSQL, el cual sin duda satisfacía cada una de nuestras necesidades para el caso y mucho mas.
  • Crear una tabla que contenga los días festivos:
CREATE TABLE public.dia_festivo (
cod_dia_festivo CHARACTER(5) NOT NULL,
desc_dia_festivo CHARACTER VARYING(250) NOT NULL,
PRIMARY KEY (cod_dia_festivo)
);
  • Poblar la tabla public.dia_festivo
  • Crear la función
CREATE OR REPLACE FUNCTION public.get_dias_habiles(date, date) RETURNS SETOF RECORD AS
$BODY$
DECLARE
fecha_ini ALIAS FOR $1; -- Fecha Inicio
fecha_ter ALIAS FOR $2; -- Fecha Termino
sabado integer := 6; -- Dia sabado
domingo integer := 0; -- Dia domingo
BEGIN
RETURN QUERY
SELECT
CAST(to_char(fecha_ini + dias, 'DD-MM-YYYY') AS character(10)) AS fecha
FROM
generate_series(0, fecha_ter - fecha_ini) AS dias
WHERE
extract (dow FROM fecha_ini + dias) NOT IN (sabado, domingo)
AND
CAST(to_char(fecha_ini + dias, 'DD-MM') AS character(5))
NOT IN
(SELECT cod_dia_festivo FROM public.dia_festivo);
END;
$BODY$
LANGUAGE 'plpgsql';
  • Llamar la función:
SELECT
fecha
FROM
public.get_dias_habiles('2009-01-01', '2009-12-31')
AS
dias_habiles(fecha character);
Creo que todo el código es practicamente autoexplicable para alguien con conocimientos de SQL, PostgreSQL y PL/PgSQL, y la idea principal de compartirlo es obtener algún feedback con algún enfoque distinto, correcciones, y por supuesto que le pueda ser de utilidad y mejore el día a quien lo necesite.

PS, Perdón por la falta de indentación pero el blog se la comió. :P

May 22, 2009

March 28, 2009

Color de un ComboBox Item

Los items de los combobox en windows forms no se les puede definir el color del foreground y background.
Si los objetos que se ponden son del tipo ListViewItem, entonces se puede usar el evento comboBox.DrawItem para dibujarles los colores, con lo siguiente:


void OnDrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index0)

return;


Graphics g = e.Graphics;

Rectangle r = e.Bounds ;

e.DrawBackground();


Color textColor = SystemColors.ControlText; //Queda con etse color

if (e.State == (DrawItemState.Focus | DrawItemState.Selected ) )

textColor = SystemColors.HighlightText;

if (e.State == DrawItemState.None)

textColor = SystemColors.WindowText;


ListViewItem item = combo.Items[e.Index] as ListViewItem;


if (item.ForeColor != SystemColors.WindowText)

textColor = item.ForeColor;


//Rectangulo interno

// Rectangle rectangle = new Rectangle(2, e.Bounds.Top+2, e.Bounds.Height, e.Bounds.Height-4);

// e.Graphics.FillRectangle(new SolidBrush(Color.Salmon), rectangle);


g.DrawString(item.ToString(), new Font("Ariel", 8), new SolidBrush(textColor), r);

e.DrawFocusRectangle();


}



O más simple aún, reemplazar OnDrawItem:


public class ColorComboBox : ComboBox
{

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem (e);

if (e.Index0)
return;

Control item = this.Items[e.Index] as Control;
if (item==null)
return;

Graphics g = e.Graphics;
Rectangle r = e.Bounds ;
if (item.ForeColor != SystemColors.WindowText)
g.DrawString(item.ToString(), Parent.Font, new SolidBrush(item.ForeColor), r);

}

}

March 19, 2009

¿Volvi?

Generalmente me da por temporadas, escribo algo, varios post seguidos y luego lo dejo…. Ya van mas de 4 meses que no escribia nada, y nuevamente vuelvo a este blog.

Sigo utilizando Slackware en mi portatil, que sensación mas agradable tener el dominio completo de tu sistema operativo gracias a esta gran distribución. En casa ocuparé Ubuntu o FreeBSD, pero aún sigo con el inseparable Windows XP (si, soy un hereje) para poder jugar algo….

Tengo varios proyectos en mentes.. algunos para mí, otros para el mundo. Los cuales ire comentando en este blog a medida que avancen. Volveré con los articulos de Slackware y el mundo libre en general.

Bendiciones a todos y espero mantener el contacto…

root@workmobil:~# ping -c 4 inkubot
PING inkubot (127.0.0.1) 56(84) bytes of data.
64 bytes from inkubot (127.0.0.1): icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from inkubot (127.0.0.1): icmp_seq=2 ttl=64 time=0.029 ms
64 bytes from inkubot (127.0.0.1): icmp_seq=3 ttl=64 time=0.023 ms
64 bytes from inkubot (127.0.0.1): icmp_seq=4 ttl=64 time=0.028 ms

— localhost ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.023/0.026/0.029/0.002 ms

February 26, 2009

Cliente Oracle 10g en FreeBSD

Tiempo atras, hice un paper con respecto a este proceso que voy a transcribir y revisar su utilizacion en FreeBSD 7.1-RELEASE-p3, espero ayude.

El port de oracle client se instala de la siguiente forma:

  1. # cd /usr/ports/databases/linux-oracle-instantclient-sqlplus
  2. make build install clean

Este proceso requiere de la descarga manual de 2 archivos desde www.Oracle.com que deben ser almacenados en la carpeta /usr/ports/distfiles/oracle y que corresponden a:

  1. instantclient-sqlplus-linux32-10.2.0.3-20061115.zip
  2. instantclient-basic-linux32-10.2.0.3-20061115.zip

Y una vez finalizado el proceso completo quedan los siguientes ports instalados en el sistema:

  1. linux_base-fc-4_14
  2. linux-oracle-instantclient-basic-10.2.0.3.20061115_2
  3. linux-oracle-instantclient-sqlplus-10.2.0.3.20061115_1

Ahora, solo nos queda configurar el acceso al listener, proceso para el cual necesitamos algunas variables de entorno de nuestra shell:

  • Configurar la .cshrc (para quienes usamos la shell de C):

if (! $?ORACLE_HOME) then
if (-d /compat/linux/usr/lib/oracle) then
setenv ORACLE_HOME /compat/linux/usr/lib/oracle
else
echo “Warning - ORACLE_HOME not defined”
echo “To use Oracle Client, define ORACLE_HOME and rerun your .cshrc”
endif
endif

if ($?ORACLE_HOME) then
set path=($path $ORACLE_HOME/10.2.0.3/client/bin)
end

Así la configuración queda completa cuando “sqlplus” busque el tnsnames.ora que por estructura busca en $ORACLE_HOME/network/admin y cuya estructura es la siguiente:

ORADB = (
DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = 10.0.0.5) (PORT = 1521))
(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ServiceName))
)

Con un resultado final como este:

[ kuarzo@kuarzo:~ ]% sqlplus usuario/clave@ORADB as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Thu Feb 26 10:31:45 2009
Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

SQL>

February 17, 2009

System.Windows.Forms

Curiosamente no es lo mismo

ventana.Hide();

que

ventana.Show();
ventana.Hide();



Cuando se hace lo primero, entonces cualquier cosa que haga en otro hilo (con Invoke) no funciona.

:P

January 31, 2009

CVS Mirror

Para los interesados:

export CVSROOT":pserver:anoncvs@cvsup.freebsd.cl:/home/ncvs"
cvs login (clave anoncvs)
cvs co ports

suerte!

December 10, 2008

GenericGrid

Por esas cosas de la vida, me puse a implementar una grilla en Gtk (TreeView), en gtk-sharp. Hace tiempo que no lo hacia y al ver la API, inmediatamente me dio paja. :P

Me acorde que hace tiempo (2años?) hice un shortcut para hacer grillas y lo encontre! y esta weno! y es facil se usar!

Es tan bonito como escribir lo siquiente:

Grid g = new Grid();

g.ObjectChanged += ObjectHasChanged;

g.ObjectCreated += ObjectIsNew;

g.ObjectDeleted += ObjectRemoved;


List lista = CreateTestObj();

g.Manage(lista);


:)

TestObj, es el tipo de objeto que la grilla muestra, y esta decorado con atributos que le indican como dibujarse, por ejemplo:

[Column("Percent", Type = typeof(PercentInt), Resizable=true)]

public int Percent

{

get { return percent; }

set { percent = value; }


}


Esta super util. Si alguien le interesa que avise...







Notificaciones

Alguien se metio a mi blog y me dijo que es nerd que la cresta...
Asique pense, como lo hago para hacerlo aun mas nerd?...

Por un tiempo, estuve buscando algo que permitiera notificar las llamadas entrantes a un PC (asterisk). Curiosamente no hay mucho para elegir. Hay varias alternativas que parecen ser buenas, pero son pagadas (no las he probado).
De las libres, la unica que encontre descente (el resto es una basura..) es la de un chino, la cual se ve bien (se me perdio el link), pero no es lo que busco (es web, y hace un polling medio feo..).

Asique aproveche de retomar gtk-sharp...
Notable: Gtk.StatusIcon (antes habia que usar un wrapper medio buggy para poner iconos en el systray.. :P)


El servidor ahora le notifica a al PC, que estan llamando (a alguno de los anexos 45,31 o 90), y dice quien es. Cuando llega la llamada, aparece un feo "Ring riiing" y cuando se solicita mas detalle, se abre una pagina que despliega mas detalles de la shhhamada.


December 03, 2008

November 28, 2008

Es hora de actuar

Es hora de actuar.

Hay cosas que no funcionan bien en nuestra sociedad, es hora de hacer algo.

November 26, 2008

'Casteo ascendente'

Lo encontre choro....

Si en una clase llamada Clase, le ponemos un constructor asi:

public Clase : Dictionary<string,string>
{
public Clase(Dictionary<string,string> dic) : base(dic)
{}
}

Entonces es posible escribir:

Clase clase = new Clase(new Dictionary<string,string>());

:P

November 21, 2008

OpenOffice 3

Ayer instale Openoffice 3, y me encontre con la sorpresa que no se pueden instalar extensiones ni diccionarios:

"bad tranfer url"

Alguien lo ha podido hacer?


Referencias:
http://www.freebsd.org/cgi/query-pr.cgi?pr=127946
http://archivos.sofsis.cl/freebsd/openoffice/

November 17, 2008

The FreeBSD Forums - Al fin!!!

The FreeBSD Forums

Esta extraordinaria noticia llego hoy via RSS en la página oficial de FreeBSD, la cual anuncia la puesta en marcha de su foro oficial. Excelente trabajo y mis felicitaciones. Siguen siendo lo mejor.

SCHED_4BSD o SCHED_ULE

SCHED_ULE es un planificador experimental que proporciona una serie de características avanzadas no presentes en sched_4bsd, el planificador por defecto del sistema. Estas nuevas características incluyen:

  • Thread CPU affinity
  • CPU topology awareness, including for hyper-threading.
  • Per-CPU run queues.
  • Interactivity heuristics that detect interactive applications and schedules them preferentially under high load.

Es dificil dar traducción a estas definiciones pero para quienes estan ya mas familiarizados con el kernel de FreeBSD, es facil de entender. Cabe señalar tambien que su funcionalidad en MultiProcesadores es sumamente eficiente.

Los siguientes sysctls son pertinentes a la operación de sched_ule:

kern.sched.name

Ademas de esto para reemplazar el Planificador por defecto se debe reemplazar la linea en su configuración de kernel:

options       SCHED_4BSD # 4BSD scheduler
por
options       SCHED_ULE  # ULE scheduler

November 13, 2008

Mono 2.0.1 en FreeBSD

El proyecto Mono, está basado en los estandares de la ECMA para .NET Framework de Microsoft, en donde componentes basicos de Mono son:

C# Compiler. Es un completo compilador de las versiones 1.0, 2.0 y 3.0 del Lenguaje C#.

Mono Runtime. Implementa el Common Language Infrastructure (CLI), tambien nos prove de un compilador Just in Time (JIT), un cargador de librerias, un limpiador de memoria, sistema de hilos, y funciones de interoperabiliadad.

Libreria de clases basicas. Contiene una gran cantidad de clases compatibles con el .NET Framework de Microsoft

Mono en freeBSD

Gracias a la activa participación de Phillipe Neumann existe la posibilidad de usarlo en su maxima capacidad en nuestros FreeBSD.

October 28, 2008

Nueva visión

Después de bastante tiempo fuera de la blogosfera he sentido la necesidad de volver a contar con un espacio en donde poder dar rienda suelta a mi Nerd interior he ir haciendo un manifiesto de mi cotidianidad aunque esta vez con una visión mucho mas clara y objetiva, digo esto de manera literal ya que desde hoy soy un usuario de lentes ópticos factor de un descarado astigmatismo miópico.

Lo mas difícil de todo esto, es poder adaptarme a mis "nuevos ojos", ya que aún no domino mi motricidad fina, además de ver el monitor de mi laptop como un pseudo trapecio, pero bueno... como dicen mis amigos usuarios: "es cosa de costumbre", espero que desde esta nueva perspectiva pueda dejar atrás los desagradables dolores de cabeza y llevar una mejor calidad de vida.

October 22, 2008

Tratados como Mercenarios …

Actualmente muchos de los que trabajamos en seguridad, como se hacia en la vieja escuela, descubriendo nuevas fallas o simplemente encontrando quienes tenian las ya descubiertas, se debía por etica e incluso algo mas fuerte por solidaridad entre encargados, dar aviso y procurar que sea corregido el problema, algo que era muy bien visto e incluso muchas veces agradecido el apoyo compartiendo mas de algun trago y conversando de lo que nos apaciona, obviamente “Seguridad Informática”.

Esto hoy se ve empañado a gran escala por casos como este:

HACKEO A CHILECOMPRA PONE EN DUDA MILES DE LICITACIONES PÚBLICAS DEL GOBIERNO

En el que si bien es cierto la definicion de HACKER nuevamente se mal usa, destaca el echo de que es increible saber el mal nivel de desarrollo de software que tiene Sonda. Sin desmerecer la genialidad del trabajo en Data Mining necesaria para llegar a encontrar una falla de esta embergadura.

Gino, se que estas con el estomago mas que apretado, confianza amigo mio en que todo esto no va  a ser mas que un recuerdo del que nos reiremos a futuro, en el que vemos como esta sociedad actua como mercenarios con quienes quieren hacer de este mundo un mejor lugar para vivir.

October 21, 2008

Actualizar Bios de Soekris con “cu” y “lsx”

Por lo general este tipo de procesos via serial  se les da mas cuidado del que tiene, si bien es cierto el proceso es critico, no es complejo, lo que si es necesario ya que las actualizaciones no son solo un parche o una nueva funcionalidad, es tambien mejorar el funcionamiento del hardware.

Aquí les muestro los pasos para esto proceso, en FreeBSD el comando “cu” es parte del sistema, pero “lsx” no y vien en el port /usr/ports/comms/lrzsz por lo que pasa a ser necesario en este proceso, lo primero es entrar al Soekris:

cu -l /dev/cuad0 -s 9600

En este proceso entramos al dispositivo, en mi caso tengo un net45xx, y en la consola digitar “download” ojo que esto le dice al soekris que espera una transmisión via serial, y es mientras espera respuesta que se debe ejecutar el comando “~C” OJO es C mayuscula para decirle al sistema que es COMANDO y como ven aqui abajo entre ese proceso se escribe “lsx /root/b4501_133.bin” mostrando algo como esto:

> download

Start sending file using XMODEM/CRC protocol.
CCCCCCCCCC

~C
Local command?
lsx /root/b4501_133.bin

Sending /root/b4501_133.bin, 608 blocks: Give your local XMODEM receive command now.
Bytes Sent:  77824   BPS:902

Transfer complete
File downloaded succesfully, size 608 Blocks.

Y así por ultimo actualizamos de la siguiente forma:

> flashupdate
Updating BIOS Flash ,,,,,,,,,,,,..,,,,.. Done.
> reboot

Finalizando Así:

comBIOS ver. 1.33  20080103  Copyright (C) 2000-2007 Soekris Engineering.
net45xx

0064 Mbyte Memory                        CPU Elan SC520 100 Mhz

Slot   Vend Dev  ClassRev Cmd  Stat CL LT HT  Base1    Base2   Int
——————————————————————-
0:00:0 1022 3000 06000000 0006 2280 00 00 00 00000000 00000000
0:09:0 104C AC50 06070002 0107 0210 10 3F 02 A0000000 020000A0 10
0:18:0 100B 0020 02000000 0107 0290 00 3F 00 0000E101 A0001000 11
0:19:0 100B 0020 02000000 0107 0290 00 3F 00 0000E201 A0002000 05

1 Seconds to automatic boot.   Press Ctrl-P for entering Monitor.

NSC DP83815/DP83816 Fast Ethernet UNDI, v1.03
Copyright (C) 2002, 2003 National Semiconductor Corporation
All rights reserved.

Pre-boot eXecution Environment  PXE-2.0 (build 082)
Copyright (C) 1997-2000  Intel Corporation

PXE-E61: Media test failure, check cable
PXE-M0F: Exiting MacPhyter PXE ROM.
No Boot device available, enter monitor.

comBIOS Monitor.   Press ? for help.

October 19, 2008

PostgreSQL Select a formato XML

Existen en la actualidad diversas formas de graficar reportes de datos, pero aquellas que son las mejores visualmente requieren de una lectura de datos de XML, por lo que aquí les va el como poder generar uno a travez de un “Select” a una tabla de datos, y obviamente en PostgreSQL las funciones son:

  • XMLParse
  • XMLSerialize
  • XMLElement
  • XMLForest
  • XMLAgg
  • XMLAttributes
  • XMLComment
  • XMLConcat

De las cuales mostrare ejemplos claros en su uso y funcionamiento, ah partir de aqui escribiré algunos como:

SELECT XMLElement(name root, nombre_campo) from tabla;

Y su resultado es mas menos algo parecido a esto:

         xmlelement
—————————–
 <root>Cuprum</root>
 <root>Habitat</root>
 <root>Magister</root>
 <root>Planvital</root>
 <root>Provida</root>
 <root>ING Capital</root>
 <root>Bansander</root>
 <root>Aporta Fomenta</root>

(8 rows)

October 15, 2008

Como cambiar el color de letras consola en FreeBSD

Tiempo atras CdK1 me consulto si podia cambiar el color de las letras a la consola de su FreeBSD, segun el alguna vez yo se lo habia explicado, pero yo no recuerdo XD, bueno despues de mucho buscar el mismo encontro respuesta a su pregunta y aqui estan las definiciones para agregar a la compilación del Kernel

options         SC_NORM_ATTR=(FG_LIGHTGREY|BG_BLACK)
options         SC_NORM_REV_ATTR=(FG_YELLOW|BG_GREEN)
options         SC_KERNEL_CONS_ATTR=(FG_BROWN|BG_BLACK)
options         SC_KERNEL_CONS_REV_ATTR=(FG_BLACK|BG_RED)

Ademas, para quienes no les guste este conjunto de colores presentados en este ejemplo, podran ver el abanico de posibilidades entregado por el sistema aqui:

less /usr/include/machine/pc/display.h

El agradecimiento por la información a “CdK1″, por el buen aporte.

October 02, 2008

Definición de Spam en Correo Electronico

Buscando por la red, una definición grafica (lease UML) o el como un MTA revisa y discrimina cual es SPAM y cual no, me dió por escribir el presente documento en el que dejare mi actual inquietud a disposición de los que la necesiten.

El termino SPAM es la definición de todo correo electronico recibido sin haberlo solicitado, y corresponde a todos los envios masivos de información, que actualmente es la mayor parte de los mensajes electrónicos intercambiados en internet, siendo utilizado para anunciar productos y servicios de dudosa calidad.

SpamAssassin es el numero uno en su area y al ser OpenSource va a ser la fuente de información del presente documento.

Tipos de detección:

  • Bayesian
  • RDBL
  • SPF
  • Chequeo de usuarios origen/destino
  • DomainKeys

October 01, 2008

September 26, 2008

Grub - Iniciar multiples Sistemas Operativos

Eh decidido actualizar este documento gracias “Javier” quien me solicito la instalación de un Unix que detecte su Atheros, obviamente FreeBSD lo hace y nativo por lo que en proceso me encontré con nuevas problemáticas al momento de escribir en el disco.

La instalación y su configuración, en forma detallada.

Instalación:

# cd /usr/ports/sysutils/grub/
# make build install clean

Esto dejara los binarios listos para su configuración y puesta en marcha, por lo que desde ahora en adelante todo lo que se debe hacer es con mayor cuidado ya que no hay que olvidar que se está trabajando con el particionado del disco y la información completa de este.

Luego de haber instalado GRUB:

# cd /boot
# mkdir grub

Crear el directorio donde se almacenaran los archivos capaces de leer los posibles Archivos de Sistemas (File Systems) que se instalaran en la estación de trabajo, dejando en claro que maneja mucho mas que 2 booteos de sistema:

# cd /boot/grub
# cp -v /usr/local/share/grub/i386-freebsd/* /boot/grub/

Quedando el directorio algo similar a esto:

# ls -l
-r–r–r–  1 root  wheel    9236 Dec 12 23:34 e2fs_stage1_5
-r–r–r–  1 root  wheel    9028 Dec 12 23:34 fat_stage1_5
-r–r–r–  1 root  wheel    8180 Dec 12 23:34 ffs_stage1_5
-r–r–r–  1 root  wheel    8276 Dec 12 23:34 iso9660_stage1_5
-r–r–r–  1 root  wheel    9888 Dec 12 23:34 jfs_stage1_5
-r–r–r–  1 root  wheel    8372 Dec 12 23:34 minix_stage1_5
-r–r–r–  1 root  wheel   11060 Dec 12 23:34 reiserfs_stage1_5
-r–r–r–  1 root  wheel     512 Dec 12 23:34 stage1
-r–r–r–  1 root  wheel  121768 Dec 12 23:34 stage2
-r–r–r–  1 root  wheel  121768 Dec 12 23:34 stage2_eltorito
-r–r–r–  1 root  wheel    8520 Dec 12 23:34 ufs2_stage1_5
-r–r–r–  1 root  wheel    7860 Dec 12 23:34 vstafs_stage1_5
-r–r–r–  1 root  wheel   10652 Dec 12 23:34 xfs_stage1_5

Pudiendo así con estos archivos leer varios sistemas en tiempo de booteo, bueno ahora con solo esto no basta es necesario para esto su archivo de configuración el cual sale un poco de los esquemas de lo normalmente acostumbrado, ya que este archivo no es “grub.conf” como por defecto alguien pensaría que se pudiese llamar si no que “menu.lst”.

Este archivo contiene toda la configuración de particionamiento, de cómo y en donde debe ir a obtener el o los Sistemas Operativos con los que va a presentar una lista de selección de booteo, en este caso en particular les comento que solo veremos FreeBSD y Microsoft por lo que voy a presentarles la configuración y posteriormente la explicaremos:

# cat menu.lst
default 1
timeout 10
title Microsoft Windows
       root (hd0,0)
       savedefault
       makeactive
       chainloader +1
title FreeBSD
       root (hd0,a)
       kernel /boot/loader
       boot

Así se ve la configuración más básica de el archivo menu.lst.

Hasta aquí todo aun es en cierto modo es simple. Lo que a partir de ahora se les enseñara es a tomar toda esta recopilación de archivos y de configuraciones y activarlos al sistema en su MBR (Lease Master Boot Record) para que de esta forma GRUB tome el control de la selección de MultiBooteo de el o los Sistemas Operativos residentes en la maquina.

NOTA: Es muy importante recalcar que para poder ejecutar lo que a continuación se les va a explicar, y que es el instalar GRUB en el MBR que este proceso en FreeBSD no se va a llevar a cabo mientras no se le diga al sistema que esto se esta haciendo y la forma de hacerlo es:

# sysctl kern.geom.debugflags=16

Permitiendo con esto a GRUB poder almacenar su información de ejecución en el MBR.

Luego a partir de consola se debe ejecutar su instalación de la siguiente forma:

# grub

NOTA: Debo recalcar que este paso es distinto a los pasos que van a encontrar en la red o googleando, ya que lo que se está ejecutando es la escritura del MBR en forma directa y no como los demás tutórales dicen que se debe hacer; y que es creando un diskette de booteo previo a la instalación que aquí se está haciendo.

Continuando, esto nos mostrara una ventana como la siguiente en la cual se mostraran los pasos a seguir que después se explicaran con detalle:

GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported.  For the first word, TAB
lists possible command completions.  Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> root (hd0,a)
Filesystem type is ufs2, partition type 0xa5

grub> setup (hd0)
Checking if “/boot/grub/stage1″ exists… yes
Checking if “/boot/grub/stage2″ exists… yes
Checking if “/boot/grub/ufs2_stage1_5″ exists… yes
Running “embed /boot/grub/ufs2_stage1_5 (hd0)”…  17 sectors are embedded.
succeeded
Running “install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,1,a)/boot/grub/stage2 /boot/grub/menu.lst”… succeeded
Done.
grub> quit

Ahora explicaremos paso a paso lo realizado en este proceso.
En el prompt de GRUB se escribieron 3 comandos para su instalación, de los cuales 2 son extremadamente importantes, el primero de ellos root (hd0,1,a) le dice a GRUB que el su configuración y binarios de Sistemas de Archivos se encuentra en esa partición. El segundo comando es setup (hd0) le esta ordenando a GRUB que en base a su configuración de el archivo menu.lst se instale en el HD0 que es el disco en donde se encuentran el o los Sistemas Operativos yendo a buscar a su ruta por defecto y que es /boot/grub/, encontrando así todo lo necesario para que esta condición de instalación se cumpla.
Solo nos queda aprender como personalizar aun mas nuestro grub para mejor presentación del mismo por lo que voy a darles una muestra de los que se puede lograr con él, ya que la interface que todos conocemos de Grub en las versiones de Linux es grafica, aquí explicaremos el cómo se logra que esto sea así

Esta es la línea que se debe agregar al archivo de configuración de Grub para que puedan ver la imagen que aquí se muestra pero como fondo de nuestro menú de selección de sistema:

splashimage=(hd0,a)/boot/grub/zion.xpm.gz

September 24, 2008

Recuperación de clave root en MySQL

Por lo general un procedimiento de administración para un DBA es tomar control completo de un motor de bases de datos en este caso en particular, es MySQL:

  1. Detener el motor de base de datos
  2. Iniciar nuevamente agregando la opción “–skip-grant-tables
  3. Ingresar al motor “mysql –u root
  4. Ejecutar “UPDATE mysql.user SET Password=PASSWORD(’password’) WHERE User=’root’;
  5. Y por ultimo “FLUSH PRIVILEGES;

Reiniciar el motor de base de datos y con eso finaliza. Una muy buena práctica de seguridad es cambiar el usuario root que viene asignado por defecto, por cualquier usuario ejemplo “dba”.

September 04, 2008

Installing FreeNAS into a USB stick

1.- Put the stick into the USB (dont mount it...)
2.- fdisk -BI /dev/da0 [ignore Geom not found "da0"]
3.- bsdlabel -B -w da0s1
4.- newfs -U -L MyBoot /dev/da0s1a
5.- mdconfig -a -f FreeNAS-i386-liveCD-0.7.3514.iso
6.- mount_cd9660 /dev/md0 /dist/
7.- mount /dev/da0s1a /mnt/
8.- cp -rip /dist/* /mnt
9.- umount /mnt

No matter if you update your firmware, if "USB Keyboard" is not enabled in the BIOS some motherboards will not boot! (took me hourse to realize that.. :P)