domingo, abril 23, 2017

Usando Sqlite3 con Python. Comandos basicos.

Pre-requisitos

Necesitaremos tener instalado:

  • sqlite-3
  • python
  • modulo sqlite3 para python


Verificar que funciona todo correctamente consultando la versión:

#!/usr/bin/python 

 import sqlite3 

 print sqlite3.version 
 print sqlite3.sqlite_version


Usando control de errores,  si la BBDD no existe la creará:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3 as sl
import sys

con = None

try:
        con = sl.connect('prueba.db')

        cur = con.cursor()
        cur.execute('SELECT SQLITE_VERSION()')

        data = cur.fetchone()

        print "SQLite version: %s" % data

except sl.Error, e:

        print "Error %s:" % e.args[0]
        sys.exit(1)

finally:

        if con:
                con.close()


Usando la cláusula "with", si la BBDD no existe la creará, además al terminar se cerrará la conexión:

import sqlite3 as sl
import sys

con = sl.connect('prueba.db')

with con:


        cur = con.cursor()
        cur.execute('SELECT SQLITE_VERSION()')

        data = cur.fetchone()

        print "SQLite version: %s" % data

Insertando datos

Creamos una tabla e insertamos datos:

con = sl.connect('inversiones.db')

with con:

        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INT, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")

        cur.execute("INSERT INTO MateriasPrimas VALUES(1,'CL','Petroleo',49.66,49.62)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(2,'XAU','Oro',1285.62,1284.16)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(3,'NG','Gas Natural',3.196,3.192)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(4,'XAG','Plata',17.959,17.930)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(5,'CC','Cacao',1852,1844)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(6,'KC','Cafe',130.43,129.62)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(7,'ZC','Maiz',357.61,356.12)")
        cur.execute("INSERT INTO MateriasPrimas VALUES(8,'ZW','Trigo',405.38,404.88)")

Verificando:

$ sqlite3 inversiones.db

sqlite> .tables
MateriasPrimas

sqlite> .mode column
sqlite> .headers on
sqlite> select * from MateriasPrimas;
Id          Symbol      Name        PriceB      PriceS
----------  ----------  ----------  ----------  ----------
1           CL          Petroleo    49.66       49.62
2           XAU         Oro         1285.62     1284.16
3           NG          Gas Natura  3.196       3.192
4           XAG         Plata       17.959      17.93
5           CC          Cacao       1852.0      1844.0
6           KC          Cafe        130.43      129.62
7           ZC          Maiz        357.61      356.12
8           ZW          Trigo       405.38      404.88

Insertando un array:

materiasprimas = (
        (1,'CL','Petroleo',49.66,49.62),
        (2,'XAU','Oro',1285.62,1284.16),
        (3,'NG','Gas Natural',3.196,3.192),
        (4,'XAG','Plata',17.959,17.930),
        (5,'CC','Cacao',1852,1844),
        (6,'KC','Cafe',130.43,129.62),
        (7,'ZC','Maiz',357.61,356.12),
        (8,'ZW','Trigo',405.38,404.88)
)

con = sl.connect('inversiones.db')

with con:
        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INT, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")
        cur.executemany("INSERT INTO MateriasPrimas VALUES(?,?,?,?,?)",materiasprimas)

Podemos declarar una columna como "INTEGER PRIMARY KEY" y se generará una columna con autoincremento:

materiasprimas = (
        ('XAU','Oro',1285.62,1284.16),
        ('XAG','Plata',17.959,17.930),
        ('NG','Gas Natural',3.196,3.192),
        ('CC','Cacao',1852,1844),
        ('KC','Cafe',130.43,129.62),
        ('CL','Petroleo',49.66,49.62),
        ('ZC','Maiz',357.61,356.12),
        ('ZW','Trigo',405.38,404.88)
)

con = sl.connect('inversiones.db')

with con:

        cur = con.cursor()

        cur.execute("DROP TABLE IF EXISTS MateriasPrimas")
        cur.execute("CREATE TABLE MateriasPrimas(Id INTEGER PRIMARY KEY, Symbol TEXT, Name TEXT, PriceB REAL, PriceS REAL)")
        cur.executemany("INSERT INTO MateriasPrimas(Symbol,Name,PriceB,PriceS) VALUES(?,?,?,?)",materiasprimas)

Leyendo datos

Para leer datos, se puede usar el nombre de la columna o su posición:

con = sl.connect('inversiones.db')

with con:

    con.row_factory = sl.Row

    cur = con.cursor()

    cur.execute("SELECT * FROM MateriasPrimas")

    rows = cur.fetchall()

    for row in rows:
        print "%s %s %s %s %s" % (row["Id"], row ["Symbol"], row["Name"], row[3], row[4])

Modificando datos

Podemos modificar datos al igual que en cualquier BBDD:

uSymbol = 'CL'
uPriceS = 49.50

con = sl.connect('inversiones.db')

