LINUX: Montar una unidad samba (cifs) con permisos Read/Write

Existe un bug en la configuración de fstab al montar una unidad samba mediante cifs que no deja modificar los ficheros después de crearlos a pesar de especificar las directrices del manual.

Después de investigar un poco sobre el tema he encontrado la solución. Supondremos que estamos trabajando en un entorno windows y que queremos compartir una carpeta en ese directorio windows accediendo mediante un usuario del active directory.

En primer lugar debermos crear un fichero con el nombre de usuario y password del active directory:

gksu gedit /root/.smbcredentials

y lo llenamos con

username=USUARIO_WINDOWS
password=PASSWORD_WINDOWS

Después editamos el fichero fstab para que la unidad se monte automáticamente con los siguientes parámetros:

gksu gedit /etc/fstab

Y añadimos la línea:

//RUTA/SAMBA /media/DIRECTORIO_A_MONTAR cifs auto,uid=LINUXUSER,gid=LINUXGROUP,nocase,noperm,file_mode=0777,dir_mode=0777,credentials=/root/.smbcredentials 0 0

UBUNTU: Compartición de carpetas en red

  • Para poder compartir carpetas en un entorno de red en linux debemos usar samba. Nos podemos encontrar con dos situaciones diferentes, que requieren pasos de configuración distintos.  En un primer caso explicaremos como compartir una carpeta del propio linux hacia el exterior y en el segundo caso hablaremos de cómo montar una unidad de red externa como si fuera local en el propio linux.

Compartiendo una carpeta interna

Crearemos una carpeta, y le asignaremos los permisos adecuados para que un usuario externo pueda escribir en ella:

sudo mkdir /opt/shared_folder
sudo chmod 777 /opt/shared_folder

Estamos asumiendo que hablamos de un entorno seguro (una red local de casa o de la oficina) en el caso que se quiera compartir públicamente sería necesario afinar un poco más este paso, asignando solamente los permisos necesarios.

Si compartimos la carpeta como está actualmente, los ficheros se guardarán como usuario root, con lo que nuestro usuario de SO no tendrá acceso a los ficheros que se dejen allí. Para ello, debemos especificar en el fichero de configuración samba con qué usuario y grupo queremos que se guarden los ficheros. Para ello editaremos el fichero:

gksu gedit /etc/samba/smb.conf

y especificaremos los siguientes parámetros:

security = share
create mask = 0775
security mask = 0775
force user = linuxosuser
force group = linuxosgroup

A continuación, procederemos a compartir la carpeta (lo podemos hacer visualmente pulsando con el botón derecho del mouse y accediendo a Sharing), especificaremos el nombre del recurso de red que queremos asignar a la carpeta y guardaremos los cambios.

Después reiniciaremos samba y ya tendremos el share creado.

sudo /etc/init.d/samba restart