with con:

    cur = con.cursor()

    cur.execute("UPDATE MateriasPrimas SET PriceS=? WHERE Symbol=?",(uPriceS,uSymbol))
    con.commit()

    print "Columnas modificadas: %d" % cur.rowcount


Usando "bind" variables

Podemos definir una consulta y usarla múltiples veces con distintos valores usando variables BIND:

uSymbol = 'CL'

con = sl.connect('inversiones.db')

with con:

    cur = con.cursor()

    cur.execute("SELECT Name, PriceB, PriceS FROM MateriasPrimas WHERE Symbol=:Symbol",{"Symbol":uSymbol})
    con.commit()

    row = cur.fetchone()
    print row


viernes, diciembre 16, 2016

DOCKER: Crear un registro privado en RHEL 7


Primero habilitamos el repositorio adecuado e instalamos el paquete de docker-registry que en RHEL se llama docker-distribution:


[root@forcarei registry]#  subscription-manager repos --enable=rhel-7-server-extras-rpms
[root@forcarei registry]# yum install docker-distribution

A continuación adaptamos la configuración a nuestro gusto, en este caso hemos creado un directorio para el repositorio de las imágenes:

[root@forcarei ~]$ cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /repos
http:
    addr: :5000

Arrancamos el servidor de registro:


[root@forcarei registry]# systemctl enable docker-distribution      
[root@forcarei registry]# systemctl start docker-distribution  

Probamos a hacer un PUSH contra el nuevo repositorio desde un servidor remoto:



[root@progreso ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
registry.access.redhat.com/rhel7.2   latest              98a88a8b722a        2 weeks ago         201.4 MB

[root@progreso ~]# docker tag registry.access.redhat.com/rhel7.2 forcarei:5000/rhel7.2

[root@progreso ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
forcarei:5000/rhel7.2                latest              98a88a8b722a        2 weeks ago         201.4 MB
registry.access.redhat.com/rhel7.2   latest              98a88a8b722a        2 weeks ago         201.4 MB

[root@progreso ~]# docker push forcarei:5000/rhel7.2
The push refers to a repository [forcarei:5000/rhel7.2]
unable to ping registry endpoint https://forcarei:5000/v0/
v2 ping attempt failed with error: Get https://forcarei:5000/v2/: http: server gave HTTP response to HTTPS client
 v1 ping attempt failed with error: Get https://forcarei:5000/v1/_ping: http: server gave HTTP response to HTTPS client

Tenemos que reconfigurar Docker para añadir el nuevo registro como inseguro:


[root@progreso ~]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

....
....

ADD_REGISTRY='--add-registry registry.access.redhat.com --add-registry forcarei:5000'

....
....

INSECURE_REGISTRY='--insecure-registry forcarei:5000'

Y listo, ya tenemos nuestro servidor docker registry local, para consultarlo podéis utilizar la herramienta drinfo.py

viernes, agosto 12, 2016

Preservar kernel tras actualización

Método 1: Aumentar el número de versiones de kernel a mantener:

En /etc/yum.conf existe el parámetro installonly_limit por defecto configurado a 3, se puede aumentar o disminuir.

Método 2: Persistir una versión de kernel concreta:

Supongamos que tenemos instalados:

#  rpm -qa | grep kernel-4
kernel-4.6.5-200.fc23.i686
kernel-4.4.14-200.fc22.i686
kernel-4.6.4-201.fc23.i686

Y queremos mantener la versión 4.4.14, usaremos el comando:

# yumdb set installonly keep kernel-4.4.14-200.fc22.i686

kernel-4.4.14-200.fc22.i686     installonly = keep

Podemos consultar los tags configurados con:

# yumdb info kernel-4.4*

kernel-4.4.14-200.fc22.i686     installonly = keep

Y revertir esta configuración con:

# yumdb del installonly keep kernel-4.4.14-200.fc22.i686

kernel-4.4.14-200.fc22.i686     installonly

lunes, mayo 23, 2016

Teclado en consola Linux (RHEL,Centos 7)

Cargar un mapa de teclado en la sesión actual:

   loadkeys es

Mapas de teclado disponibles:

   localectl list-keympas

Cambiar configuración de forma permanente:

  localectl  set-keymap --no-convert es

Configuración:

  /etc/vconsole.conf 

martes, marzo 01, 2016

Que es GECOS?

Que es GECOS?


GECOS es el acrónimo de "General Electric Comprhensive Operating System".

En los sistemas Unix/Linux, se utiliza para referirse a la forma estructurada del campo comentario en el fichero /etc/passwd, el campo de la posición 5 :

srlobo:x:1002:1002:Mr. Lobo,Problems Dept.,20115:/home/srlobo:/bin/bash

Los campos mas comunes son en este orden:

  1. Nombre completo del usuario.
  2. Sala, edificio, localización del usuario
  3. Teléfono del trabajo
  4. Cualquier otra información de contacto.

Los usuarios pueden cambiar su información con el comando chfn:

[srlobo@pulp ~]$ chfn
Changing finger information for srlobo.
Name []: Mr. Lobo
Office []: Problems Dept.
Office Phone []: 20110
Home Phone []:

Password:
Finger information changed.


El uso del comando chfn puede ser bloqueado por el administrador modificando el fichero pam correspondiente:

$ cat /etc/pam.d/chfn
#%PAM-1.0
auth       sufficient   pam_rootok.so
auth       required     pam_warn.so
auth       required     pam_deny.so
auth       include      system-auth
account    include      system-auth
password   include      system-auth
session    include      system-auth

La información se puede visualizar con el comando finger:


$ finger srlobo
Login: srlobo                           Name: Mr. Lobo
Directory: /home/srlobo                 Shell: /bin/bash
Office: Problems Dept., x2-0110
Last login Tue Mar  1 22:52 (CET) on pts/0
No mail.
No Plan.


martes, noviembre 24, 2015

Repositorio GIT con Synology

Repositorio GIT con Synology


Servidor NAS Synology: DS215j

Pasos previos:

  • Crear el usuario en el NAS: gituser
  • Crear el directorio para los repositorios:  /volume2/REPO.GIT
  • Dar permisos de lectura escritura al usuario gituser en el directorio anterior.
  • En el menu de apps, seleccionar git-server y dar acceso al usuario gituser.

Crear un repositorio nuevo.


 En el NAS con root:

> cd /volume2/REPO.GIT
> mkdir mirepo.git
> cd mirepo.git
> git --bare init
> git update-server-info
> cd ..
> chown -R gituser:users mirepo.git

En el equipo de desarrollo:

$ git clone ssh://gituser@NAS/volume2/REPO.GIT/mirepo.git

Trabajamos normalmente, para subir actualizaciones:

$ git push origin master


jueves, abril 09, 2015

SELINUX Rapido - Fedora 21


Configuración fedora


/etc/sysconfig/selinux
 

Estado


# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      29

SELinux status:                 enabled

Modos

enforcing: Fuerza la aplicación de la politica SE. Deniega acceso y loguea las operaciones.permissive: No deniega acceso, solo emite avisos. Se usa para depurar problemas con SE.
disabled: SELinux deshabilitado.

Politicas


SELinux permite varias políticas diseñadas para ser intercambiables.

Se puede ver las instaladas con:

# rpm -qa | grep selinux-policy
selinux-policy-3.13.1-105.9.fc21.noarch
selinux-policy-targeted-3.13.1-105.9.fc21.noarch

Estan instaladas en /etc/selinux// .

En Fedora la política por defecto es targeted.

En esta política todo corre sobre el dominio unconfined_t, excepto para ciertos demonios específicos. Los objetos en unconfined_t no tienen restricciones y equivalen a los accesos de Unix estandar (DAC).

Herramientas para modificar la política

audit2allow

Permite modificar reglas de la política basado en el log de auditoría.

Documentacion audit2allow en CentOS 5

Booleans

Permiten modificar el comportamiento de la política sin necesidad de recompilar la misma.

Documentacion Booleans en CentOS 5

Control de acceso

SELinux tiene tres modos de acceso:
  
Type Enforcement (TE): Es el mecanismo primario usado en la  targeted 

Role-Based Access Control (RBAC): Basado en usuarios SELinux que no necesariamente coinciden con los usuarios del sistema no se usa en la politica targeted

Multi-Level Security (MLS): No usada habitualmente y oculta a veces en la politica targeted


De los procesos y ficheros se pueden ver con los comandos habituales y la opción (-Z) los campos del contexto de seguridad:

Ver procesos:

# ps -eZ | grep httpd
system_u:system_r:httpd_t:s0      889 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     1255 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     1256 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     1257 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     1258 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     1259 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     3126 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     3811 ?        00:00:00 httpd

# ps -eZ | grep bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2826 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3626 pts/0 00:00:01 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 7524 pts/1 00:00:00 bash

Ver ficheros:

# ls -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/passwd

Estos campos estan basados en user:role:type:mls, en los ejemplos el campo mls esta oculto. En la politica targeted el campo mas importante es el type.

El acceso solo esta permitido entre tipos similares.

Modificacion de contexto de seguridad

Añadimos el directorio R_Tutorial a nuestro arbol del servidor http, pero este no tiene acceso, revisamos los permisos y vemos que el campo type no es correcto:

www # ls -Z
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 ProGit2.0
drwxrwxr-x. root root unconfined_u:object_r:user_home_t:s0 R_Tutorial

Cambiamos el contexto:

 chcon -Rv --type=httpd_sys_content_t R_Tutorial/

Verificamos que ya accedemos correctamente:

www # ls -Z
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 ProGit2.0
drwxrwxr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 R_Tutorial