En el caso que queramos compartir la carpeta en una red windows es posible que queramos integrar la carpeta en el workgroup de windows y con el active directory para aprovechar la autenticación de los usuarios windows. Para ello deberíamos seguir los siguientes pasos:

        sudo apt-get install winbind
      cd /usr/lib/samba/idmap/
      sudo ln -s /usr/lib/likewise-open/idmap/lwopen.so
      gksu gedit /etc/samba/smb.conf
      • Añadir las siguientes lineas:
        security = ads
        workgroup = WINDOWS_WORKGROUP
        realm = WINDOWS_WORKGROUP.EXT
        idmpa backend = lwopen
        idmap uid = 50-9999999999
        idmap gid = 50-9999999999
        • Modificar los ficheros y reiniciar los servicios:
        mv /var/lib/samba/secrets.tdb /var/lib/samba/secrets.tdb.orig
        ln -s /etc/samba/secrets.tdb /var/lib/samba/secrets.tdb
        sudo /etc/init.d/samba restart
        sudo /etc/init.d/likewise-open restart
        sudo /etc/init.d/winbind restart
      1. A continuación seguimos los mismos pasos que antes para compartir la carpeta y ésta pedirá un login de un usuario del active directory.
      2. Montando una unidad de red (carpeta externa compartida)
        Uno de los problemas típicos es que al montar una unidad de red sobre una carpeta compartida externa es que no tengamos permisos para escribir ficheros en el destino o que una vez creados,  no podamos modificarlos ni borrarlos. Esto es debido a que se monta la unidad como usuario root y el usuario del S.O. linux no tiene permisos suficientes para modificarlos. Para ello, haremos que la unidad se monte como un usuario de windows creando un fichero de configuración al que apuntaremos desde fstab.
        Creamos un fichero con el usuario de windows (asumimos que la carpeta compartida es en windows):

        gksu gedit  /root/.smbpasswd

        Añadimos las siguientes líneas al fichero vacío:

        username=mywindowsusername
        password=mywindowspassword
        Le damos los permisos necesarios:
        sudo chmod 600 /root/.smbpasswd
        Editamos el fichero fstab:
        gksu gedit /etc/fstab
        Añadimos la línea:
        //servername/sharename /mountdirectory cifs credentials=/root/.smbpasswd 0 0
        Y montamos la carpeta:
        sudo mount /mountdirectory
        Más información en: http://www.justlinux.com/nhf/Filesystems/Mounting_smbfs_Shares_Permanently.html

        SQLServer2005: Enlazar logins de instancia con logins de BD

        En SQL Server se tiene una capa doble de autenticación, por una parte se tienen los usuarios de instancia  (Security - Logins) y luego a nivel de BD tenemos otros logins (DB - <DB_Name> - Security - Users). Después de realizar un restore de base de datos, estos logins pueden quedar descoordinados con lo que es necesario volver a enlazar los logins de instancia con los de BD. Para ello podemos usar la siguiente instrucción por cada usuario a enlazar (para ello se requiere una cuenta de administrador de BD):

         
        USE DATABASE_NAME;
         
        GO
         
        EXEC sp_change_users_login 'Auto_Fix', 'username', NULL;
         
        GO

        SSIS Expresión: Como obtener un DT_STR con el formato de la fecha y hora de ejecución

        La siguiente expresión nos permite obtener la fecha y la hora de ejecución de un package de SSIS.

        Por ejemplo, si la fecha es 02/01/2010 10:09, la expresión devolverá el siguiente DT_STR:

        “20100102_1009″.

        Lo publico porqué no me ha parecido trivial el modo de conseguir obtener dos dígitos para todos los campos, pues la función DatePart solamente devuelve un integer sin 0’s a la izquierda, para ello, usamos la función RIGHT, que nos añade los ceros faltantes. Esta función puede resultar muy útil para renombrar ficheros de carga con la fecha y hora de carga y guardarnos un histórico.

        (DT_STR, 4, 1252) Year( @[System::StartTime] ) +  right("0"+(DT_STR, 4, 1252)  Month( @[System::StartTime] ),2) +  right("0"+(DT_STR, 4, 1252)  Day ( @[System::StartTime] ),2) +"_"+  right("0"+(DT_STR, 2, 1252)  Datepart ("hh", @[System::StartTime] ),2) +  right("0"+(DT_STR, 2, 1252)  Datepart ("mi", @[System::StartTime] ),2)

        Stored Procedure SQL Server generador de fechas

        El siguiente Stored Procedure nos sirve para generar fechas hasta la fecha actual. Útil para rellenar una tabla de dimensión fecha (DIM_FECHA) con los campos:

        id_data: idenfitificador de la fecha en integer (ejp: 20091001)

        • date: fecha en sql
        • dia: dia en integer
        • dia_text: texto del dia (ejp: Sábado)
        • mes: mes en integer
        • mes_text: mes en texto (Marzo)
        • anyo: año en integer
        • periode: período en integer (ejp: 200910)
        CREATE PROCEDURE generar_dim_fecha
         
        AS
         
        BEGIN
         
        SET NOCOUNT ON
         
        SET XACT_ABORT ON
         
        declare @Date smalldatetime,
         
        @i int,
        @id_data int,
        @id_data_text varchar(50),
        @dia int,
        @dia_setmana int,
        @dia_text varchar(50),
        @mes int,
        @mes_text varchar(50),
        @anyo int,
        @periode int,
        @max_data_bd smalldatetime
         
        SELECT @max_data_bd = isnull(max(DATA),'2008-01-01') FROM DIM_FECHA
         
        SET @Date = '2008-01-01'
         
        IF @max_data_bd &gt; @Date SET @Date = dateadd(d,1,@max_data_bd)
         
        SET @i = 1
         
        while @date &lt;= getDate()
         
        begin
         
        SET @id_data_text = CONVERT(varchar(8), @date, 112)
         
        SET @periode = SUBSTRING(@id_data_text,1,6)
         
         SET @id_data = CONVERT(varchar(8), @date, 112)
         
        SET @dia = SUBSTRING( @id_data_text,7,2)
         
         SET @mes = SUBSTRING( @id_data_text,5,2)
         
         SET @anyo = SUBSTRING( @id_data_text,1,4)
         
        SET @dia_setmana = DATEPART ( dw ,@date)
         
         SET @dia_text =
         
        CASE 
         
        WHEN @dia_setmana = 1 THEN 'Domingo'
         
        WHEN @dia_setmana = 2 THEN 'Lunes'
         
        WHEN @dia_setmana = 3 THEN 'Martes'
         
        WHEN @dia_setmana = 4 THEN 'Miércoles'
         
        WHEN @dia_setmana = 5 THEN 'Jueves'
         
        WHEN @dia_setmana = 6 THEN 'Viernes'
         
        WHEN @dia_setmana = 7 THEN 'Sábado'
         
         END
         
        SET @mes_text =
         
        CASE
         
        WHEN @mes = 1 THEN 'Enero'
         
        WHEN @mes = 2 THEN 'Febrero'
         
        WHEN @mes = 3 THEN 'Marzo'
         
        WHEN @mes = 4 THEN 'Abril'
         
        WHEN @mes = 5 THEN 'Mayo'
         
        WHEN @mes = 6 THEN 'Junio'
         
        WHEN @mes = 7 THEN 'Julio'
         
        WHEN @mes = 8 THEN 'Agosto'
         
        WHEN @mes = 9 THEN 'Septiembre'
         
        WHEN @mes = 10 THEN 'Octubre'
         
        WHEN @mes = 11 THEN 'Novembre'
         
        WHEN @mes = 12 THEN 'Desembre'
         
        END
         
        /*PRINT @id_data
         
        PRINT @dia
         
        PRINT @dia_setmana
         
        PRINT @dia_text
         
        PRINT @mes
         
        PRINT @mes_text
         
        PRINT @anyo
         
        PRINT @periode*/
         
        INSERT DIM_FECHA
         
         (id_data, DATA, dia,dia_text,mes,mes_text,anyo,periode)
         
        VALUES (@id_data,@date,@dia, @dia_text, @mes, @mes_text, @anyo, @periode)
         
         SET @i = @i + 1
         
         SET @Date = DateAdd(d, 1, @Date)
         
        end
         
        END

        JavaScript para emular radiobutton con checkboxes

        Para hacer que todos los checkboxes de una página en concreto se comporten como un radiobutton (que solamente se muestre uno activo en cada momento). Podemos usar el siguiente Javascript:

        function set_change(a) {
             if (a.checked==true){       
               var inputs = document.getElementsByTagName('input');
               for(var i=0; i<inputs.length; i++){
                 if(inputs[i].getAttribute('type')=='checkbox'){
                   if (inputs[i]!=a)
                     inputs[i].checked=false;
                 }
               }
            }
          }

        Para ello solamente tendremos que informar la acción onclick de cada elemento checkbox que queramos que se comporte así:

          <input type="checkbox" name="Chk1" onclick="set_change(this)">

        APEX 3.1 y 3.2 solución al bug de “Post Element Text” en checkboxes, popup lovs, etc. + Ejemplo de eliminar valor en Popup Lov

        A partir de la versión de APEX 3.1 si añadimos un texto en la casilla “Post Element” en ciertos elementos (checkboxes, popup lovs, etc.) veremos que el texto aparece debajo del elemento en lugar de aparecer a la derecha del elemento.

        Esto es debido a un error en la especificación del CSS que define el fieldset. A partir de APEX 3.1 se ha cambiado la declaración de la clase del CSS. Según los de APEX esto no se cambiará de momento. Aquí va un workaround.

        Voy a partir de un ejemplo en concreto (con el que me encontré el problema) vamos a añadir un icono para eliminar el valor de una Popup LOV. Para ello podemos añadir el siguiente código en el Post Element Text:

        <img onclick="document.getElementById('#CURRENT_ITEM_NAME#_HIDDENVALUE').value='';
        document.getElementById('#CURRENT_ITEM_NAME#').value=''" src="#IMAGE_PREFIX#delete.gif" alt="" />

        Esto añadirá un icono con una X al lado del Popup-lov que nos permitirá eliminar el valor seleccionado. Si usamos APEX > 3.0 veremos como esta X aparece debajo del elemento en lugar de la derecha. Aquí esta el problema del CSS que he comentado. Para ello, debemos redeclarar la clase “lov”.

        Añadimos el siguiente código en el HTML header de la página en concreto:

        <style type="text/css">
        .lov {
        display:inline;
        vertical-align:baseline;
        }
        </style>

        Como veremos no quedará perfectamente alineado. Para ello podemos hacer una pequeña trampa y modifcar el Post Element Text y encapsular el código dentro de un SPAN con vertical-alignment:

        <span style="vertical-align: middle;">
         
        <img onclick="document.getElementById('#CURRENT_ITEM_NAME#_HIDDENVALUE').value='';
        document.getElementById('#CURRENT_ITEM_NAME#').value=''" src="#IMAGE_PREFIX#delete.gif" alt="" />;
         
        </span>

        Más información en el post del foro de APEX:

        http://forums.oracle.com/forums/thread.jspa?threadID=659658&start=0&tstart=0

        Montar una unidad SAMBA con fstab en Ubuntu

        Para montar automáticamente una unidad de red (nombre equivalente en windows) en Ubuntu debemos editar el fichero /etc/fstab:

        $ gksu gedit /etc/fstab
        //servidor/unidad /media/directorio_destino cifs    auto,user=username,password=password,noexec,user,rw,nounix,iocharset=utf8    0    0

        Debemos rellenar los campos username y password en el caso que querramos acceder medianto contraseña, por el contrario borramos las entradas. Es importante notar que para que la codificación de caracteres se muestre correctamente (al menos para Español) hay que añadir la opción  iocharset=utf8

        En el caso que se produzcan cuelgues cuando no se esté conectado a la red podemos cambiar el auto por noauto y montar manualmente las unidades con el comando mount cuando sea necesario.

        Espero que os sirva!

        ORACLE: Importar CLOBS

        ¿Cómo importar CLOBS en Oracle?

        Si probamos de hacer un export desde el SQLDeveloper, veremos que solamente podemos exportar la estructura de la tabla sin poder volver a recrear el contenido del CLOB. Seguramente una vez llegados a este punto, decidamos realizar un export mediante las utilidades EXP/IMP. Si intentamos esto nos encontraremos con la sorpresa que para poder recrear la tabla, si no tenemos el mismo TABLESPACE creado en la BD destino no nos dejará crear la tabla dándonos el siguiente error:

        ORA-00959: tablespace 'XXXXX' does not exist

        Después de darle varias vueltas he encontrado una solución y es la siguiente:

        1) Hacer export mediante comando EXP, por ejemplo:

        EXP schema_origen/pass OWNER=schema_orgien FILE=file_destino.dmp DIRECT=Y ROWS=Y LOG=file.log

        2) Crear la estructura de la tabla mediante DDL:

        CREATE TABLE tabla (col1 tipo, ....)

        Nota: La estructura debe ser la misma que en la de la tabla en el export

        3) Realizar un import con el flag IGNORE=Y

        IMP USERID=schema_destino/pass FROMUSER=schema_origen/pass TOUSER=schema_destino file=file_destino.dmp LOG=file_import.log TABLES=nombre_tabla IGNORE=Y

        Fuente de la notícia con la explicación técnica detallada:

        http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848

        Mi xorg.conf

        Hola, posteo mi xorg.conf después de haberlo configurado durante meses. Entre ellos he conseguido solucionar los problemas relacionados con Compiz y los problemas de vídeo, los problemas de segmentation fault por culpa del display, etc.

        El fichero está configurado para la última versión del driver de ATI 8.12 (aceleradora HD 3400) y portátil vaio FW11M.

         
        # xorg.conf (X.Org X Window System server configuration file)
        #
        # This file was generated by dexconf, the Debian X Configuration tool, using
        # values from the debconf database.
        #
        # Edit this file with caution, and see the xorg.conf manual page.
        # (Type "man xorg.conf" at the shell prompt.)
        #
        # This file is automatically updated on xserver-xorg package upgrades *only*
        # if it has not been modified since the last upgrade of the xserver-xorg
        # package.
        #
        # If you have edited this file but would like it to be automatically updated
        # again, run the following command:
        #   sudo dpkg-reconfigure -phigh xserver-xorg
         
        Section "ServerLayout"
        	Identifier     "Default Layout"
        	Screen      0  "Default Screen" 0 0
        	InputDevice    "Synaptics Touchpad"
        EndSection
         
        Section "Files"
        EndSection
         
        Section "Module"
        EndSection
         
        Section "ServerFlags"
        	Option	    "Xinerama" "off"
        EndSection
         
        Section "InputDevice"
        	Identifier  "Generic Keyboard"
        	Driver      "kbd"
        	Option	    "XkbRules" "xorg"
        	Option	    "XkbModel" "pc105"
        	Option	    "XkbLayout" "es"
        	Option	    "XkbOptions" "lv3:ralt_switch"
        EndSection
         
        Section "InputDevice"
        	Identifier  "Configured Mouse"
        	Driver      "mouse"
        	Option	    "CorePointer"
        EndSection
         
        Section "InputDevice"
        	Identifier  "Synaptics Touchpad"
        	Driver      "synaptics"
        	Option	    "SendCoreEvents" "true"
        	Option	    "Device" "/dev/psaux"
        	Option	    "Protocol" "auto-dev"
        	Option	    "SHMConfig" "true"
        	Option	    "HorizEdgeScroll" "0"
        EndSection
         
        Section "Monitor"
        	Identifier   "Configured Monitor"
        	DisplaySize  423	238
        #	DisplaySize  541	304
        EndSection
         
        Section "Device"
        	Identifier  "Configured Video Device"
        	Driver      "fglrx"
        	Option	    "Centermode" "on"
        	Option	    "TexturedVideo" "off"
        	Option	    "VideoOverlay" "off"
        	Option	    "OpenGLOverlay" "off"
        	BusID       "PCI:1:0:0"
        EndSection
         
        Section "Screen"
        	Identifier "Default Screen"
        	Device     "Configured Video Device"
        	Monitor    "Configured Monitor"
        	DefaultDepth     24
        EndSection
         
        Section "Extensions"
        	Option	    "Composite" "Enable"
        EndSection