Planeta Sysadmin

de sysadmins para sysadmins

April 20, 2018

# rm-rf.es

Resetear servidor de Oracle VM que ha quedado en estado inconsistente

No será la primera vez, ni desgraciadamente la última, en la que nos encontremos que un servidor de Oracle VM que está registrado en Oracle VM Manager y que forma parte de un pool, con sus respectivas configuraciones, queda en un estado inconsistente o “huerfano“. Esto sucede cuando por ejemplo se elimina en Oracle VM Manager una configuración que hace referencia a ese servidor cuando este estaba inaccesible. Esto crea una inconsistencia entre la base de datos local que guarda el hipervisor con su agente (ovs-agent) y la que tiene el VM  Manager.

A partir de la versión 2.3 (si no me equivoco) Oracle pone a nuestra disposición un script, cleanup.py, que se encarga de limpiar la base de datos local de ovs-agent:

/opt/ovs-agent-2.3/utils/cleanup.py

Hace lo siguiente:

  • Para el servicio OCFS2 cluster  (o2cb) heartbeat.
  • Pone offline el servicio OCFS2 cluster (o2cb).
  • Elimina la configuración de o2cb.
  • Desmonta cualquier repo gestionado por el agente ovs-agent.
  • Limpia la base de datos local de ovs-agent.

Ejemplo de ejecución:

# /opt/ovs-agent-2.3/utils/cleanup.py

This is a cleanup script for ovs-agent.
It will try to do the following:

*) stop o2cb heartbeat
*) offline o2cb
*) remove o2cb configuration file
*) umount ovs-agent storage repositories
*) cleanup ovs-agent local database

Would you like to continue? [y/N] 

Si tenéis versiones inferiores a la 2.3. Podéis copiar el script de una versión superior y ejecutarlo, debería funcionar igual. Sino, siempre podéis ejecutar a mano estos pasos:

# service ovs-agent stop
# rm /etc/ovs-agent/db
# > /etc/ocfs2/cluster.conf
# service ovs-agent start

by Alex at April 20, 2018 08:37 PM

CloudAdmins.org

Integración continua de infraestructura: Terraform & ONE

ScreenLa Infraestructura como Código (IaC) se está convirtiendo en uno de los elementos clave de los equipos Agile, ya que permite que la infraestructura ya no sea el cuello de botella dentro de nuestro pipeline CI/CD.

Una de las herramientas que se puede utilizar es terraform. Esta aplicación permite codificar la infraestructura según las necesidades del servicio y hacerlo de manera agnóstica al entorno cloud donde se ejecute. Por ello, la IaC nos puede ayudar a agilizar la creación y mantenimiento de infraestructuras de forma automatizada.

Dentro de la comunidad de la plataforma abierta de computación en la nube,  OpenNebula, Runtastic ha desarrollado un provider de OpenNebula para terraform, aprovechando la API OpenNebula XML/RPC. Este proveedor permite crear los principales recursos de OpenNebula, como una máquina virtual, un template, una red virtual o una imagen de disco.

En el siguiente tutorial, se detalla como instalar la herramienta i utilizarla con OpenNebula para desplegar un clúster de Kubernetes sobre Docker de forma totalmente automatizada con Terraform y Ansible.

Por último, recordaros que el próximo 24 de mayo, vuelve el “OpenNebula TechDay“,  a Barcelona que constará de un taller práctico donde se presentará esta plataforma, y se procederá a su instalación y se mostrará su funcionamiento y sus utilidades.

Ya podéis registraros al evento en el siguiente enlace! Y en breve tendréis también disponible la Agenda para la Jornada.

Tutorial

Deploying a Kubernetes Cluster to ONE with Ansible and Terraform

 Installing Terraform

To install Terraform, find the appropriate package for your system and download it

$ curl -O https://releases.hashicorp.com/terraform/0.11.4/terraform_0.11.4_linux_amd64.zip

After downloading Terraform, unzip the package

$ sudo mkdir /bin/terraform
$ sudo unzip terraform_0.11.4_linux_amd64.zip -d /bin/terraform

After installing Terraform, verify the installation worked by opening a new terminal session and checking that terraform is available.

$ export PATH=$PATH:/bin/terraform
$ terraform --version

Installing Terraform provider Opennebula

You need to install go first: https://golang.org/doc/install

Install Prerequisites
$ sudo apt install bzr

Use the wget command and the link from Go to download the tarball:

$ wget https://dl.google.com/go/go1.10.linux-amd64.tar.gz

The installation of Go consists of extracting the tarball into the /usr/local

 

$ sudo tar -C /usr/local -xvzf  go1.10.linux-amd64.tar.gz 

We will call our workspace directory projects, but you can name it anything you would like. The `-p` flag for the `mkdir` command will create the appropriate directory tree

$ mkdir -p ~/projects/{bin,pkg,src}

To execute Go like any other command, we need to append its install location to the $PATH variable.

$ export PATH=$PATH:/usr/local/go/bin

Additionally, define the GOPATH and GOBIN Go environment variables:

$ export GOBIN="$HOME/projects/bin"
$ export GOPATH="$HOME/projects/src"

After go is installed and set up, just type:

$ go get github.com/runtastic/terraform-provider-opennebula
$ go install github.com/runtastic/terraform-provider-opennebula
Optional post-installation Step

Copy your terraform-provider-opennebula binary in a folder, like /usr/local/bin, and write this in ~/.terraformrc:

$ sudo cp ~/projects/bin/terraform-provider-opennebula /usr/local/bin/terraform-provider-opennebula

Example for /usr/local/bin:

providers {
  opennebula = "/usr/local/bin/terraform-provider-opennebula"
}
Install Ansible

We can add the Ansible PPA by typing the following command:

$ sudo apt-add-repository ppa:ansible/ansible

Next, we need to refresh our system’s package index so that it is aware of the packages available in the PPA. Afterwards, we can install the software:

$ sudo apt-get update
$ sudo apt-get install ansible

Deploy a Kubernetes cluster

Terraform code is written in a language called HCL in files with the extension “.tf”. It is a declarative language, so your goal is to describe the infrastructure you want, and Terraform will figure out how to create it. This repository provide an Ansible playbook to Build a Kubernetes cluster with kubeadm. The goal is easily install a Kubernetes cluster on machines running CentOS 7. 

$ git clone https://github.com/mangelft/terransible-kubernetes-cluster.git

First, initialize Terraform for your project. This will read your configuration files and install the plugins for your provider:

$ terraform init

In a terminal, go into the folder where you created main.tf, and run the terraform plan command:

The plan command lets you see what Terraform will do before actually doing it. To actually create the instance, run the terraform apply command:

You can access Dashboard using the kubectl command-line tool by running the following command:

$ kubectl proxy --address $MASTER_IP --accept-hosts='^*$'

The last step is to complete the cluster life cycle by removing your resources, do: terraform destroy

 Fuente: https://github.com/mangelft/terransible-kubernetes-cluster

Buen vuelo!

by Miguel Angel Flores at April 20, 2018 02:36 PM

April 19, 2018

RooTeando

Tomando Un Café 28: Explicaciones

Trataré el tema de una buenas explicaciones en una formación,  la importancia que tienen tanto para el formador como la formación.

Música: Yung Kartz- April 2018-25. Bail Out
http://freemusicarchive.org/music/Yung_Kartz/April_2018/Bail_Out

Canales de Telegram @UnDiaUnaAplicacion @UnPythonAldia @AprendePython
Correo [email protected]
Twitter https://twitter.com/Tomando_Un_Cafe

RSS
Anchor.fm  http://anchor.fm/s/18c0860/podcast/rss
Blog(post y podcast)  https://rooteando.com/feed/
Whooshkaa   ...

April 19, 2018 01:50 AM

April 15, 2018

# rm-rf.es

Activar JMX en Weblogic

Una entrada rápida. Habilitar las Java Management Extensions (JMX) simplemente requiere añadir la configuración correspondiente al archivo setDomainEnv.sh, disponible en el directorio bin/ del dominio, que como sabréis, contiene gran parte de la configuración y parámetros de arranque de Weblogic. En la mayoría de casos, esta configuración ya viene preestablecida y comentada, por lo que sólo se require revisar la instancia a la que queremos activarla y reiniciar el servicio:

## Enable JMX for monitoring purpose
#if [ "${SERVER_NAME}" != "AdminServer" ] ; then
#   JAVA_OPTIONS="$JAVA_OPTIONS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Djava.rmi.server.hostname=INSTANCE-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
#   export JAVA_OPTIONS
#fi
[...]

Descomentad, sustituid INSTANCE por el nombre de la instancia, reiniciad la instancia y ya estará escuchando en el puerto TCP correspondiente. Para acceder a JMX desde jConsole, echad un ojo a este otro artículo: Como conectar de forma remota a jconsole.

by Alex at April 15, 2018 03:35 PM

April 12, 2018

# rm-rf.es

Oracle VM manager: tabla OVM_STATISTIC y su crecimiento descontrolado

En instalaciones de Oracle VM, la tabla que almacena las estadísticas de Oracle OVM Manager suele crecer de forma descontrolada. Si no se toma ninguna acción al respecto, termina con toda probabilidad (si no está bien monitorizado) provocando el llenado del filesystem /u01.

[[email protected] ovs]# ls -ltrh | grep -i stat
-rw-rw----. 1 oracle dba  13K Jul 11  2016 OVM_STATISTIC.frm
-rw-rw----. 1 oracle dba 8.4K Jul 11  2016 Mgr_StatisticManager.frm
-rw-rw----. 1 oracle dba 8.4K Jul 11  2016 Mgr_StatsIntervalAdjusterTask.frm
-rw-rw----. 1 oracle dba  96K Apr 11 02:07 Mgr_StatisticManager.ibd
-rw-rw----. 1 oracle dba  96K Apr 11 02:07 Mgr_StatsIntervalAdjusterTask.ibd
-rw-rw----. 1 oracle dba  27G Apr 11 02:27 OVM_STATISTIC.ibd

Si no tienes demasiado apego a estas estadísticas (como la mayoría, supongo), puedes tranquilamente truncar la tabla y esperar a que vuelva a llenarse (o crear un script vía crontab que lo haga periódicamente por ti). Este problema (¡o feature!) tiene lugar en instalaciones de OVMM bajo MySQL así que para truncar la tabla, accederemos a la shell de MySQL, base de datos ovs y ejecutaremos el truncado:

[[email protected] ovs]# mysql ovs -u ovs -p -S /u01/app/oracle/mysql/data/mysqld.sock
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3201
Server version: 5.6.27-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial)
 
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>
 
mysql> use ovs
Database changed
mysql>  truncate table OVM_STATISTIC;
Query OK, 0 rows affected (1.03 sec)
 
mysql>

Y solucionado.

by Alex at April 12, 2018 06:46 PM

April 11, 2018

# rm-rf.es

rsync: sincronizar únicamente estructura de directorios

Rsync permite copiar o sincronizar la estructura de directorios de un path sin necesidad de copiar ningún fichero de esos directorios.

En el caso de querer copiar de una ruta local a remoto la sintaxis del comando es la siguiente:

$ rsync -av -f"+ */" -f"- *" /ruta/local/ [email protected]:/ruta/remota/

A tener en cuenta los siguientes parámetros:

-a: modo archive ( -a, –archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v: modo verbose
-f"+ */" -f"- *": copiar todos los directorios y nada más.

Si fuera una copia local:

$ rsync -av -f"+ */" -f"- *" /ruta/origen/ /ruta/destino/

by Alex at April 11, 2018 03:15 PM

April 10, 2018

# rm-rf.es

Configurar Keepalived en modo Unicast en lugar de Multicast

Por defecto, Keepalived siempre funciona en modo multicast, es decir, un emisor (Master) envía un mensaje VRRP y son uno o varios los receptores (Backups/Slaves) que reciben el mismo. Como si fuera una conferencia, una comunicación de uno a varios.

En el caso de que nos encontremos en una infraestructura de red que no permita la comunicación Multicast, será necesario hacer el cambio a Unicast, de modo que la comunicación entre nodos sea de uno a uno y directa.

Importante indicar que Keepalived permite establecer el tráfico VRRP por Unicast a partir de la versión 1.2.8 (es vieja ya, así que no debería ser problema).

Ejemplo de comunicación VRRP por multicast:

15:45:20.455857 IP 192.168.33.183 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 50, prio 100, authtype simple, intvl 3s, length 28
15:45:23.460853 IP 192.168.33.183 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 50, prio 100, authtype simple, intvl 3s, length 28
15:45:26.465665 IP 192.168.33.183 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 50, prio 100, authtype simple, intvl 3s, length 28
15:45:29.460852 IP 192.168.33.183 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 50, prio 100, authtype simple, intvl 3s, length 28

Para pasar a Unicast, es necesario especificar en cada uno de los nodos de keepalived, quien es el PEER con el que se va a comunicar. En un entorno de dos nodos (Master/Backup), es sencillo, pues se comunicarán el único con el otro. Estableceremos la configuración dentro del bloque VRRP correspondiente

Nodo 1:

vrrp_instance foo {
   interface eth0
 
   state MASTER           
   virtual_router_id 10
   priority 50
 
   unicast_src_ip 10.0.0.200   
   unicast_peer {              
     10.0.0.100
   }
 
   virtual_ipaddress {    
     10.0.0.5 dev eth0
   }
 }

Nodo 2:

vrrp_instance foo {
   interface eth0
 
   state BACKUP
   virtual_router_id 10
   priority 100
 
   unicast_src_ip 10.0.0.100   
   unicast_peer {              
     10.0.0.200
   }
 
   virtual_ipaddress {    
     10.0.0.5 dev eth0
   }
 }

Como veis, es tan sencillo como especificar:

  • unicast_src_ip: IP/interfaz del nodo por la que se transimitirá el tráfico Unicast
  • unicast_peer: IP del Peer

Tras reiniciar Keepalived en ambos nodos, si analizamos el tráfico de red veremos que ya no hay tráfico Multicast para VRRP:

# tcpdump -vvv -n -i eth0 host 224.0.0.18

by Alex at April 10, 2018 08:03 PM

April 06, 2018

# rm-rf.es

Verificar datos de un CSR (Certificate Signing Request) con OpenSSL

Un CSR contiene información cifrada a partir de la cual se genera un certificado SSL. Entre esta información se encuentran datos como el common name del certificado (dominio), el nombre de la empresa que lo va a adquirir, su localización, dirección de correo electrónico, etc. Hay diversas formas de generarlo, por ejemplo como vimos en su día con OpenSSL o keytool.

Existen sitios web que permiten realizar la verificación de los datos del certificado online, básicamente para confirmar que los datos introducidos son los correctos y que el CSR está listo para enviar a la entidad certificadora. Evidentemente, cuanta menos información se manipule a través de Internet, y más de este tipo, mucho mejor. Para ello, lo lógico es no recurrir a estos sitios web y hacer la comprobación directamente en local con OpenSSL.

La sintaxis es sencilla:

$ openssl req -text -noout -verify -in server.csr

server.csr hace referencia al CSR a verificar. La salida del comando es similar a lo que veis a continuación:

$ openssl req -text -noout -verify -in server.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=ES, ST=Madrid, L=Madrid, O=Foo organization, OU=IT Department, CN=foo.bar.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ec:e4:e7:2a:c5:ce:0b:1f:6c:e3:cd:5d:7f:0c:
 [...]
                    dd:49:18:43:27:ae:2f:ab:70:68:eb:34:2d:3a:cf:
                    e4:97:21:ac:d0:77:53:82:bd:22:60:7c:56:7e:00:
                    fc:4b
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Key Identifier: 
                63:9F:D3:B6:81:65:EC:95:01:DE:E6:1B:78:DC:7F:02:CB:49:F7:F5
    Signature Algorithm: sha256WithRSAEncryption
         e6:b1:bd:4d:62:06:af:90:88:ec:99:37:ed:a8:b2:e9:9a:6d:
 [...]

by Alex at April 06, 2018 09:10 PM

April 05, 2018

# rm-rf.es

qemu-img: verificar la consistencia de una imagen qcow2″, “qed”, “vdi”

qemu-img es una utilidad de QEMU (emulador de procesadores basado en la traducción dinámica de binarios) que permite trabajar con imágenes de disco.

En caso de cualquier problema de corrupción con la imagen, esta utilidad permite analizar el estado y consistencia de la imagen y, en caso de problemas, intentar solucionarlos. Los formatos compatibles de imagen con esta utilidad son “qcow2“, “qed” y “vdi“.

El parámetro check all analizará el estado de la imagen:

   check [-f fmt] [-r [leaks | all]] filename
       Perform a consistency check on the disk image filename.
       If "-r" is specified, qemu-img tries to repair any inconsistencies
       found during the check. "-r leaks" repairs only cluster leaks,
       whereas "-r all" fixes all kinds of errors, with a higher risk of
       choosing the wrong fix or hiding corruption that has already
       occurred.
       Only the formats "qcow2", "qed" and "vdi" support consistency
       checks.
# qemu-img check all diskimage
No errors were found on the image.
Image end offset: 12582912

En caso de problemas, si utilizamos el parámetro -r, la heramienta intentará reparar los problemas encontrados:

# qemu-img check -r all diskimage
No errors were found on the image.
Image end offset: 12582912

by Alex at April 05, 2018 06:21 PM

Entre Dev Y Ops

Podcast 38: Ciberseguridad con Alex Soler, CTO de Ackcent

En este episodio entrevistamos a Alex Soler, CTO de Ackcent, para que nos ponga al día sobre seguridad.

April 05, 2018 06:15 PM

RooTeando

Tomando Un Café 27: Sustitutos para mi Rasspberry Pi 2

En este audio comento mi busqueda para sustituir mi Raspberry Pi 2, las causas y las opciones que he escogido.
Odroid HC1: http://bit.ly/2q8vaJi
Rock64: http://bit.ly/2GBYfmP

Música: Scott Holmes-Music for TV and Film Vol1-12 Back On The Road Again http://freemusicarchive.org

Canales de Telegram @UnDiaUnaAplicacion @UnPythonAldia @AprendePython
Correo [email protected]
Twitter https://twitter.com/Tomando_Un_Cafe

RSS
Anchor.fm  http://anchor.fm/s/18c0860/podcast/rss ...

April 05, 2018 12:35 AM

April 04, 2018

# rm-rf.es

Arranque automático de dominio e instancias de Glassfish en Solaris

A través de la utilidad administrativa de Glassfish asadmin, es posible configurar el arranque automático tanto del dominio como de las diferentes instancias que maneja. El resultado final es la integración total de Glassfish en Solaris Service Management Facility (SMF).

El comando de asadmin que utilizaremos es create-service, tanto para el dominio con las instancias (con diferentes parámetros). Hay que tener en cuenta que si Glassfish se ejecuta usando un usuario sin privilegios (lo habitual), no tendrá permisos para crear o modificar servicios de SMF. Os explicaré como hacerlo como root y después dar el cambiazo.

Arranque automático de dominio

Como root, ejecutaremos la utilidad asadmin, disponible en el directorio bin/ de nuestra instalación de Glassfish con el subcomando create-service:

[email protected]:/opt/oracle/glassfish3/bin# ./asadmin
Use "exit" to exit and "help" for online help.
asadmin> 
asadmin> 
asadmin> create-service
The Service was created successfully. Here are the details:
Name of the service:application/GlassFish/domain1
Type of the service:Domain
Configuration location of the service:/opt/oracle/glassfish3/glassfish/domains
Manifest file location on the system:/var/svc/manifest/application/GlassFish/domain1_opt_oracle_glassfish3_glassfish_domains/Domain-service-smf.xml.
You have created the service but you need to start it yourself.  Here are the most typical Solaris commands of interest:

* /usr/bin/svcs  -a | grep domain1  // status
* /usr/sbin/svcadm enable domain1 // start
* /usr/sbin/svcadm disable domain1 // stop
* /usr/sbin/svccfg delete domain1 // uninstall
For your convenience this message has also been saved to this file: /opt/oracle/glassfish3/glassfish/domains/domain1/PlatformServices.log
Command create-service executed successfully.

Con esto ya tenemos el servicio creado, pero se ejecuta como root. El siguiente comando modifica el servicio para que corra con nuestro usuario dedicado “foo”:

[email protected]:/opt/oracle/glassfish3/bin# svccfg -s svc:/application/GlassFish/domain1:default setprop start/user = astring: foo
[email protected]:/opt/oracle/glassfish3/bin# svcadm refresh  svc:/application/GlassFish/domain1:default

Una vez realizado el cambio, ya se puede arrancar el servicio:

[email protected]:/opt/oracle/glassfish3/bin# svcadm disable svc:/application/GlassFish/domain1:default
[email protected]:/opt/oracle/glassfish3/bin# svcadm enable svc:/application/GlassFish/domain1:default

Arranque automático de instancias

El proceso es el mismo que para el dominio, pero en este caso pasando a create-service el nombre de la instancia. Ejemplo para la instancia glassfish01:

asadmin> create-service glassfish01 
The Service was created successfully. Here are the details:
Name of the service:application/GlassFish/glassfish01
Type of the service:Instance
Configuration location of the service:/opt/oracle/glassfish3/glassfish/nodes/localhost-domain1
Manifest file location on the system:/var/svc/manifest/application/GlassFish/glassfish01_opt_oracle_glassfish3_glassfish_nodes_localhost-domain1/Domain-service-smf.xml.
You have created the service but you need to start it yourself.  Here are the most typical Solaris commands of interest:

* /usr/bin/svcs  -a | grep glassfish01  // status
* /usr/sbin/svcadm enable glassfish01 // start
* /usr/sbin/svcadm disable glassfish01 // stop
* /usr/sbin/svccfg delete glassfish01 // uninstall
For your convenience this message has also been saved to this file: /opt/oracle/glassfish3/glassfish/nodes/localhost-domain1/glassfish01/PlatformServices.log
Command create-service executed successfully.

Y lo mismo, modificamos el usuario de ejecución para que no sea root:

svccfg -s svc:/application/GlassFish/glassfish01:default setprop start/user = astring: foo
svcadm refresh  svc:/application/GlassFish/glassfish01
svcadm disable svc:/application/GlassFish/glassfish01
svcadm enable svc:/application/GlassFish/glassfish01

by Alex at April 04, 2018 06:07 PM

April 03, 2018

www.rootzilopochtli.com

#MeetArmy – Cómo monitorear recursos sin morir en el intento

You know, there are 20 million guys out of work in Manhattan alone just waiting for my job and yours too | Tu sabes, hay 20 millones de hombres sin trabajo en Manhattan solo esperando mi trabajo y el tuyo también – Detective Robert Thorn (Soylent Green – 1973)

El pasado 12  y 28 de Marzo tuve la fortuna de poder presentar la plática Cómo monitorear recursos sin morir en el intento durante el #MeetupArmy y el Meetup de GDG UNAM. Muchas gracias a ambos por la oportunidad!!

Durante la plática, les conté algunas experiencias en cuanto al monitoreo de recursos y las herramientas más comúnes y básicas para estas actividades.

También les presenté el video basado en la película Soylent Green:

Ver en YouTube

Les dejo la presentación aquí.

Espero les sirva…

by Alex Callejas at April 03, 2018 05:50 PM

April 02, 2018

Ruben J Garcia

Cucumber REST Steps – BDD for your REST API

I like using Cucumber to do BDD Testing. Even when I have to test a REST API I use it, so I’ve created a library to do it: Cucumber REST Steps

Cucumber REST Steps in action

First of all, you need to add it to your pom.xml

<dependency>
  <groupId>es.rubenjgarcia</groupId>
  <artifactId>cucumber-rest-steps</artifactId>
  <version>1.0.0</version>
  <scope>test</scope>
</dependency>

Now, let’s create a Test Case class to add the steps

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(glue = {"es.rubenjgarcia.cucumber.rest.steps"}, features = "classpath:features")
public class CucumberTestCase {

}

You are ready to use the steps. Let’s see a couple of examples

Scenario: Empty response
  Given I call GET "http://localhost:8080"
  Then The response status should be 200
  And The response is empty

Easy, isn’t it?

Let’s see how you can verify the response

Scenario: With data
  Given I call POST "http://localhost:8080/withData" with data:
  """
    test: "test"
  """
  Then The response status should be 200
  And The response should be:
  """
    foo: "bar"
  """
  And The response should contain "foo"
  And The response should contain "foo" with value "bar"
  And The response should not contain "foo" with value "wee"
  And The response should not contain "bar"

If you want to verify complex objects, you can

Scenario: With array
  Given I call GET "http://localhost:8080/withArray"
  Then The response status should be 200
  And The response should contain array with size 3
  And The response should contain 3 entities
  And The response should contain at least 2 entity
  And The response should contain at most 4 entities
  And The response should contain more than 2 entities
  And The response should contain less than 4 entities
  And The response should be array:
  """
    - foo: "bar"
    - foo: 3
    - foos:
      - bar
      - wee
  """
  And Response entity "[0]" should contain "foo"
  And Response entity "[0]" should not contain "bar"
  And Response entity "[0]" should contain "foo" with value "bar"
  And Response entity "[0]" should not contain "foo" with value "wee"
  And Response entity "[2].foos" should contain array:
  """
    - bar
    - wee
  """
  And Response entity "[2].foos" should contain 2 entities
  And Response entity "[2].foos" should contain at least 1 entity
  And Response entity "[2].foos" should contain at most 3 entities
  And Response entity "[2].foos" should contain more than 1 entities
  And Response entity "[2].foos" should contain less than 3 entities

Find out more steps and examples in the official repository

The post Cucumber REST Steps – BDD for your REST API appeared first on Ruben J Garcia.

by Ruben Garcia at April 02, 2018 10:27 AM

March 30, 2018

Entre Dev Y Ops

Colaboración 1: Open Source Leadership Summit por José Miguel Parrella (@bureado)

Estrenamos nuevo formato, colaboraciones, y empezamos con una de José Miguel Parrella (@bureado) en la que nos explica el evento Open Source Leadership Summit 2018 (OSLS).

March 30, 2018 06:15 PM

www.sysadmin.org.mx

Reducción de latencia en arquitecturas híbridas con Amazon ElastiCache

El articulo es un aporte al AWS Database Blog y explica como utilizar Amazon ElastiCache para reducir la latencia en arquitecturas híbridas. Está en ingles y lo pueden leer en la siguiente dirección https://aws.amazon.com/blogs/database/latency-reduction-of-hybrid-architectures-with-amazon-elasticache/

tags: 

by angel at March 30, 2018 01:39 AM

March 28, 2018

# rm-rf.es

Truco Gmail: encontrar adjuntos de mayor tamaño

El espacio que ofrece Gmail suele ser suficiente en la mayoría de los casos, y rara vez se requiere hacer limpieza de correos para liberar espacio. El problema viene cuando comienzas a utilizar otros servicios de Google, como Google Drive, entonces la cosa puede comenzar a complicarse.

Una forma rápida y eficiente de liberar espacio en Gmail es localizar los correos con adjuntos de mayor tamaño, pues los correos sin adjuntos no suelen ocupar demasiado. Gmail, al igual que Google, tiene bastantes opciones de búsqueda avanzadas, entre ellas se encuentra la de localizar los correos con un tamaño superior a lo indicado.

size:tamaño

El tamaño se especifica en bytes, así que para encontrar correos con tamaño superior a 5 megas:

size:5000000

Y solucionado, el resultado será los correos de más de 5MB.

gmail_attachments

by Alex at March 28, 2018 05:10 PM

March 27, 2018

RooTeando

Tomando Un Café 26: Diferencias entre un programador y un formador.

En este audio explico las diferencias, y una semejanza, entre un programador y un formador, mediante un lista de 5 puntos.
Semejanza.
Un buen programador requiere tiempo y esfuerzo, un buen formador requiere tiempo y esfuerzo.

La lista con las diferencias.
1. Un programador desarrolla código, un formador explica como desarrollar código.
2. Un programador desarrolla código para otros, un formador debe conseguir que otros desarrollen código.
3. La calidad de un programador se mide ...

March 27, 2018 01:51 AM

March 24, 2018

# rm-rf.es

Importar un certificado x509 (.crt .cer .der) y su clave privada en un keystore

Para importar un certificado x.509 (.crt .cer .der) y su clave privada en un keystore de java, previamente es necesario convertir el certificado y su clave privada en un archivo PKCS12. Una vez realizado, keytool de java ya nos permite importar el PKCS12 en un keystore.

Convertir clave privada y certificado a formato PKCS12

Utilizaremos openssl para hacer la conversión:

$ openssl pkcs12 -export -out foo.pfx -inkey foo.key -in foo.crt -name foo
  • foo.pfx: fichero PKCS12 de destino
  • foo.key: clave privada en formato X509
  • foo.crt: certificado en formato X509
  • foo: alias del certificado

Importar archivo PKCS12 en un keystore

Una vez que tenemos el archivo pfx, ya podemos utilizar la herramienta keytool para importar el certificado en un keystore:

$ keytool -importkeystore -deststorepass password -destkeypass password \
  -destkeystore keystore.jks -srckeystore /tmp/foo.pfx \
  -srcstoretype PKCS12 -srcstorepass password -alias foo
  • deststorepass: contraseña del keystore de destino
  • destkeypass: contraseña a asignar a la private key en el keystore
  • destkeystore: ruta al keystore
  • srckeystore: ruta al archivo PKCS12
  • srcstorepass: contraseña del archivo PKCS12 (especificada en el paso anterior)
  • alias: alias del certificado (especificado en el paso anterior)

by Alex at March 24, 2018 10:22 AM

March 23, 2018

UnLugarEnElMundo

Bootstrap 4. Primeros pasos

icono de php Bootstrap es una colección de elementos, plantillas y componentes HTML, CSS y Javascript para crear rápidamente páginas web con un aspecto moderno y “responsivo” (¡menudo palabro!) al tamaño de pantalla de cualquier dispositivo. Su versión 4 se liberó hace un par de meses y aporta algunos cambios significativos como, por ejemplo, la inclusión de Popper como librería javascript para “tooltips” y otros elementos emergentes y la eliminación de las tipografías Glyphicons para introducir símbolos y pictogramas.

Podemos trabajar con Bootstrap bien descargandonosla en nuestro propio servidor web, o bien usando sus librerías directamente desde los CDN que nos ofrecen. Aquí usaremos este segundo método por sus evidentes ventajas de cara a montar una primera plantilla para pruebas. Necesitamos incluir simplemente el siguiente tag en :

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />

Si vamos a usar los elementos javascript necesitamos incluir también las librerías correspondientes y, ademas, las de jquery y popper en nuestro proyecto las cuales también tienen disponible la posibilidad de enlazarlas directamente sin necesidad de descargarlas en local:

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

IMPORTANTE: los enlaces anteriores corresponden a las versiones estables más recientes en el momento de escribir esto. No suelen eliminar las versiones anteriores, pero conviene que te cerciores si llegas a este texto en un futuro lejano.

Con todo esto, la plantilla mínima de HTML para empezar a trabajar (incluyendo los enlaces correspondientes a las librerías javascript comentados) sería esta:

<!DOCTYPE html>
<html lang="es">
    <head>
    	<meta charset="utf-8" />
    	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    	<title>Plantilla Bootstrap</title>
  	</head>
  	<body>
		<h1>Plantilla Bootstrap</h1>

    
		<!-- Javascript opcional -->
		<!-- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    	     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
    	     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> -->
  	</body>
</html>

Sosa, verdad? Claro, aún no hemos empezado a trabajar… Si quieres ver algo más impactante, bootstrap dispone de plantillas con algo mas de chicha para tus diseños. Las tienes disponibles en este enlace. Si prefieres empezar desde cero, tienes disponible un montón de La documentación bastante fácil de seguir que incluye multitud de ejemplos prácticos para empezar a trabajar desde el primer minuto.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Bootstrap 4. Primeros pasos || Hospedado en un Cloud VPS de Gigas.

by Josemaría at March 23, 2018 12:29 PM

March 22, 2018

RooTeando

Tomando Un Café 25: Entornos virtuales y Virtualenvwrapper

En este audio explico la importancia de utilizar entornos virtuales de desarrollo para tus proyecto, como utilizar Virtualenvwrapper para gestionar estos entornos.

Nuevo proyecto, podcast @RadioDev con Daniel Primo y Joseda. En Ivoox RadioDev.

Musica: Dexter Britain-Dexter Britain-The Time To Run(Finale)http://dexterbritain.bandcamp.com

Canales de Telegram @UnDiaUnaAplicacion @UnPythonAldia @AprendePython
Correo [email protected]
Twitter https://twitter.com/Tomando_Un_Cafe

RSS
Anchor.fm  http://anchor.fm/s/18c0860/podcast/rss
Blog ...

March 22, 2018 02:09 AM

March 20, 2018

# rm-rf.es

Listar cifrados y protocolos SSL/TLS disponibles con nmap

Nmap, a través del script ssl-enum-ciphers, permite escanear un host y listar todos los algoritmos de cifrados y protocolos SSL/TLS disponibles.

El script inicia de forma secuencial conexiones SSLv3 y TLS sobre el host, utilizando cada vez un cifrado distinto con el fin de averiguar si lo soporta o no. Al final, muestra el resultado en un informe detallado por salida estándar. A continuación podéis ver un ejemplo de lo que muestra. Para más detalle visitad la página del script en el sitio web de NMAP.

[~] # nmap --script ssl-enum-ciphers -p 443 www.foo.com

Starting Nmap 7.60 ( https://nmap.org ) at 2018-03-08 15:11 CET
Stats: 0:00:44 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 60.00% done; ETC: 15:14 (0:01:09 remaining)
Nmap scan report for www.foo.com (10.0.0.4)
Host is up (0.17s latency).
rDNS record for 10.0.0.4: mail.foo.com

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   SSLv3: 
|     ciphers: 
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|     warnings: 
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       CBC-mode cipher in SSLv3 (CVE-2014-3566)
|       Ciphersuite uses MD5 for message integrity
|   TLSv1.0: 
|     ciphers: 
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|     warnings: 
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|   TLSv1.1: 
|     ciphers: 
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|     warnings: 
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|   TLSv1.2: 
|     ciphers: 
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|     warnings: 
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|_  least strength: C

Nmap done: 1 IP address (1 host up) scanned in 138.70 seconds

by Alex at March 20, 2018 05:50 PM

March 15, 2018

Entre Dev Y Ops

Podcast 37: Conviviendo con el legacy

En el podcast de hoy vamos a debatir y compartir nuestras opiniones acerca de las tecnologías legacy.

March 15, 2018 11:30 PM

March 14, 2018

RooTeando

Tomando Un Café 24: Ejemplos, ejercicios y prácticas

En este audio explico la importancia de los ejemplos,ejercicios y prácticas  en el proceso de aprendizaje en una formación sobre programación.

Música: Dingonek Street Band:06 Granfhater Domovoi http://freemusicarchive.org/

Canales de Telegram @UnDiaUnaAplicacion @UnPythonAldia @AprendePython
Correo [email protected]
Twitter https://twitter.com/Tomando_Un_Cafe

RSS
Anchor.fm  http://anchor.fm/s/18c0860/podcast/rss
Blog(post y podcast)  https://rooteando.com/feed/
Whooshkaa  https://rss.whooshkaa.com ...

March 14, 2018 02:09 AM

March 11, 2018

UnLugarEnElMundo

Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios

icono de php Ya yenemos Laravel 5.6 instalado en alguno de los dos entornos que hemos visto antes. ¿Qué sigue? Lo primero, entender un poquito la estructura de directorios que nos ha creado composer. Sólo lo imprescindible. El resto lo iremos viendo a medida que avanzamos.

[email protected] /var/www/html/prueba $ ls -la
total 236
drwxr-xr-x 12 root www-data   4096 mar  9 19:31 .
drwxr-xr-x  3 root www-data   4096 mar  9 18:29 ..
drwxr-xrwx  6 root www-data   4096 ene  3 17:52 app
-rwxr-xrwx  1 root www-data   1686 ene  3 17:52 artisan
drwxr-xrwx  3 root www-data   4096 ene  3 17:52 bootstrap
-rw-r--rw-  1 root www-data   1413 ene  3 17:52 composer.json
-rw-r--rw-  1 root www-data 143565 mar  8 07:37 composer.lock
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 config
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 database
-rw-r--r--  1 root www-data    612 mar  9 19:31 .env
-rw-r--r--  1 root www-data    565 ene  3 17:52 .env.example
-rw-r--r--  1 root www-data    111 ene  3 17:52 .gitattributes
-rw-r--r--  1 root www-data    146 ene  3 17:52 .gitignore
-rw-r--rw-  1 root www-data   1125 ene  3 17:52 package.json
-rw-r--rw-  1 root www-data   1040 ene  3 17:52 phpunit.xml
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 public
-rw-r--rw-  1 root www-data   3550 ene  3 17:52 readme.md
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 resources
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 routes
-rw-r--rw-  1 root www-data    563 ene  3 17:52 server.php
drwxrwxrwx  5 root www-data   4096 ene  3 17:52 storage
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 tests
drwxr-xrwx 36 root www-data   4096 mar  8 07:38 vendor
-rw-r--rw-  1 root www-data    549 ene  3 17:52 webpack.mix.js

El directorio public ejerce de DocumentRoot. Allí encontraremos el index.php que da entrada a nuestra aplicación web así como las hojas de estilos, etc. El fichero .env que vemos aquí arriba en el directorio raiz de nuestra aplicación es el fichero de configuración principal. De hecho, puesto que vamos a empezar a trabajar con bases de datos en este momento podemos aprovechar para editar las siguientes directivas:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secreto

Importante: aunque usemos mariadb la directiva DB_CONNECTION debe de ser mysql porque Laravel no entiende otra y, a fin de cuentas, ambas son compatibles a nivel binario. Para que Laravel sea capaz de hacer uso de esa base de datos debemos de crearla. A ella y al usuario que le hemos dicho que va a usar para manejarla. Entramos en nuestro gestor (mysql o mariadb) y ejecutamos lo siguiente:

CREATE DATABASE laravel;
CREATE USER [email protected] IDENTIFIED BY 'secreto';
GRANT ALL ON laravel.* TO [email protected];

Vamos ahora a crear nuestro sistema de autenticación. Laravel viene ya con un módulo llamado User.php que reside en el directorio app. Para generar el resto de lo que necesitamos ejecutamos lo siguiente:

php artisan make:auth
php artisan migrate

La primera línea crea el código y rutas necesario para la gestión de usuarios. En particular, creará o modificará los siguientes ficheros:

routes/web.php
resources/views/auth/login.blade.php
resources/views/auth/register.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php

La segunda instrucción crea la estructura de tablas necesaria en la base de datos que hemos configurado previamente. Si ahora volvemos a cargar la web de nuestro aplicación veremos que en la esquina superior derecha tenemos dos nuevos enlaces correspondientes a las funcionalidades de Login y Registro:

Laravel 5.6 con la funcionalidad de login y registro

Las pantallas de registro y login por defecto son estas:

Pantalla de registro en Laravel 5.6
Pantalla de login en Laravel 5.6

Y una vez hecho login vemos que en la barra de menú se nos identifica con nuestro nombre de usuario y tenemos la posibilidad de cerrar sesión:

Logout en Laravel 5.6

Si le echamos un vistazo a “las tripas” vemos que nos ha creado dos tablas una de las cuales, la de usuarios, es la que guardará la información relativa a los registros de usuarios.
Tablas creadas por Laravel 5.6 para la autenticación de usuarios

Además, tal y como está mandado, vemos que no almacena las contraseñas en claro sino un hash de las mismas:

hash de las passwords en Laravel 5.6

La castellanización de los recursos es tan sencilla como editar alguno de los ficheros php que hemos indicado anteriormente. Por ejemplo, el fichero login.blade.php es el que contiene la ventana de login y register.blade.php la de registro. Con muy poco esfuerzo tendremos las ventanas anteriores en perfecto castellano. Pero eso ya os lo dejo a vosotros 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios || Hospedado en un Cloud VPS de Gigas.

by Josemaría at March 11, 2018 12:21 PM

March 10, 2018

UnLugarEnElMundo

Instalando Laravel en Windows 7 con XAMPP

icono de php Hace unos minutos hemos publicado la forma de instalar Laravel en una Debian con Apache. Vamos ahora a ver como se hace en un windows 7 con xampp. Imagino que hacerlo en cualquier otra versión de windows más moderna será igual de fácil.

Partimos entonces de ese windows instalado, funcionando, y con xampp también instalado y funcional. Lo primero que tenemos que instalarnos es composer, el gestor de paquetes PHP que utiliza Laravel para crear la estructura que necesistan sus proyectos. Para ello nos descargamos el instalador para windows y ya sabéis: siguiente-siguiente-siguiente-aceptar 😀

Y ya está. Ya tenemos todo lo que necesitamos. Vamos ahora a crear la estructura para nuestra primera aplicación con Laravel. La versión del framework en el momento de escribir esto es la 5.6. Suponemos que se llamará prueba y que la instalaremos en el directorio web por defecto que usa xampp. Nos vamos a la línea de comandos y, suponiendo que trabajamos sobre el disco C:, ejecutamos lo siguiente:

cd c:\xampp\htdocs
composer create-project laravel/laravel prueba --prefer-dist

En segundo lugar tenemos que crear el virtual host necesario para esta aplicación. Xampp usa para ello el archivo httpd-vhosts.conf que reside en el directorio c:\xampp\apache\conf\extra. Editamos este archivo y añadimos lo siguiente:

<VirtualHost *:80>
  DocumentRoot "C:\xampp\htdocs\prueba\public"
  DirectoryIndex index.php
  <Directory "C:\xampp\htdocs\prueba">
        AllowOverride All
  </Directory>
  ErrorLog "logs/pruebalaravel-error.log"
  CustomLog "logs/pruebalaravel-access.log" combined
</VirtualHost>

Y listo. Reiniciamos apache y abrimos un exporador. Si escribimos http://localhost veremos la página de bienvenida de Laravel:

Laravel 5.6 en windows con Xampp

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Instalando Laravel en Windows 7 con XAMPP || Hospedado en un Cloud VPS de Gigas.

by Josemaría at March 10, 2018 06:10 PM

Instalando Laravel en Debian 9

icono de php Repasando el “histórico” del blog que a menudo me sirve como memoria veo que he recurrido en los últimos 12 años a dos frameworks para php: cake y codeigniter. Ahora que me toca volver a decidirme por alguno y teniendo en cuenta que tengo totalmente olvidado a ambos he preguntado por ahí y todo el mundo parece estar de acuerdo en que lo mejor del momento es Laravel. La versión actual de Laravel es la 5.6. Vamos, pues, a por el tercero.

La instalación de Laravel es bien sencilla. En esta entrada tocaremos un entorno “clásico” en este blog: una Debian sin entorno gráfico. En una entrada posterior tocaremos la instalación en un windows 7 con Xampp que en este caso me resulta también imprescindible. Vamos a ello.

Partimos de una Debian 9.3.0 (la versión estable en el momento de escribir esto) recién instalada y sin ningún tipo de personalización. Lo primero que necesitamos instalar son ciertos paquetes de utilidades y el entorno web necesario para trabajar con laravel: apache2, php y mysql-server:

apt install curl unzip git
apt install apache2 libapache2-mod-php
apt install mysql-server
apt install php-mysql php-xml php-mbstring

En segundo lugar tenemos que instalar composer, un gestor de paquetes php que nos servirá para instalar el entorno necesario para trabajar con Laravel. Así:

cd /usr/local/bin
curl -sS https://getcomposer.org/installer | php

Esto bajará un archivo llamado composer.phar y lo depositará en el directorio /usr/local/bin. Y ya hemos acabado. ¿Y he leído por ahí que alguien decía que era difícil? ¡Tendrían que haber instalado alguna red Novell en su vida! 😀

Como decía, ya tenemos todo lo que necesitamos para crear nuestra primera aplicación con Laravel. Empezamos. Nuestro primer proyecto se llamará prueba y estará en el directorio /var/www/html/prueba. Lo primero que tenemos que hacer es hacer que composer nos cree toda la estructura necesaria:

cd /var/www/html
composer.phar create-project laravel/laravel prueba --prefer-dist

Asignamos los permisos adecuados en la estructura que se ha creado:

chgrp -R www-data /var/www/html/your-project
chmod -R 775 /var/www/html/your-project/storage

Creamos un virtual host adecuado en el directorio /etc/apache2/sites-availables. En mi caso le he puesto laravel.conf y el contenido creado es este:

<VirtualHost *:80>
    DocumentRoot /var/www/html/prueba/public
    DirectoryIndex index.php
    <Directory /var/www/html/prueba>
        AllowOverride All
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Por último, deshabilitamos el virtual host que apache crea por defecto, habilitamos el nuestro, habilitamos el modulo rewrite de apache y reiniciamos el servidor web:

a2dissite 000-default.conf
a2ensite laravel.conf
a2enmod rewrite
systemctl restart apache2

Si ahora apuntamos con un navegador a la ip de nuestra máquina debian veremos la página de inicio de Laravel:

Laravel 5.6 en Debian 9.4

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Instalando Laravel en Debian 9 || Hospedado en un Cloud VPS de Gigas.

by Josemaría at March 10, 2018 05:52 PM

March 06, 2018

enavas.blogspot.com.es

Crear un pendrive de instalación de Proxmox

En lugar de quemar la ISO de Proxmox en un CD, podemos grabarla en un pendrive para instalar desde allí. La forma más sencilla de hacerlo, sin ningún software específico es usar el comando dd. Por ejemplo:
# dd if=proxmox-ve_5.1-3.iso of=/dev/sdf bs=1
618698752+0 registros leídos
618698752+0 registros escritos
618698752 bytes (619 MB) copiados, 529,231 s, 1,2 MB/s
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 06, 2018 12:37 PM

March 05, 2018

enavas.blogspot.com.es

FOG Project: Modificar el perfil /etc/apparmor.d/lxc/lxc-default-cgns para que funcione el servidor NFS en un contenedor Proxmox

Cuando instalamos el servidor FOG en un contenedor LXC, el servicio NFS no funcionará porque apparmor se encuentra activado y éste no permite NFS.

Si iniciáis un equipo para que arranque vía PXE, veréis un error como el siguiente:


Y si tratáis de hacer un showmount desde otra máquina para ver los recursos compartidos por el servidor fogserver mediante NFS, os mostrará el siguiente error:
# showmount -e fogserver
clnt_create: RPC: Program not registered
Como ya vimos en un post anterior, una solución es desactivar apparmor. Otra es crear un perfil o modificar uno existente para permitir NFS. En nuestro caso, vamos a editar el fichero /etc/apparmor.d/lxc/lxc-default-cgns:

/etc/apparmor.d/lxc/lxc-default-cgns
# Do not load this file.  Rather, load /etc/apparmor.d/lxc-containers, which
# will source all profiles under /etc/apparmor.d/lxc

profile lxc-container-default-cgns flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/lxc/container-base>

# the container may never be allowed to mount devpts. If it does, it
# will remount the host's devpts. We could allow it to do it with
# the newinstance option (but, right now, we don't).
deny mount fstype=devpts,
mount fstype=cgroup -> /sys/fs/cgroup/**,
}
Y le vamos a añadir las tres líneas que he resaltado en color amarillo:

/etc/apparmor.d/lxc/lxc-default-cgns
# Do not load this file.  Rather, load /etc/apparmor.d/lxc-containers, which
# will source all profiles under /etc/apparmor.d/lxc

profile lxc-container-default-cgns flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/lxc/container-base>

# the container may never be allowed to mount devpts. If it does, it
# will remount the host's devpts. We could allow it to do it with
# the newinstance option (but, right now, we don't).
deny mount fstype=devpts,
mount fstype=cgroup -> /sys/fs/cgroup/**,
mount fstype=nfs*,
mount options=(rw, bind, ro),
mount fstype=rpc_pipefs,
}
Una vez modificado, reiniciamos apparmor:
# systemctl restart apparmor
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 05, 2018 12:42 PM

FOG Project: Deshabilitar apparmor para que funcione el servidor NFS en un contenedor Proxmox

Cuando instalamos el servidor FOG en un contenedor LXC, el servicio NFS no funcionará porque apparmor se encuentra activado y éste no permite NFS.

Si iniciáis un equipo para que arranque vía PXE, veréis un error como el siguiente:


Y si tratáis de hacer un showmount desde otra máquina para ver los recursos compartidos por el servidor fogserver mediante NFS, os mostrará el siguiente error:
# showmount -e fogserver
clnt_create: RPC: Program not registered

Para solucionar el problema podemos optar por:
  • Desactivar apparmor.
  • Crear un perfil apparmor que permita NFS.
En este post, vamos a ver la primera solución, que consiste en desactivar apparmor en el contenedor donde hemos instalado FOG server.

Para empezar, tenemos que decir que la configuración de los contenedores en Proxmox se encuentra en el directorio /etc/pve/lxc/ del servidor proxmox, almacenada en ficheros del tipo CTID.conf.

Así que paramos el servidor FOG.

Como el contenedor donde he instalado mi servidor FOG tiene el CTID 105, edito el fichero /etc/pve/lxc/100.conf:
arch: amd64
cores: 1
hostname: fogserver
memory: 1024
net0: name=eth0,bridge=vmbr0,hwaddr=AA:C7:AB:97:CA:1C,ip=dhcp,type=veth
onboot= 1
ostype: debian
rootfs: local:105/vm-105-disk-1.raw,size=100G
swap: 1024
Y le añado la línea resaltada:
arch: amd64
cores: 1
hostname: fogserver
memory: 1024
net0: name=eth0,bridge=vmbr0,hwaddr=AA:C7:AB:97:CA:1C,ip=dhcp,type=veth
onboot= 1
ostype: debian
rootfs: local:105/vm-105-disk-1.raw,size=100G
swap: 1024
lxc.aa_profile: unconfined
Una vez modificado el fichero de configuración, volvemos a arrancar el servidor FOG.
Y listo.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 05, 2018 11:44 AM

FOG Project: Instalar y configurar dnsmasq como ProxyDHCP

Si echáis un vistazo al post en el que os mostraba como instalar FOG Server en un contenedor Proxmox, veréis que elegí no utilizar FOG server como servidor DHCP:
Would you like to use the FOG server for DHCP service? [y/N]
Ésto es lógico porque en mi red, ya tengo dos servidores DHCP funcionando en modo failover.

Como FOG server, necesita un servidor DHCP, he instalado y configurado dnsmasq en el servidor FOG para que actúe como Proxy DHCP. Ésto es algo sencillo:

Instalar dnsmasq

Como dnsmasq se encuentra en los repositorios de Debian, instalarlo es trivial:
# apt-get update && apt-get -y install dnsmasq
Una vez instalado, lo configuraremos.

Configurar dnsmasq

Al instalar dnsmasq, se crea un fichero de configuración por defecto /etc/dnsmasq.conf que sirve como documentación porque toda la configuración viene comentada. No obstante, en lugar de utilizar el fichero de configuración principal, crearemos un fichero de configuración pxe.conf en el directorio /etc/dnsmasq.d/ con el siguiente contenido:

/etc/dnsmasq.d/pxe.conf
# Don't function as a DNS server:
# port=0

# Log lots of extra information about DHCP transactions.
log-dhcp

# Dnsmasq can also function as a TFTP server. You may uninstall
# tftpd-hpa if you like, and uncomment the next line:
# enable-tftp

# Set the root directory for files available via FTP.
tftp-root=/tftpboot

# The boot filename, Server name, PXE Server IP Address
# dhcp-boot=pxelinux.0,fogserver,172.19.144.68
dhcp-boot=undionly.kpxe,,172.19.144.68

# !!! Insert the PXE server IP address above !!!

# rootpath option, for NFS
#dhcp-option=17,/images

# kill multicast
#dhcp-option=vendor:PXEClient,6,2b

# Disable re-use of the DHCP servername and filename fields as extra
# option space. That's to avoid confusing some old or broken DHCP clients.
dhcp-no-override

# PXE menu. The first part is the text displayed to the user. The second is the timeout, in seconds.
# pxe-prompt="Press F8 for boot menu", 3

# The known types are x86PC, PC98, IA64_EFI, Alpha, Arc_x86,
# Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI
# This option is first and will be the default if there is no input from the user.
pxe-service=X86PC, "Boot from network", undionly

# A boot service type of 0 is special, and will abort the
# net boot procedure and continue booting from local media.
#pxe-service=X86PC, "Boot from local hard disk", 0

# If an integer boot service type, rather than a basename is given, then the
# PXE client will search for a suitable boot service for that type on the
# network. This search may be done by multicast or broadcast, or direct to a
# server if its IP address is provided.
# pxe-service=x86PC, "Install windows from RIS server", 1

# This range(s) is for the public interface, where dnsmasq functions
# as a proxy DHCP server providing boot information but no IP leases.
# Any ip in the subnet will do, so you may just put your server NIC ip here.
# Since dnsmasq is not providing true DHCP services, you do not want it
# handing out IP addresses. Just put your servers IP address for the interface
# that is connected to the network on which the FOG clients exist.
# If this setting is incorrect, the dnsmasq may not start, rendering
# your proxyDHCP ineffective.
dhcp-range=172.19.144.2,proxy,255.255.254.0

# !!! Insert the DHCP server IP address, and subnet mask above !!!

# This range(s) is for the private network on 2-NIC servers,
# where dnsmasq functions as a normal DHCP server, providing IP leases.
# dhcp-range=192.168.0.20,192.168.0.250,8h

# For static client IPs, and only for the private subnets,
# you may put entries like this:
# dhcp-host=00:20:e0:3b:13:af,10.160.31.111,client111,infinite
Como los comentarios del fichero de configuración son bastante descriptivos, tan sólo os voy a comentar las dos líneas de configuración que he resaltado en color amarillo y que considero fundamentales:
dhcp-boot=undionly.kpxe,,172.19.144.68
En esta línea estamos indicando cuál es el fichero de arranque que se debe usar para iniciar el cliente al arrancar mediante pxe y la IP del servidor fog. Si utilizáis este fichero de configuración, tendréis que cambiar la IP por la de vuestro servidor FOG.
dhcp-range=172.19.144.2,proxy,255.255.254.0
En esta línea estamos indicando la IP del servidor DHCP de nuestra red, que el servidor dnsmasq actúe como proxy y la máscara de red que usamos.  Si utilizáis este fichero de configuración, tendréis que cambiar la IP por la de vuestro servidor DHCP y la máscara, por la que uséis en vuestra red.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 05, 2018 09:48 AM

FOG Project: Cambiar la password del usuario fog

Cuando terminamos de configurar nuestro servidor FOG, el asistente de configuración nos muestra un mensaje que nos dice cómo podemos acceder a la interfaz de gestión desde el navegador:
   You can now login to the FOG Management Portal using
the information listed below. The login information
is only if this is the first install.

This can be done by opening a web browser and going to:

http://172.19.144.68/fog/management

Default User Information
Username: fog
Password: password
Para cambiar la password por defecto del usuario fog, abrimos el navegador, introducimos la URL, nos logueamos con los datos por defecto y accedemos al apartado "User management". A continuación hacemos clic sobre la opción "List all users" y nos aparecerá la lista de usuarios. Si acabamos de instalar fog, no habrá nada más que uno. 


Así que hacemos clic sobre el usuario fog y se nos mostrarán opciones de edición del usuario. Hacemos clic sobre "Change password" y podremos cambiar su contraseña:


Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 05, 2018 08:43 AM

Gestionar el fichero /etc/escuela2.0 para clasificar destinatarios de módulos puppet

Como ya sabéis, en los centros educativos, los administradores utilizamos el fichero /etc/escuela2.0 para definir variables que nos permitan distinguir equipos como destinatarios de nuestros módulos puppet. 

Este fichero es leído por un pequeño script ruby (leefichero.rb) que convierte los valores definidos en el fichero en variables facter. De esta manera, tan sólo tenemos que añadir nuevas variables al fichero para poder distinguir equipos.

En este post, tan sólo os voy a mostrar las variables que yo defino en el fichero /etc/escuela2.0 para gestionar los equipos de mi centro mediante puppet. 

Para empezar, yo quitaría la variable "use", que se utiliza para definir qué sistema operativo tiene el equipo (Por ejemplo: use=ubuntu). No tiene mucho sentido puesto que hay variables facter, como las siguientes, que nos permiten distinguir perfectamente el sistema operativo, su versión y su arquitectura:
  • lsbdistcodename (trusty, xenial, etc...)
  • lsbdistrelease (14.04, 16.04, etc...)
  • kernel (linux, windows, etc...)
  • architecture (amd64, i386,  etc...)
En cuanto a las variables que uso habitualmente en /etc/escuela2.0, son las siguientes:
  • tipo: Esta variable la usamos todos para distinguir tipos de máquina. Ejemplos: tipo=workstation, tipo=siatic, tipo=infolab, tipo=notebook 
  • marca: La variable marca nos va a permitir distinguir equipos según marca. Puede ser muy útil cuando, por ejemplo, estamos usando equipos de diferentes marcas como workstation, y tenemos que aplicarles módulos específicos.
  • ubicacion: Con esta variable defino en qué ubicación se encuentra el equipo. De este modo, si tengo equipos del tipo workstation instalados en diferentes ubicaciones, puedo aplicar módulos específicos para ellos en función de su ubicación. Por ejemplo: Puedo usar un módulo que instale la impresora de la sala de profesores tan sólo en los equipos de departamentos distinguiendo por tipo y marca.
  • arranque: En esta variable puedo definir tres posibles valores: arranque=dual, arranque=ubuntu, arranque=windows). Ésto, en combinación con refind, me permite cambiar automáticamente los sistemas operativos seleccionables en el arranque. 
    • Si, por ejemplo, una máquina tiene definida la variable arranque=dual en /etc/escuela2.0, refind permitirá seleccionar en el arranque Ubuntu o Windows. 
    • Si tiene definido arranque=ubuntu, sólo mostrará ubuntu como opción de arranque.
    • Si tiene definido arranque=windows, sólo mostrará windows como opción de arranque.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 05, 2018 06:01 AM

March 04, 2018

enavas.blogspot.com.es

Guía de estilo de pkgsync

Como ya sabéis, para gestionar los equipos informáticos de los centros educativos, los administradores usamos pkgsync en combinación con puppet.

A partir del año 2013, comencé a añadir nuevas funcionalidades y mejoras a esta herramienta para hacerla más potente y permitirnos usarla tanto de forma desatendida como de forma interactiva, o, incluso desactivarla, cuando no es conveniente que se ejecute. Algunas de esas funcionalidades nos proporcionan flexibilidad a la hora de utilizar la herramienta. En este post voy a ir construyendo una guía de estilo para establecer una serie de normas que faciliten nuestro trabajo a la hora de usar pkgsync.

Cómo funciona pkgsync

pkgsync maneja tres listas de paquetes gestionadas de forma centralizada por administracionsi:
  • /etc/pkgsync/musthave: Lista de paquetes que deben estar instalados en la máquina.
  • /etc/pkgsync/mayhave: Lista de paquetes que pueden instalarse en la máquina.
  • /etc/pkgsync/maynothave: Lista de paquetes que no deben estar instalados en la máquina.
Como estos ficheros siempre han sido gestionados desde Mérida y quería poder gestionar los paquetes del mismo modo, en nuevas versiones de pkgsync añadí tres nuevos ficheros que se fusionan automáticamente con los anteriores:
  • /etc/pkgsync/musthave.ies: Lista de paquetes que deben estar instalados en la máquina.
  • /etc/pkgsync/mayhave.ies: Lista de paquetes que pueden instalarse en la máquina.
  • /etc/pkgsync/maynothave.ies: Lista de paquetes que no deben estar instalados en la máquina.

Más tarde, para facilitar aún más la gestión de paquetes, añadí tres nuevos directorios donde es posible crear ficheros con listas de paquetes que se fusionarán con los ficheros anteriores:
  • /etc/pkgsync/musthave.d
  • /etc/pkgsync/mayhave.d
  • /etc/pkgsync/maynothave.d
De este modo pkgsync fusionará por un lado todos los musthave, por otro los mayhave y por otro los maynothave, eliminando repeticiones y limpiando los ficheros de espacios en blanco y tabulaciones.

Además, modifiqué el comportamiento de pkgsync para que los ficheros maynothave tengan prioridad sobre los musthave, de tal manera que, cuando el administrador especifique un nombre de paquete en un fichero maynothave, si el nombre del fichero se encuentra añadido a cualquiera de los ficheros musthave, pkgsync lo ignorará para que aptitude no trate de instalarlo. Ésto resuelve el problema de instalar un paquete que es incompatible con los que se han instalado por defecto en el sistema y el que se ha instalado por defecto en el sistema no se usa y nos estorba.

pkgsync se ejecuta por defecto diariamente mediante anacron con el script /etc/cron.daily/nightly-pkgsync. Podéis cambiar la frecuencia con que se ejecuta pkgsync en diferentes tipos de máquinas con tan sólo modificar el fichero init.pp del módulo puppet pkgsync-frequency. Las tres posibles opciones son:
  • daily
  • weekly
  • mothly

Guía de estilo

Pues bien. Ahora que ya sabemos cómo funciona pkgsync, establezcamos una serie de normas de estilo que nos facilitarán la tarea de gestionar el software mediante puppet y pkgsync.
  • En los ficheros musthave solamente deberían incluirse los paquetes instalados en el sistema base, es decir, el sistema operativo sin software adicional.
  • Los ficheros musthave no deberían contener librerías, y, como mucho, tan sólo deberían figurar las esenciales del sistema base. 
  • Las librerías deberían incluirse en ficheros específicos. Por ejemplo, en /etc/musthave.d/librerias
  • Los ficheros que garantizan la instalación de kernels, deberían incluirse en ficheros específicos, como por ejemplo, en /etc/musthave.d/kernel. Además, deberían incluir más de un kernel, para tener una opción de arranque en el caso de que exista algún problema con alguno de los kernels instalados.
  • Si se requiere instalar módulos para el hardware, se deberían incluir en un fichero específico de módulos: /etc/musthave.d/modulos
  • El software específico debería clasificarse en ficheros específicos para facilitar las tareas de instalación/desinstalación. Por ejemplo:
    • /etc/musthave.d/libreoffice6
    • /etc/musthave.d/smartboard
    • /etc/musthave.d/programacion
    • /etc/musthave.d/educacion
    • /etc/musthave.d/virtualbox
  • Así, si se quisiera desinstalar un software específico, no habría más que mover el fichero del directorio /etc/musthave.d al /etc/maynothave.d. 
  • E instalar, sería tan sencillo como que el módulo puppet que realice una tarea de instalación, coloque los ficheros en el cliente.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 04, 2018 09:01 PM

RooTeando

Tomando Un Cafe 23: Programación Orientada a Objetos

Retomamos el monográfico sobre programación, con un nuevo episodio sobre Programación Orientada a Objetos.

Música: Blue Dot Session- Cholate- 01Waltz for Zacaria http://freemusicarchive.org/

Canales de Telegram @UnDiaUnaAplicacion @UnPythonAldia @AprendePython
Correo [email protected]
Twitter https://twitter.com/Tomando_Un_Cafe

RSS
Anchor.fm  http://anchor.fm/s/18c0860/podcast/rss
Blog(post y podcast)  https://rooteando.com/feed/
Whooshkaa  https://rss.whooshkaa.com/rss/podcast/id/2429
Ivoox http ...

March 04, 2018 05:00 PM

Programación Orientada a Objetos

Este artículo es complementario del episodio 22 del podcast Tomando Un Café que trata sobre Programación Orientada a Objetos(POO). El objetivo es dar una introducción y dar a conocer diversos conceptos desde un punto de visto teórico y no enfocado a un lenguaje de programación en particular.

Este artículo esta enfocada a usuario noveles en la programación y que sirva como primer contacto sobre este tema, habrá muchos conceptos que no se verán y ...

March 04, 2018 04:00 PM

March 02, 2018

enavas.blogspot.com.es

Instalar FOG Server en un contenedor Proxmox

FOG Project es un proyecto de código abierto para clonación y gestión de equipos en red.


En este post vamos a ver cómo instalar FOG Server en un contenedor Proxmox.

Lo primero es crear un contenedor. Para ello, rellenamos los datos de la ficha General


De la pestaña "General" tan sólo destacar que he cargado la clave pública de mi máquina pasarela, con el fin de poder conectarme al servidor vía ssh sin tener que introducir password.

A continuación seleccionamos la plantilla que vamos a utilizar para nuestro contenedor. En mi caso he elegido crear mi contenedor con una plantilla de Debian Jessie:


Si queréis ver algo más de información sobre plantillas y contenedores en Proxmox, os recomiendo echar un vistazo al siguiente post:

En la siguiente ficha "Root Disk" he definido un disco de 100 GB para el contenedor. A priori, sé que tendría que definir un disco más grande porque tenemos varias imágenes de clonación que ocupan mucho espacio. No obstante, más adelante puedo aumentar el espacio:


En la siguiente ficha se define el número de núcleos que va a utilizar la máquina del contenedor. En principio, para mis pruebas, al menos, con 1 núcleo es suficiente. Y si necesitara más, podría aumentar el número de núcleos más adelante:


En la siguiente pestaña he definido que la máquina del contenedor tenga 1GB de memoria RAM. Al lgual que en el caso anterior, es algo que puedo aumentar más adelante:


Tan sólo necesito que esta máquina virtual tenga una interfaz de red y que reciba una dirección IP vía DHCP. Lo he hecho así porque he registrado una IP estática y una entrada DNS para el servidor fogserver en el servidor LDAP del centro. Aunque también podría haber definido una IP estática en la pantalla siguiente:


En la siguiente pestaña, es posible introducir el nombre de dominio DNS y servidores DNS. En mi caso he dejado que use los ajustes del host porque son perfectamente válidos:


Una vez introducida toda la información, nos mostrará un resumen de la configuración que hemos elegido para nuestra máquina virtual:


Como todo es correcto, pulsamos el botón "Finalizado".

Una vez creada la máquina virtual con nuestro Debian Jessie, la iniciamos, nos conectamos a ella por ssh y hacemos una actualización de paquetes para que el sistema se encuentre actualizado antes de instalar fog.

El siguiente paso será descargar fog desde la web. Lo que yo he hecho ha sido copiar la ruta de descarga y descargar el archivo para instalarlo mediante wget:


Pulsamos "Enter" y comenzará el proceso de descarga:


Una vez descargado, el fichero fog_1.5.0.tar.gz, lo descomprimimos y se creará una carpeta con el siguiente nombre: fog_1.5.0

Entramos dentro del directorio bin del directorio fog_1.5.0 y ejecutamos el instalador: ./installfog.sh

Os pego a continuación el procedimiento que yo he seguido respondiendo a las preguntas del asistente de instalación:
[email protected]:~/fog_1.5.0/bin# ./installfog.sh 
Installing LSB_Release as needed
* Attempting to get release information.......................Done


+------------------------------------------+
| ..#######:. ..,#,.. .::##::. |
|.:###### .:;####:......;#;.. |
|...##... ...##;,;##::::.##... |
| ,# ...##.....##:::## ..:: |
| ## .::###,,##. . ##.::#.:######::.|
|...##:::###::....#. .. .#...#. #...#:::. |
|..:####:.. ..##......##::## .. # |
| # . ...##:,;##;:::#: ... ##.. |
| .# . .:;####;::::.##:::;#:.. |
| # ..:;###.. |
| |
+------------------------------------------+
| Free Computer Imaging Solution |
+------------------------------------------+
| Credits: http://fogproject.org/Credits |
| http://fogproject.org/Credits |
| Released under GPL Version 3 |
+------------------------------------------+


Version: 1.5.0 Installer/Updater

What version of Linux would you like to run the installation for?

1) Redhat Based Linux (Redhat, CentOS, Mageia)
2) Debian Based Linux (Debian, Ubuntu, Kubuntu, Edubuntu)
3) Arch Linux

Choice: [2]



Starting Debian based Installation


FOG Server installation modes:
* Normal Server: (Choice N)
This is the typical installation type and
will install all FOG components for you on this
machine. Pick this option if you are unsure what to pick.

* Storage Node: (Choice S)
This install mode will only install the software required
to make this server act as a node in a storage group

More information:
http://www.fogproject.org/wiki/index.php?title=InstallationModes

What type of installation would you like to do? [N/s (Normal/Storage)]

What is the IP address to be used by this FOG Server? [172.19.144.68]

Would you like to change the default network interface from eth0?
If you are not sure, select No. [y/N]

Would you like to setup a router address for the DHCP server? [Y/n]
What is the IP address to be used for the router on
the DHCP server? [172.19.144.2]

Would you like DHCP to handle DNS? [Y/n]
What DNS address should DHCP allow? [172.19.144.2]

Would you like to use the FOG server for DHCP service? [y/N]

This version of FOG has internationalization support, would
you like to install the additional language packs? [y/N] y

######################################################################
# FOG now has everything it needs for this setup, but please #
# understand that this script will overwrite any setting you may #
# have setup for services like DHCP, apache, pxe, tftp, and NFS. #
######################################################################
# It is not recommended that you install this on a production system #
# as this script modifies many of your system settings. #
######################################################################
# This script should be run by the root user. #
# It will prepend the running with sudo if root is not set #
######################################################################
# ** Notice ** FOG is difficult to setup securely #
# SELinux and IPTables are usually asked to be disabled #
# There have been strides in adding capabilities #
# The recommendations would now be more appropriate #
# to set SELinux to permissive and to disable firewall for now. #
# You can find some methods to enable SELinux and maintain firewall #
# settings and ports. If you feel comfortable doing so please do #
######################################################################
# Please see our wiki for more information at: #
######################################################################
# https://wiki.fogproject.org/wiki/index.php #
######################################################################

* Here are the settings FOG will use:
* Base Linux: Debian
* Detected Linux Distribution: Debian GNU/Linux
* Server IP Address: 172.19.144.68
* Server Subnet Mask: 255.255.254.0
* Interface: eth0
* Installation Type: Normal Server
* Internationalization: 1
* Image Storage Location: /images
* Using FOG DHCP: No
* DHCP will NOT be setup but you must setup your
| current DHCP server to use FOG for PXE services.

* On a Linux DHCP server you must set: next-server and filename

* On a Windows DHCP server you must set options 066 and 067

* Option 066/next-server is the IP of the FOG Server: (e.g. 172.19.144.68)
* Option 067/filename is the bootfile: (e.g. undionly.kpxe)


* Are you sure you wish to continue (Y/N) Y

* Installation Started

* Installing required packages, if this fails
| make sure you have an active internet connection.

* Adding needed repository....................................OK
* Preparing Package Manager...................................OK
* Packages to be installed:

apache2 bc build-essential cpp curl g++ gawk gcc genisoimage gettext gzip htmldoc isolinux lftp libapache2-mod-php5 libc6 libcurl3 liblzma-dev m4 mysql-client mysql-server net-tools nfs-kernel-server openssh-server php-gettext php5 php5-bcmath php5-cli php5-curl php5-fpm php5-gd php5-json php5-mcrypt php5-mysql php5-mysqlnd sysv-rc-conf tar tftp-hpa tftpd-hpa unzip vsftpd wget xinetd zlib1g


* Installing package: apache2.................................OK
* Skipping package: bc......................................(Already Installed)
* Installing package: build-essential.........................OK
* Skipping package: cpp.....................................(Already Installed)
* Skipping package: curl....................................(Already Installed)
* Skipping package: g++.....................................(Already Installed)
* Installing package: gawk....................................OK
* Skipping package: gcc.....................................(Already Installed)
* Installing package: genisoimage.............................OK
* Installing package: gettext.................................OK
* Skipping package: gzip....................................(Already Installed)
* Installing package: htmldoc.................................OK
* Installing package: isolinux................................OK
* Installing package: lftp....................................OK
* Installing package: libapache2-mod-php5.....................OK
* Skipping package: libc6...................................(Already Installed)
* Skipping package: libcurl3................................(Already Installed)
* Installing package: liblzma-dev.............................OK
* Skipping package: m4......................................(Already Installed)
* Installing package: mysql-client............................OK
* Installing package: mysql-server............................OK
* Skipping package: net-tools...............................(Already Installed)
* Installing package: nfs-kernel-server.......................OK
* Skipping package: openssh-server..........................(Already Installed)
* Installing package: php-gettext.............................OK
* Installing package: php5....................................OK
* Skipping package: php5-bcmath...............................(Does not exist)
* Skipping package: php5-cli................................(Already Installed)
* Installing package: php5-curl...............................OK
* Installing package: php5-fpm................................OK
* Installing package: php5-gd.................................OK
* Skipping package: php5-json...............................(Already Installed)
* Installing package: php5-mcrypt.............................OK
* Installing package: php5-mysqlnd............................OK
* Skipping package: php5-mysqlnd............................(Already Installed)
* Installing package: sysv-rc-conf............................OK
* Skipping package: tar.....................................(Already Installed)
* Installing package: tftp-hpa................................OK
* Installing package: tftpd-hpa...............................OK
* Installing package: unzip...................................OK
* Installing package: vsftpd..................................OK
* Skipping package: wget....................................(Already Installed)
* Installing package: xinetd..................................OK
* Skipping package: zlib1g..................................(Already Installed)
* Updating packages as needed.................................OK

* Confirming package installation

* Checking package: apache2...................................OK
* Checking package: bc........................................OK
* Checking package: build-essential...........................OK
* Checking package: cpp.......................................OK
* Checking package: curl......................................OK
* Checking package: g++.......................................OK
* Checking package: gawk......................................OK
* Checking package: gcc.......................................OK
* Checking package: genisoimage...............................OK
* Checking package: gettext...................................OK
* Checking package: gzip......................................OK
* Checking package: htmldoc...................................OK
* Checking package: isolinux..................................OK
* Checking package: lftp......................................OK
* Checking package: libapache2-mod-php5.......................OK
* Checking package: libc6.....................................OK
* Checking package: libcurl3..................................OK
* Checking package: liblzma-dev...............................OK
* Checking package: m4........................................OK
* Checking package: mysql-client..............................OK
* Checking package: mysql-server..............................OK
* Checking package: net-tools.................................OK
* Checking package: nfs-kernel-server.........................OK
* Checking package: openssh-server............................OK
* Checking package: php-gettext...............................OK
* Checking package: php5......................................OK
* Checking package: php5-cli..................................OK
* Checking package: php5-curl.................................OK
* Checking package: php5-fpm..................................OK
* Checking package: php5-gd...................................OK
* Checking package: php5-json.................................OK
* Checking package: php5-mcrypt...............................OK
* Checking package: php5-mysqlnd..............................OK
* Checking package: sysv-rc-conf..............................OK
* Checking package: tar.......................................OK
* Checking package: tftp-hpa..................................OK
* Checking package: tftpd-hpa.................................OK
* Checking package: unzip.....................................OK
* Checking package: vsftpd....................................OK
* Checking package: wget......................................OK
* Checking package: xinetd....................................OK
* Checking package: zlib1g....................................OK

* Configuring services

* Setting up fog user.........................................OK
* Setting up fog password.....................................OK
* Stopping FOGMulticastManager Service........................OK
* Stopping FOGImageReplicator Service.........................OK
* Stopping FOGSnapinReplicator Service........................OK
* Stopping FOGScheduler Service...............................OK
* Stopping FOGPingHosts Service...............................OK
* Stopping FOGSnapinHash Service..............................OK
* Stopping FOGImageSize Service...............................OK
* Setting up and starting MySQL...............................OK
* Backing up user reports.....................................Done
* Stopping web service........................................OK
* Is the MySQL password blank? (Y/n)
* Stopping FOGMulticastManager Service........................OK
* Stopping FOGImageReplicator Service.........................OK
* Stopping FOGSnapinReplicator Service........................OK
* Stopping FOGScheduler Service...............................OK
* Stopping FOGPingHosts Service...............................OK
* Stopping FOGSnapinHash Service..............................OK
* Stopping FOGImageSize Service...............................OK
* Setting up and starting MySQL...............................OK
* Setting up Apache and PHP files.............................OK
* Testing and removing symbolic links if found................OK
* Backing up old data.........................................OK
* Copying new files to web folder.............................OK
* Creating the language binaries..............................Done
* Creating config file........................................OK
* Unzipping the binaries......................................Done
* Copying binaries where needed...............................Done
* Enabling apache and fpm services on boot....................OK
* Creating SSL CA.............................................OK
* Creating SSL Private Key....................................OK
* Creating SSL Certificate....................................OK
* Creating auth pub key and cert..............................OK
* Resetting SSL Permissions...................................OK
* Setting up Apache virtual host (no SSL).....................OK
* Starting and checking status of web services................OK
* Changing permissions on apache log files....................OK
* Backing up database.........................................OK

* You still need to install/update your database schema.
* This can be done by opening a web browser and going to:

http://172.19.144.68/fog/management


Si os fijáis en las últimas líneas de la salida anterior, nos dice que debemos instalar/actualizar nuestro esquema de base de datos. Y que ésto podemos hacerlo abriendo el navegador web e introduciendo la siguiente dirección: http://172.19.144.68/fog/management

Así que lo hacemos:


En la ventana anterior pulsamos en botón Install/Update now. Nos confirmará que el proceso de instalación/actualización ha sido realizado:

Si os fijáis en la salida siguiente, una vez hecho ésto, tendremos que ir al terminal y pulsar "Enter" para continuar con el proceso de instalación:

* Press [Enter] key when database is updated/installed.

* Setting up storage..........................................OK
Skipped
* Setting up and starting TFTP and PXE Servers................OK
* Setting up and starting VSFTP Server........................OK
* Setting up FOG Snapins......................................OK
* Setting up UDPCast..........................................OK
* Configuring UDPCast.........................................OK
* Building UDPCast............................................OK
* Installing UDPCast..........................................OK
* Installing FOG System Scripts...............................OK


* Configuring FOG System Services


* Setting FOGMulticastManager script executable...............OK
* Enabling FOGMulticastManager Service........................OK
* Setting FOGImageReplicator script executable................OK
* Enabling FOGImageReplicator Service.........................OK
* Setting FOGSnapinReplicator script executable...............OK
* Enabling FOGSnapinReplicator Service........................OK
* Setting FOGScheduler script executable......................OK
* Enabling FOGScheduler Service...............................OK
* Setting FOGPingHosts script executable......................OK
* Enabling FOGPingHosts Service...............................OK
* Setting FOGSnapinHash script executable.....................OK
* Enabling FOGSnapinHash Service..............................OK
* Setting FOGImageSize script executable......................OK
* Enabling FOGImageSize Service...............................OK
* Setting up FOG Services.....................................OK
* Starting FOGMulticastManager Service........................OK
* Starting FOGImageReplicator Service.........................OK
* Starting FOGSnapinReplicator Service........................OK
* Starting FOGScheduler Service...............................OK
* Starting FOGPingHosts Service...............................OK
* Starting FOGSnapinHash Service..............................OK
* Starting FOGImageSize Service...............................OK
* Setting up exports file.....................................OK
* Setting up and starting RPCBind.............................OK
* Setting up and starting NFS Server..........................OK
* Linking FOG Logs to Linux Logs..............................OK
* Linking FOG Service config /etc.............................OK
* Ensuring node username and passwords match..................Done

* Setup complete

You can now login to the FOG Management Portal using
the information listed below. The login information
is only if this is the first install.

This can be done by opening a web browser and going to:

http://172.19.144.68/fog/management

Default User Information
Username: fog
Password: password

[email protected]:~/fog_1.5.0/bin#

Una vez terminada la instalación, nos informa de la dirección que debemos introducir para acceder al interfaz de administración de fog, así como el nombre del usuario administrador y su password.

Así que abrimos esa dirección en el navegador e introducimos el nombre de usuario y el password para acceder:


Y entraremos en el Dashboard de nuestro servidor fog:


Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 02, 2018 07:01 PM

cambiatipo: Script para cambiar el tipo de máquina en el fichero /etc/escuela2.0

Reutilizando el código del script cambiahostname, he escrito otro script cambiatipo que permite cambiar el tipo de máquina en el fichero /etc/escuela2.0:
#!/bin/bash
#
# Esteban M. Navas
# Fecha creación: 02/03/2018

# Si no hay parámetros, el script se está usando de forma interactiva
if [ -z "$1" ]; then

DIALOG="dialog"
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

$DIALOG --title "Tipo de host" --clear \
--inputbox "Introduzca el tipo de host que desea asignar a este equipo [siatic, infolab, workstation, notebook]:" 15 51 2> $tempfile

retval=$?

case $retval in
0)
TIPO=`cat $tempfile`
;;
1) ;;
esac
else
TIPO=$1
fi


if [ "$TIPO" ] ; then

grep -q '^tipo=' /etc/escuela2.0 && sed -i "s/^tipo=.*/tipo=$TIPO/" /etc/escuela2.0 || echo "tipo=$TIPO" >> /etc/escuela2.0

/usr/sbin/sinc_puppet -f now
# /usr/local/sbin/pkgsync -pcr

fi
En este caso:
  • Si existe, reemplazamos la definición del tipo de host en el fichero /etc/excuela2.0.
  • Si no existe, simplemente la insertamos.
Al igual que en el script cambiahostname, se puede indicar el nombre del host como parámetro del script. Y, si no se especifica, mostrará un cuadro de diálogo para que lo escribamos.

Tras cambiar el host, se ejecutará sinc_puppet (He dejado la línea que ejecutaría pkgsync comentada).

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 02, 2018 11:51 AM

cambiahostname: Script para cambiar el nombre de un host

cambiahostname es un pequeño script que escribí para cambiar el nombre de las máquinas virtuales en uno de los cursos que impartí en la Escuela de Administración Pública y, al final, he terminado utilizando en los equipos Ubuntu del centro para cambiar el nombre de los equipos después de clonar y ejecutar sinc_puppet o pkgsync: 
#!/bin/bash
#
# Esteban M. Navas
# Fecha creación: 08/07/2016
# Última modificación: 02/03/2018

# Si no hay parámetros, el script se usa de forma interactiva
if [ -z "$1" ]; then

DIALOG="dialog"
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

$DIALOG --title "Nombre de host" --clear \
--inputbox "Introduzca el nombre de host que desea asignar a este equipo. Este nombre debe ser una cadena de caracteres alfanuméricos en minúsculas, sin espacios:" 15 51 2> $tempfile

retval=$?

case $retval in
0)
NOMBRE=`cat $tempfile`
;;
1) ;;
esac
else
NOMBRE=$1
fi


if [ "$NOMBRE" ] ; then

echo "127.0.0.1 localhost
127.0.1.1 $NOMBRE

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters" > /etc/hosts

echo "$NOMBRE" > /etc/hostname
hostname -F /etc/hostname

/usr/sbin/sinc_puppet -f now
# /usr/local/sbin/pkgsync -pcr

fi
El script funcionaba de forma interactiva preguntando el nombre del host mediante dialog. Hoy lo he modificado para que se pueda utilizar también indicando el nombre de la máquina mediante parámetro.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 02, 2018 11:36 AM

March 01, 2018

enavas.blogspot.com.es

Actualizar el firmware de nuestro Tanix TX3 Mini TV Box

Ya os hemos hablado en un par de ocasiones del Tanix TX3 Mini, un excelente Android TV Box. En la primera ocasión, para presentároslo y, en la segunda, para explicaros que tiene un firmware completamente actualizable.

Comprar en GearBest

Nosotros tenemos la versión de 2GB de RAM y 16GB de almacenamiento y la verdad es que estamos encantados de haberlo comprado porque va muy fluído y, además, hemos podido comprobar que el fabricante actualiza el firmware (no como suele suceder con muchos dispositivos).

Como ya os comentamos, es posible actualizar el Tanix TX3 Mini de tres formas:
  • Vía OTA Update, utilizando la herramienta de actualización que incorpora el propio dispositivo. Para los que no lo saben OTA Update significa Over The Air Update; vamos lo que viene a ser una actualización online. 
  • Descargando un fichero ZIP de actualización e instalándolo desde USB o microSD desde la herramienta de actualización que incorpora el Tanix TX3 en Android. 
  • Descargando un fichero IMG de actualización e instalándolo mediante una herramienta de flasheo que nos proporciona Tanix.
En este post vamos a ver lo sencillo que es actualizar el firmware mediante el fichero ZIP de actualización que podemos descargar desde el enlace que nos proporciona el fabricante y que nos va a permitir disponer de un sistema de arranque dual en nuestro dispositivo con dos sistemas: Android 7.1 y LibreElec8.2:

Descargar

Una vez descargado, lo copiamos a un pendrive o a una tarjeta micro SD. Nosotros lo hemos copiado a nuestra tarjeta micro SD:


Una vez copiado, cogemos la tarjeta micro SD y la introducimos en nuestro Tanix TX3 Mini:

Comprar en GearBest
Una vez introducida, abrimos la herramienta de actualización que se encuentra en el cajón de aplicaciones y hacemos clic en el botón "Select":


La herramienta comenzará a escanear el almacenamiento en busca de archivos:


Cuando termine, nos mostrará una lista de archivos localizados tanto en el almacenamiento interno como en la tarjeta SD. 

Seleccionamos el archivo que contiene la imagen (TanixTX3-ota-20180109.zip) y nos devolverá a la pantalla de actualización:


Pulsamos el botón "Update" y comenzará el proceso de actualización. Cuando termine, tendremos un arranque dual en el que podremos elegir qué sistema queremos iniciar:

  • Android version: 7.1 con el launcher ALICE UX 
  • LibreELEC version: 8.2 

El dispositivo siempre arrancará con el sistema que hayáis elegido en un momento determinado (El último sistema operativo usado queda como sistema operativo por defecto).

Para cambiar de sistema, lo único que tenéis que hacer es mantener pulsado el botón "power" del mando a distancia. Se os mostrará una ventana con una serie de opciones para cambiar de sistema.

Es importante recordar que una vez instalado, tenéis dos sistemas operativos en el Tanix y que cada sistema operativo tiene su propio Kodi

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at March 01, 2018 07:34 PM

February 28, 2018

enavas.blogspot.com.es

LeEco Le S3 X626: Un smartphone de diseño con 4GB de RAM, 10 núcleos y una cámara excepcional

Hoy queremos recomendaros el LeEco Le S3 X626, un smartphone con una excelente relación calidad/precio, un acabado impresionante y un hardware realmente potente (87.000 (Antutu v6) Rendimiento mejor que el 90% de los dispositivos).


Diseño y pantalla

Tiene un diseño es realmente atractivo con una carcasa metálica de aluminio y una pantalla de 5.5 pulgadas con resolución Full HD (1080 x 1920 px) y muy alta densidad (401 pixeles por pulgada).

Algunas características de la pantalla:
  • Pantalla de cristal redondeado 2.5D
  • Corning Gorilla Glass 3
  • LED de Notificaciones
  • Multi-touch
  • Resistente a rayones
Se encuentra disponible en dos colores: oro y oro rosa. Nosotros lo compramos en oro rosa. La combinación de color con la increíble definición que tiene la pantalla lo hacen realmente atractivo.

El LeEco Le S3 es dual SIM y cuenta con una ranura para 2 tarjetas nano SIM:

Como ya empieza a ser habitual de un tiempo a esta parte, ya no tiene ranura para micro SD.

Por supuesto, dispone de lector de huellas en la parte trasera algo que resulta muy útil para no tener que estar tecleando códigos pin ni dibujando patrones.

A continuación podéis ver el contenido del paquete:


  • Teléfono Móvil.
  • Adaptador de Auriculares para conectar auriculares al puerto USB.
  • Alimentador de Corriente con con conector USA.
  • Adaptador de corriente EUR.
  • USB Cable Type C.
  • Aguja para extraer SIM. 
  • Manual en Inglés.
Como muchos smartphones chinos, viene con un alimentador de corriente con conector USA y te mandan un adaptador, algo que no me convence. Deberían proporcionar el alimentador con conector europeo directamente.

Me gusta que el conector de carga sea USB Tipo C. Es realmente cómodo no tener que estar mirando el conector a la hora de enchufarlo.


Rendimiento y potencia

El Le S3 x626 monta un procesador Helio X20 Deca Core a 2.3GHz de 64 bits, 4GB de memoria RAM y una GPU Arm Mali-T880 780MHz. En cuanto al almacenamiento interno, tiene dos opciones: 32GB  o 64GB.

Tiene una increíble fluidez que proporciona una experiencia de uso realmente agradable.

Como sistema operativo, utiliza EUI 5.8, un sistema basado en Android 6.0.


Cámaras

Este dispositivo dispone de dos cámaras:
  • Una cámara principal de 16 Mpx con sensor Omnivision OV16880 apertura f/2.0 y flash dual led.
  • Una cámara delantera para selfies de 8 Mpx.
Una de las cosas que más nos ha sorprendido de este dispositivo es la increíble calidad de su cámara principal tanto a la hora de hacer fotos como de grabar vídeos.

A continuación podéis ver un par de fotos hechas con la cámara para que os hagáis una idea acerca de su calidad:



Y un vídeo grabado también con ella:



Os sorprenderá gratamente porque graba vídeo a 4K.

Tiene autoenfoque, lo que os facilitará enormemente la realización de fotografías o vídeos.

Dispone de función de disparo Continuo o Ráfaga, algo super-interesante porque nos va a permitir realizar varias tomas seguidas para luego escoger la mejor.

Por otro lado, también cuenta con la posibilidad de realizar Zoom Digital, utilizar el modo HDR, realizar ajustes ISO o incluso utilizar enfoque manual y, por supuesto, realizar fotos panorámicas.

Pero además, dispone de una función que nos ha encantado: Vídeo Slow Motion, con el que podremos grabar vídeos a cámara lenta, capturando 120 fps.


Sonido

En la parte inferior tenemos el conector USB Tipo-C, un sistema de doble altavoz con los que logra el efecto estéreo con buena calidad de sonido y el micrófono:



Utiliza una tecnología llamada CDLA (Continual Digital Lossless Audio). Si queremos, podemos conectar unos auriculares con conector jack gracias al adaptador que viene en la caja. No obstante, también podemos comprar unos auriculares con conector USB Tipo C que nos proporcionarán mayor calidad de sonido.

Además soporta tecnología Dolby Atmos.


Conectividad

Es importante destacar que es un dispositivo con conectividad 4G, algo fundamental hoy en día para navegar a una buena velocidad. Naturalmente dispone también de conectividad 3G y 2G.

Wifi:
Podéis conectarlo a cualquier tipo de red wifi disponible en la actualidad porque soporta los siguientes estándares: 802.11a, 802.11b, 802.11g, 802.11n, 802.11ac 

Además dispone de las siguientes funciones:
  • Wi-Fi Direct: Esta función nos permite compartir archivos entre los dispositivos mediante una red wifi creada entre ambos. 
  • Wi-Fi Display: Permite mostrar contenidos multimedia en otros dispositivos.
  • Punto acceso Wi-Fi: Permite compartir la conexión a internet con otros dispositivos.
Bluetooth: 
Dispone de Bluetooth 4.1 LE (Bajo consumo de energía)

Perfiles bluetooth soportados:
  • A2DP (Distibucion de audio avanzada) 
  • EDR (Enhanced Data Rate) 
  • LE (Low Energy)
GPS:
Soporta A-GPS, Beidou, GLONASS, GPS


Autonomía

En lo que a autonomía se refiere, el LeEco Le S3 dispone de una batería no extraíble de 3000mAh con USB tipo C y sistema de carga rápida. Una característica que debería venir de serie ya con todos los smartphones.


En resumen.
Un dispositivo realmente económico con prestaciones de gama media-alta, muy potente, con una conectividad excelente y una increíble cámara con la que hacer excelentes fotos y grabar vídeos a 4k. 

Comprar en GearBest

Si buscáis un smartphone bueno y bonito a un precio razonable, os recomendamos el LeEco Le S3 X626. Nosotros, desde que lo compramos, estamos encantados con él.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 28, 2018 07:38 PM

Modificado el script reinstall_nwfermi_module para añadir el módulo a todos los kernels instalados

Aprovechando que había escrito el código del script reinstall_nvidia_module para añadir el módulo de NVIDIA a todos los kernels instalados, y es perfectamente válido para instalar cualquier otro módulo, he modificado reinstall_nwfermi_module para que también añada el módulo a todos los kernels instalados.
#!/bin/bash

PKGNAME='nwfermi'
PKGVER=`dpkg-query -W -f='${Version}' $PKGNAME | awk -F "-" '{print $1}'`
PKGVER=${PKGVER#*:}

echo "Removing all DKMS Modules"
dkms remove -m $PKGNAME -v $PKGVER --all -q > /dev/null
echo "Done."
echo "Adding Module to DKMS build system"
echo "driver version= $PKGVER"
dkms add -m $PKGNAME -v $PKGVER > /dev/null
echo "Doing initial module build"
dkms build -m $PKGNAME -v $PKGVER > /dev/null

echo "Installing initial module"
dkms install -m $PKGNAME -v $PKGVER > /dev/null
echo "Done."

CANDIDATES=`ls -tr /boot/vmlinuz-* | cut -d- -f2- | awk '{print $0}' | sed 's/.efi.signed.*//g' | sort -u`

for KERNEL in $CANDIDATES; do
echo "Installing module $PKGNAME on kernel $KERNEL"
dkms install -m $PKGNAME -v $PKGVER -k $KERNEL > /dev/null
echo "Done."
done

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 28, 2018 11:59 AM

systemadmin.es

Comprobar disponibilidad de protocolos SSL

Para un determinado servicio SSL podemos verificar mediante openssl s_client. Vamos a ver cómo:

El subcomando s_client dispone de opciones para indicar el protocolo a usar:

echo | openssl s_client -connect systemadmin.es:443 -ssl3
echo | openssl s_client -connect systemadmin.es:443 -tls1_2
echo | openssl s_client -connect systemadmin.es:443 -tls1_1
echo | openssl s_client -connect systemadmin.es:443 -tls1

Por lo tanto simplemente buscando si se establece la sesión podemos ver si el protocolo esta soportado en el lado servidor:

# echo | openssl s_client -connect systemadmin.es:443 -tls1_2 2>&1 | grep "Session-ID: "
    Session-ID: AA27E5EAC09CF474E38E8934B81CAE0D5759BFDAFAA0274AB37B38D6715F84EB
# echo | openssl s_client -connect systemadmin.es:443 -ssl3 2>&1 | grep "Session-ID: "

Por lo tanto, podemos ver que en este caso TLS 1.2 esta soportado mientras SSLv3 no

Tags:

by Jordi Prats at February 28, 2018 06:36 AM

February 27, 2018

enavas.blogspot.com.es

Cable magnético USB 3 en 1 con conector de 8 pines, micro usb, usb tipo C

Éste es uno de los cables que no puede faltar en nuestra mochila, en nuestro bolso o en el coche:


El kit contiene lo que véis en la imagen:
  • Un cable USB de 1 metro de longitud con conexión magnética.
  • Un adaptador de 8 Pines para iPhone.
  • Un adaptador USB Type-C.
  • Un adaptador Micro USB.
Tiene una carcasa de aluminio que lo hace resistente y duradero. Pero, además, tiene una luz LED indicadora que nos mostrará el estado de carga del dispositivo. Y es válido tanto para cargar el dispositivo como para usarlo como cable de transferencia de datos.

La principal ventaja que tienen este tipo de cables es que podemos dejar el adaptador insertado en nuestro teléfono, con lo que lograremos dos cosas:
  • Evitaremos que entre polvo en el conector de carga de nuestro smartphone.
  • Evitaremos que el conector se estropee por estar conectando y desconectando el cargador, algo que sucede con mucha frecuencia y es uno de los principales motivos de avería de muchos smartphones.

Además es muy baratito. Os lo recomendamos.

Comprar en GearBest

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (sagrario) at February 27, 2018 07:18 PM

Instalar LibreOffice 6 en el IES

Acorralado por el problema sufrido el viernes pasado con la actualización de Libreoffice desde el ppa:libreoffice/libreoffice-5-4, decidí iniciar una huída hacia adelante e instalar LibreOffice 6; descargando los paquetes desde la web de LibreOffice y distribuyéndolo a los equipos mediante puppet y pkgsync desde mi repositorio interno. 

El problema fue que los mantenedores de este repositorio actualizaron la versión del paquete de la 5.4.4 a la 5.4.5 y cascó libreoffice en todos los Ubuntu Trusty. Al abrir cualquier archivo, daba error... Y no había vuelta atrás porque:
  • Al añadir una versión, reemplazan directamente la anterior, algo que no me parece buena idea.
  • La versión 5.3 tampoco funcionaba y encima está marcada como EOL.
El inconveniente es que instalar la versión 6 requiere desinstalar la versión previamente instalada. Así que tuve descargar la versión 6  desde la web de LibreOffice, añadirla a mi repositorio interno y escribir un módulo puppet que:
  • Desinstale la versión anterior de LibreOffice.
  • Instale posteriormente la versión 6 de LibreOffice.
  • Coloque un fichero musthave con la lista de paquetes de la versión 6 para garantizar que se mantenga instalada.
  • Coloque un fichero maynothave con la lista de paquetes de la versión anterior para garantizar que no se encuentren instalados.
Siento no compartir el módulo, pero requiere dos cosas: Un repositorio interno de paquetes y la modificación del paquete linex-xubuntu-core que he tenido que retocar para quitar las siguientes dependencias:
  • libreoffice
  • libreoffice-help-es
  • libreoffice-l10n-es
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 27, 2018 12:26 PM

Cuidado al usar PPA en Ubuntu

Un PPA (Personal Package Archive) es un repositorio de paquetes personal. Éste tipo de repositorios es muy útil para disponer de software más actualizado que el que se encuentra en los repositorios de nuestra distribución o simplemente, para poder instalar un paquete que no se encuentra en los mismos.

A mí, personalmente, me gusta utilizar PPA para mantener más actualizado el software de los equipos de mi centro. Ahora bien, hay que tener mucho cuidado porque en un momento determinado, podemos tener problemas.

Por ejemplo, sin ir más lejos, el viernes pasado tuve dos problemas derivados del uso de PPA:
  • Por alguna razón, se actualizó el kernel 4 que tengo instalado en los clientes Ubuntu Trusty,  pero no se generaron los módulos propietarios de NVIDIA, con lo que la resolución de los equipos bajó al no cargarse dichos módulos.
  • Por otra parte, mantenía libreoffice en la versión 5.4 mediante ppa:libreoffice/libreoffice-5-4. Los mantenedores de este repositorio actualizaron la versión del paquete de la 5.4.4 a la 5.4.5 y cascó libreoffice en todos los Ubuntu Trusty por un error de permisos... Y no había vuelta atrás porque al añadir una versión, quitan directamente del repositorio la anterior.
Así que lo dicho. Tened cuidado y guardaos un cartucho en la recámara... Por ejemplo, mantened siempre una versión anterior en vuestros propios repositorios.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 27, 2018 10:38 AM

www.rootzilopochtli.com

#SysArmyMX Challenge

Talk is cheap. Show me the code | Hablar es fácil. Enséñame el código

Linus Torvalds

 

El pasado 12 de febrero tuvimos MeetArmy donde realizamos una dinámica diferente: #SysArmyMx Challenge

El reto consistía en modificar el nombre de unos archivos, que en la parte central tenía un timestamp, adelantando un segundo ese registro de tiempo, resguardando los archivos originales y el formato proporcionado.

Los premios para este reto fueron:

1er lugar: Poster del código fuente 0.01 del kernel de Linux

2o lugar: Playera de SysArmy

Participantes: Stickers oficiales de SysArmy

Les comparto la presentación del reto, así como los scripts ganadores:

1er lugar: script.py – script en Python por Alex

2o lugar: copia.sh – script en Bash por Neto

Además de mi solución para el reto: sysarmy_challenge.shBash One-Liner

Galería de fotos del evento:

Si están interesados en participar de estos Meetup’s y aún no se han unido a la comunidad, denle clic a la imagen:

Espero les sirva… 🙂

Nota: Pueden checar el antecedente de este problema en una publicación anterior.

by Alex Callejas at February 27, 2018 05:23 AM

El Blog de Marcelo!

Taller de Programación de Sockets TCP/IP

En este mes de febrero tuve la suerte de llevar adelante en la UNLu un breve pero conciso taller de programación de sockets basado en Python. Dejo los slides, ejemplos de código y ejercicios planteados en el apartado de Charlas de mi blog, y en este post.

Agenda:

  • Clase 1: Introducción Sockets API. Modelo OSI, entornos de ejecución.Introducción a Python. Socket API para UDP. Ejercicios.
    • Descargar en Formato ODP / Formato PDF.
    • Código de ejemplo: ZIP.
  • Clase 2: Socket API para TCP. Código de ejemplo y ejercicios.
    • Descargar en Formato ODP / Formato PDF.
  • Clase 3: Multiprogramación, concurrencia, paralelismo. Syscall fork() y relacionados. Ejemplos de servidor multiproceso. Procesos vs. Threads.
    • Descargar en Formato ODP / Formato PDF.
    • Código de ejemplo: ZIP.
  • Clase 4: Sockets asincrónicos. Modelo de trabajo, syscall select(). Ejemplos de código. Introducción a Scapy.
    • Descargar en Formato ODP / Formato PDF.
    • Código de ejemplo: ZIP.

¡Saludos!

by Marcelo at February 27, 2018 03:38 AM

February 26, 2018

enavas.blogspot.com.es

Lámpara portátil con reloj y despertador ideal para regalar

Buscando una lámpara para la mesita de noche, encontramos esta interesante propuesta. Se trata de una lámpara con batería de 3600 mAh recargable mediante puerto USB que podremos usar como luz nocturna y mover cómodamente a cualquier lugar, ya que no necesita estar permanentemente conectada.

Gearbest Utorch Wake Up Light Touch Sensor Clock LED Bedside Lamp
Comprar en GearBest

Tiene un tamaño de 9.40 cm de largo x 9.40 cm de ancho y 15.00 cm de altura:

Comprar en GearBest

El panel táctil de la parte superior nos permite seleccionar el brillo con un sólo toque.

En la parte delantera se encuentra el display que muestra la hora, un indicador del estado de la batería y la alarma.

Los controles para establecer la hora y la alarma se encuentran en la parte inferior.

En la parte trasera encontraréis el altavoz y la conexión USB de carga.


Con 3 modos de luz blanca: cálida, media y brillante y 256 tonos de color RGB. Con el sensor táctil podremos configurar el nivel de luz que queremos y ajustar el color para crear un ambiente. 

Esta lámpara dispone de 6 sonidos naturales, en lugar del molesto pitido, que nos permitirán despertarnos suavemente. Éstos incluyen sonidos de pájaros, olas o sonido de tormentas. Además, una vez seleccionado el sonido, cuando llegue la hora de despertarnos, comenzará a sonar subiendo el volúmen gradualmente de menos a más.



De igual modo, al usar la función despertador, la luz de la lámpara se encenderá y su brillo comenzará a incrementarse para simular la salida del sol.

Su precio es bastante interesante, pero además, hasta el día 2 de marzo se encuentra en oferta con un 10% de descuento a un precio de 15.67 euros.

Comprar en GearBest

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (sagrario) at February 26, 2018 11:11 PM

reinstall_nvidia_module: Script para instalar módulos de nvidia en equipos de Infolab y Siatic

En un post de octubre de 2017, vimos cómo mantener actualizados los drivers NVIDIA de equipos Infolab y Siatic utilizando los repositorios ppa:
https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

El caso es que, la semana pasada, al instalarse un nuevo kernel, he observado que, por alguna razón, no se han regenerado los drivers de NVIDIA para los kernels que tenía instalados.

Por si en algún momento vuelve a suceder, he escrito un script que me permite regenerar los módulos de NVIDIA cuando quiera y lo he distribuido mediante puppet a los equipos HP de SIATIC e Infolab:

/usr/local/sbin/reinstall_nvidia_module
#!/bin/bash

TIPO=`facter tipo`

case $TIPO in
'siatic')
PKGNAME='nvidia-340';;
'infolab')
PKGNAME='nvidia-384';;
*)
exit 0;;
esac

PKGVER=`dpkg-query -W -f='${Version}' $PKGNAME | awk -F "-" '{print $1}'`
PKGVER=${PKGVER#*:}

echo "Removing all DKMS Modules"
dkms remove -m $PKGNAME -v $PKGVER --all -q > /dev/null
echo "Done."
echo "Adding Module to DKMS build system"
echo "driver version= $PKGVER"
dkms add -m $PKGNAME -v $PKGVER > /dev/null
echo "Doing initial module build"
dkms build -m $PKGNAME -v $PKGVER > /dev/null

CANDIDATES=`ls -tr /boot/vmlinuz-* | cut -d- -f2- | awk '{print $0}' | sed 's/.efi.signed.*//g' | sort -u`

for KERNEL in $CANDIDATES; do
echo "Installing module $PKGNAME on kernel $KERNEL"
dkms install -m $PKGNAME -v $PKGVER -k $KERNEL > /dev/null
echo "Done."
done
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 26, 2018 10:26 PM

Aprovecha el cupón de GearBest para comprar un Xiaomi Amazfit BIP Lite o un Alfawise S2 Smart Watch

Quedan muy pocos días para que expire el cupón NYGBCE de GearBest (válido hasta el 28 de febrero de 2018).

Aprovechad ahora para comprar un Alfawise S2 Smart Watch a un precio de 22.59 euros utilizando este cupón en la cesta de compra:

Gearbest Alfawise S2 Smartwatch
Comprar en GearBest

O un Xiaomi Amazfit BIP a un precio de 42,70 euros utilizando el mismo cupón:

Comprar en GearBest

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (sagrario) at February 26, 2018 05:58 AM

www.sysadmin.org.mx

BSD Magazine Enero 2018

Tiene como título "Build a Scalable Monitoring System with Grafana, InfluxDB and Riemann" e incluye los siguientes temas:

  • What's Next for Feature Development in FreeNAS/TrueNAS?
  • Managing Multiple Perl 5 Installations with Perlbrew
  • Build a Scalable Monitoring System with Grafana, InfluxDB and Riemann
  • Distributed Version Control with RaspberryPi 3, Fossil, and FreeBSD
  • What Blockchain Can Do Depends on Who You Are
  • Interview with Rob Somerville

La pueden descargar desde la siguiente dirección https://bsdmag.org/download/build-scalable-monitoring-system-grafana-influxdb-riemann/

by angel at February 26, 2018 04:19 AM

February 24, 2018

enavas.blogspot.com.es

Mochila multifuncional con múltiples compartimentos y puerto USB

Buscando una mochila multifuncional (un poco para todo), que tuviera múltiples compartimentos y me permitiera llevar diferentes dispositivos (tablet, smartphone, power bank...) y un portátil de hasta 17 pulgadas; que pudiera utilizar en un momento determinado para llevar ropa y tuviera algún bolsillo exterior que siempre viene bien para tener ciertas cosas a mano, como por ejemplo, una botella de agua, encontré éste modelo por muy poco dinero en GearBest: 


Me gustó porque tenía todas las características que buscaba, porque el precio era realmente económico, y, además porque dispone de un puerto usb desmontable. Este puerto puede sernos de gran utilidad para guardar nuestro power bank dentro y llevar el móvil conectado fuera de la mochila para seguir usándolo mientras se carga.

Comprar en GearBest

Su tamaño es justo lo que buscaba: 

Comprar en GearBest

Tiene un diseño ergonómico:

Comprar en GearBest

Y se encuentra disponible en 4 colores diferentes:

Comprar en GearBest

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (sagrario) at February 24, 2018 07:56 AM

El shell de linux: Comprobar si un paquete se encuentra instalado

A veces nos interesa comprobar, dado el nombre de un paquete, si éste se encuentra instalado. Una forma de hacerlo es utilizando el comando dpkg-query:
# dpkg-query -W --showformat='${binary:Package}\n' nombre-de-paquete 2>/dev/null
Con ésto, obtendremos un string con el nombre del paquete introducido, o una cadena vacía, si no se encuentra instalado.
Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 24, 2018 07:17 AM

February 22, 2018

enavas.blogspot.com.es

Alfawise S2 Smart Watch: Un smartwatch bonito y económico a la vez que funcional

El Alfawise S2 Smart Watch, como ya decíamos en el título del post, es un smartwatch con un diseño bonito con cuerpo de metal, pantalla Gorila Glass con protección IP67 y correa de cuero. Pero eso no es todo. También tiene un precio tan económico que ya no te plantearás comprar un reloj normal.

¿Por qué digo ésto? Porque tiene funciones que monitorizan el sueño, el ritmo cardíaco y la presión arterial junto con el oxígeno en sangre.


Consume muy poca energía y la batería puede llegar a durar hasta 30 días en espera.


También es muy funcional en el aspecto deportivo. Tiene podómetro, con lo que contará tus pasos, la distancia total recorrida, los datos de frecuencia cardíaca, las calorías diarias quemadas para proporcionar información precisa sobre tu actividad deportiva. Y tiene aviso de sedentarismo.

Tan sólo es necesario levantar o girar las manos para iluminar la pantalla.

Para sincronizar los datos con vuestro smartphone, tan sólo tenéis que instalar la APP JYou, disponible en Play Store. La sincronización se realiza mediante Bluetooth 4.0


Además soporta actualización del firmware y podéis usarlo como despertador porque tiene función de alarma.

Otro de los aspectos importantes a destacar es que soporta varios idiomas, entre ellos el español: Simplified Chinese, Traditional Chinese, English, Japanese, Korean, Spanish, German, French, Russian, Polish. Y es compatible con iOS 8.0 o superior y Android 4.4 o superior.

Por supuesto, recibirás las notificaciones de tu móvil en tu Smartwatch:


En cuanto al contenido del paquete tiene:
  • 1 Smart Watch
  • 1 Cable de carga USB
  • 1 Manual de usuario en Inglés -Chino
Y todo ésto, por menos de 30 euros.

Comprar en GearBest

Además, ahora puedes aprovechar la oportunidad y comprarlo más barato aún, con un descuento del 14%, al utilizar el siguiente cupón:

Cupón: NYGBCE (válido hasta el 28/02/2018)


Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (sagrario) at February 22, 2018 10:52 PM

February 21, 2018

enavas.blogspot.com.es

Xiaomi Mi Band 2: La pulsera de actividad ahora disponible en GearBest con envío desde España

Compré mi Xiaomi Mi Band 2 ya hace mucho tiempo, cuando se vendía en pre-venta y estoy tan acostumbrado a llevarla siempre en la muñeca, que el otro día, cuando la perdí, no hacía más que darle vueltas pensando en cómo y cuándo había podido perderla. 

Como nos marchamos al pueblo, pasé todo el fin de semana sin ella, intentando recordar si la había dejado en algún sitio o si se me había podido caer fuera de casa. 

Al volver el domingo a casa, cogí mi móvil y, activé el bluetooth, para ver si se sincronizaba. Y se sincronizó. Y pensé: Genial!! Está en casa!! Ya sólo tengo que abrir la aplicación y usar la opción "Buscar pulsera" de la App Mi Fit para que vibre y encontrarla.  Y al fin la encontré!!!

La verdad es que me encanta porque la batería dura en torno a los 20 días, dependiendo del uso; monitoriza el sueño durante la noche, me despierta con una vibración, cuenta los pasos y kilómetros que hago a lo largo del día, me muestra notificaciones cuando recibo llamadas, mensajes, etc... me avisa cuando llevo demasiado tiempo inactivo; si llevo el móvil, me permite controlar actividades como carrera, cinta de correr, ciclismo o paseo y registrar el recorrido usando el gps del móvil, etc...

La única pega que le pondría es que la pantalla no se ve muy bien en exteriores, y creo que eso es algo que debería mejorar Xiaomi permitiendo aumentar y disminuir el nivel de brillo.

Cuando la compré en pre-venta, costaba algo más de 40 euros, pero ahora mismo es posible comprarla por menos de 25 euros en GearBest con envío desde España.

Gearbest Mi Band 2
Comprar en GearBest
Éstas son sus principales características:
  • Pantalla OLED con un sólo botón táctil que nos permitirá mostrar la hora/fecha, pasos, distancia recorrida, calorías, ritmo cardíaco y batería.
  • Sincronización con el móvil mediante Bluetooth 4.0
  • Monitor de frecuencia cardíaca para controlar nuestras pulsaciones en cualquier momento.
  • Monitor del sueño que registra la calidad del sueño, informándonos del tiempo que hemos dormido en sueño profundo, ligero, así como el tiempo que hemos permanecido despierto.
  • Función reloj. Se sincroniza con la hora del teléfono.
  • Función de alarma. Nos permitirá programar diferentes alarmas en diferentes días de la semana.
  • Monitor de sedentarismo que nos avisará cuando llevemos mucho tiempo inactivos.
  • Seguimiento de deportes grabando datos de pasos, caloría, distancia, etc...
  • Notificaciones de llamadas entrantes y aplicaciones de mensajería.
    Protección IP67 frente al polvo y el agua.
  • Soporte Android 4.4 o superior y iOS 7.0 o superior con Bluetooth 4.0.
La aplicación para gestionar y configurar nuestra Mi Band 2 se llama "Mi Fit". Podéis encontrarla en "App Store" o "Google Play". No obstante, para Android, encontraréis las versiones más recientes en APKMirror.


No tendréis que preocuparos de las actualizaciones puesto que el sistema se actualiza automáticamente vía bluetooth cuando hay alguna nueva versión:


En las siguientes imágenes os muestro cómo podéis controlar algunas actividades deportivas utilizando vuestro smartphone y la Xiaomi Mi Band 2:



Si queréis, podéis echar un vistado a la video-review de GearBest:



Si os animáis a comprarla, os recomiendo hacerlo en el sitio de GearBest España:

Comprar en GearBest

En el enlace del sitio de España, es posible elegir entre dos almacenes:


Si escogéis el segundo (EG-W-16), la recibiréis enseguida. En cualquier caso, en ambos tendréis garantía de dos años. 

El manual de usuario es muy sencillo:


El contenido del paquete es el siguiente:
  • Xiaomi Mi Band 2
  • Pulsera
  • Cargador
La pulsera que viene en la caja es de color negro. Si queréis, podéis comprar correas de diferentes colores y materiales:

Comprar en GearBest

Si por alguna razón, perdéis el cargador, también podéis comprarlo en GearBest:


Comprar en GearBest

También se vende un collar para llevar el dispositivo colgado del cuello:

Comprar en GearBest

Publicado por primera vez en http://enavas.blogspot.com.es

by [email protected] (Esteban M. Navas Martín) at February 21, 2018 11:26 PM

Paquete pkgsync 1.46: Añadido KEEP_LAST_KERNELS para elegir el número de kernels a mantener

He actualizado el paquete pkgsync a la versión 1.46 con una versión modificada del script /usr/local/sbin/pkgsync y del fichero de configuración /etc/default/pkgsync.

Las modificaciones introducen una nueva variable ( KEEP_LAST_KERNELS) en el fichero de configuración /etc/default/pkgsync que nos permite indicar el número de kernels que deseamos mantener al purgar kernels antiguos. Si no se especifica ningún valor, o el valor de la variable es nulo,  por defecto, se mantendrán los dos últimos kernels.
      Aquí podéis ver el código completo de pkgsync:


      A continuación podéis ver el fichero de configuración con todas las variables que se pueden modificar en la actualidad:
      # Defaults for pkgsync
      #
      # See /usr/share/doc/pkgsync/README.Debian for information about options
      # of managing pkgsync.

      # Ignorar ficheros de configuración musthave, mayhave o maynothave
      IGNORE_MUSTHAVE="no"
      IGNORE_MAYHAVE="no"
      IGNORE_MAYNOTHAVE="no"

      # Activar o desactivar pkgsync:
      # ENABLE="yes": activa pkgsync (opción por defecto)
      # ENABLE="no" : desactiva pkgsync
      # Si no existe la variable ENABLE o no tiene valor, es equivalente al valor 'yes'.
      ENABLE="yes"

      # Eliminar kernels antiguos (por defecto deja los dos últimos)
      # PURGE_OLD_KERNELS="no": no elimina kernels antiguos (opción por defecto)
      # PURGE_OLD_KERNELS="yes": elimina kernels antiguos
      PURGE_OLD_KERNELS="no"

      # Número de kernels que se desea conservar (por defecto deja los dos últimos)
      # Si no existe la variable KEEP_LAST_KERNELS o no tiene valor, es equivalente al valor '2'.
      # KEEP_LAST_KERNELS="2"

      # Eliminar dependencias de paquetes desinstalados, purgar paquetes desinstalados y limpiar la cache
      # CLEAN="no": no hacer limpieza (opción por defecto)
      # CLEAN="yes": hacer limpieza
      CLEAN="no"

      # Eliminar librerías huérfanas
      # REMOVE_ORPHAN_LIBS="no": no eliminar librerías huérfanas (opción por defecto)
      # REMOVE_ORPHAN_LIBS="yes": eliminar librerías huérfanas
      REMOVE_ORPHAN_LIBS="no"

      # Iniciar sinc_puppet antes de lanzar pkgsync para garantizar que los ficheros de pkgsync
      # se encuentren actualizados
      # LAUNCH_SINC_PUPPET="no": no iniciar sinc_puppet antes de hacer pkgsync
      # LAUNCH_SINC_PUPPET="yes": iniciar sinc_puppet antes de hacer pkgsync (opción por defecto)
      LAUNCH_SINC_PUPPET="yes"

      # Apagar automáticamente el equipo después de ejecutar pkgsync en el intervalo especificado
      # AUTOMATIC_SHUTDOWN_BETWEEN="22:00-06:00"
      AUTOMATIC_SHUTDOWN_BETWEEN=""

      # Reiniciar automáticamente el equipo después de ejecutar pkgsync en el intervalo especificado
      # AUTOMATIC_REBOOT_BETWEEN="06:01-08:00"
      AUTOMATIC_REBOOT_BETWEEN=""

      # Obtener claves de repositorios mediante launchpad-getkeys si launchpad-getkeys se encuentra
      # instalado
      # LAUNCHPAD_GETKEYS="no": no tratar de obtener claves mediante launchpad-getkeys
      # LAUNCHPAD_GETKEYS="yes": tratar de obtener claves mediante launchpad-getkeys (opción por defecto)
      LAUNCHPAD_GETKEYS="yes"

      # Definimos un tiempo máximo de espera a que dpkg o apt hayan terminado antes de realizar pkgsync
      # Este parámetro sirve para evitar evitar que pkgsync quede bloqueado por un fallo anterior de dpkg o apt
      # Este ajuste puede definirse en segundos (30 o 30s), minutos (10m), horas (6h) o días (2d).
      # TIMEOUT_FOR_DPKG_OR_APT="3m": Esperar un tiempo máximo de 3 minutos (valor por defecto)
      TIMEOUT_FOR_DPKG_OR_APT="3m"
      Y si queréis descargar el paquete que instala esta versión, aquí lo tenéis:
      https://drive.google.com/open?id=1ZVaj_CYln71tj7b55bBGkbG2zPOJsnX2
      Publicado por primera vez en http://enavas.blogspot.com.es

      by [email protected] (Esteban M. Navas Martín) at February 21, 2018 01:15 PM

      Obtener el hash md5 de todos los ficheros en un árbol de directorios

      Para obtener el hash md5 de todos los ficheros en un árbol de directorios no tenemos más que usar la siguiente combinación de comandos:
      # find directorio -type f -print0  | xargs -0 md5sum > md5sums
      Ésto es particularmente útil cuando estamos modificando un paquete debian a mano.
      Publicado por primera vez en http://enavas.blogspot.com.es

      by [email protected] (Esteban M. Navas Martín) at February 21, 2018 12:20 PM

      Servicio Upstart para realizar un pkgsync completo y reiniciar en Ubuntu Trusty

      Como ya sabéis en los centros educativos de Extremadura, usamos pkgsync para mantener un software uniforme en el conjunto de máquinas que administramos.

      El siguiente es un servicio Upstart que tengo añadido a las máquinas Ubuntu Trusty de mi centro:

      /etc/init/autopkgsync.conf
      # autopkgsync
      #
      description "Do a full autopkgsync on runlevel 3 and reboot"
      author "Esteban M. Navas Martín"

      start on (runlevel [3] and local-filesystems and net-device-up IFACE!=lo)
      stop on runlevel [!2345]

      respawn
      exec /usr/local/sbin/pkgsync -pcrR </dev/tty1 >/dev/tty1 2>&1

      Como ya os podréis imaginar, ésta es una de esas cosas en las que, como todo administrador, trabajo para trabajar menos...

      Básicamente, lo que me permite el servicio es realizar un pkgsync completo que:
      • Actualiza los paquetes de la máquina.
      • Hace un purge de kernels antiguos.
      • Elimina dependencias de paquetes desinstalados, hace un purge de paquetes desinstalados y limpia la caché.
      • Elimina librerías huérfanas.
      • Y reinicia el equipo.
      Si echáis un vistazo a la configuración del servicio, veréis que sólo se inicia en el nivel 3, cuando los sistemas de ficheros locales están montados y las interfaces de red levantadas. Como Ubuntu inicia por defecto en el nivel 2, podéis comprobar que el servicio está parado:
      # status autopkgsync 
      autopkgsync stop/waiting
      Y si quiero realizar el pkgsync completo, no tengo más que iniciar el servicio:
      # start autopkgsync 
      autopkgsync start/running, process 4411
      Como estamos derivando la salida al terminal 1, si la máquina se encuentra en el entorno gráfico, no tenemos más que pulsar Ctrl+Alt+F1 para ver el estado de ejecución de pkgsync.

      También podría iniciar el servicio, simplemente cambiando al runlevel 3:
      # telinit 3 
      El servicio me resulta muy útil cuando necesito iniciar la actualización de un equipo y marcharme sin esperar porque sé que, cuando termine, se va a reiniciar; y quiero que el usuario vea en el terminal que la máquina está trabajando.
      Publicado por primera vez en http://enavas.blogspot.com.es

      by [email protected] (Esteban M. Navas Martín) at February 21, 2018 11:36 AM

      February 20, 2018

      enavas.blogspot.com.es

      El shell de linux: Comando column

      El comando column es uno de esos comandos a los que no le ves la utilidad hasta que lo necesitas, y la verdad es que es bastante útil.

      Por ejemplo, supongamos que tenemos un fichero csv (comma-separated values). Para los que no lo sepan, un fichero csv es un fichero en el que existen campos de datos separados mediante un símbolo (coma, punto, dos puntos, etc...) y que utilizamos mucho a la hora de importar/exportar datos.

      $ cat /usr/share/distro-info/ubuntu.csv
      version,codename,series,created,release,eol,eol-server
      4.10,Warty Warthog,warty,2004-03-05,2004-10-20,2006-04-30
      5.04,Hoary Hedgehog,hoary,2004-10-20,2005-04-08,2006-10-31
      5.10,Breezy Badger,breezy,2005-04-08,2005-10-12,2007-04-13
      6.06 LTS,Dapper Drake,dapper,2005-10-12,2006-06-01,2009-07-14,2011-06-01
      6.10,Edgy Eft,edgy,2006-06-01,2006-10-26,2008-04-25
      7.04,Feisty Fawn,feisty,2006-10-26,2007-04-19,2008-10-19
      7.10,Gutsy Gibbon,gutsy,2007-04-19,2007-10-18,2009-04-18
      8.04 LTS,Hardy Heron,hardy,2007-10-18,2008-04-24,2011-05-12,2013-05-09
      8.10,Intrepid Ibex,intrepid,2008-04-24,2008-10-30,2010-04-30
      9.04,Jaunty Jackalope,jaunty,2008-10-30,2009-04-23,2010-10-23
      9.10,Karmic Koala,karmic,2009-04-23,2009-10-29,2011-04-29
      10.04 LTS,Lucid Lynx,lucid,2009-10-29,2010-04-29,2013-05-09,2015-04-29
      10.10,Maverick Meerkat,maverick,2010-04-29,2010-10-10,2012-04-10
      11.04,Natty Narwhal,natty,2010-10-10,2011-04-28,2012-10-28
      11.10,Oneiric Ocelot,oneiric,2011-04-28,2011-10-13,2013-05-09
      12.04 LTS,Precise Pangolin,precise,2011-10-13,2012-04-26,2017-04-26
      12.10,Quantal Quetzal,quantal,2012-04-26,2012-10-18,2014-05-16
      13.04,Raring Ringtail,raring,2012-10-18,2013-04-25,2014-01-27
      13.10,Saucy Salamander,saucy,2013-04-25,2013-10-17,2014-07-17
      14.04 LTS,Trusty Tahr,trusty,2013-10-17,2014-04-17,2019-04-17
      14.10,Utopic Unicorn,utopic,2014-04-17,2014-10-23,2015-07-23
      15.04,Vivid Vervet,vivid,2014-10-23,2015-04-23,2016-01-23
      15.10,Wily Werewolf,wily,2015-04-23,2015-10-22,2016-07-22
      16.04 LTS,Xenial Xerus,xenial,2015-10-22,2016-04-21,2021-04-21
      16.10,Yakkety Yak,yakkety,2016-04-21,2016-10-13,2017-07-20
      17.04,Zesty Zapus,zesty,2016-10-13,2017-04-13,2018-01-25
      17.10,Artful Aardvark,artful,2017-04-13,2017-10-19,2018-07-19
      Y queremos mostrarlo en forma de columnas. Pues bien, si hacemos uso del comando column, ésto es algo realmente sencillo:
      $ column -t -s, /usr/share/distro-info/ubuntu.csv
      version    codename          series    created     release     eol         eol-server
      4.10 Warty Warthog warty 2004-03-05 2004-10-20 2006-04-30
      5.04 Hoary Hedgehog hoary 2004-10-20 2005-04-08 2006-10-31
      5.10 Breezy Badger breezy 2005-04-08 2005-10-12 2007-04-13
      6.06 LTS Dapper Drake dapper 2005-10-12 2006-06-01 2009-07-14 2011-06-01
      6.10 Edgy Eft edgy 2006-06-01 2006-10-26 2008-04-25
      7.04 Feisty Fawn feisty 2006-10-26 2007-04-19 2008-10-19
      7.10 Gutsy Gibbon gutsy 2007-04-19 2007-10-18 2009-04-18
      8.04 LTS Hardy Heron hardy 2007-10-18 2008-04-24 2011-05-12 2013-05-09
      8.10 Intrepid Ibex intrepid 2008-04-24 2008-10-30 2010-04-30
      9.04 Jaunty Jackalope jaunty 2008-10-30 2009-04-23 2010-10-23
      9.10 Karmic Koala karmic 2009-04-23 2009-10-29 2011-04-29
      10.04 LTS Lucid Lynx lucid 2009-10-29 2010-04-29 2013-05-09 2015-04-29
      10.10 Maverick Meerkat maverick 2010-04-29 2010-10-10 2012-04-10
      11.04 Natty Narwhal natty 2010-10-10 2011-04-28 2012-10-28
      11.10 Oneiric Ocelot oneiric 2011-04-28 2011-10-13 2013-05-09
      12.04 LTS Precise Pangolin precise 2011-10-13 2012-04-26 2017-04-26
      12.10 Quantal Quetzal quantal 2012-04-26 2012-10-18 2014-05-16
      13.04 Raring Ringtail raring 2012-10-18 2013-04-25 2014-01-27
      13.10 Saucy Salamander saucy 2013-04-25 2013-10-17 2014-07-17
      14.04 LTS Trusty Tahr trusty 2013-10-17 2014-04-17 2019-04-17
      14.10 Utopic Unicorn utopic 2014-04-17 2014-10-23 2015-07-23
      15.04 Vivid Vervet vivid 2014-10-23 2015-04-23 2016-01-23
      15.10 Wily Werewolf wily 2015-04-23 2015-10-22 2016-07-22
      16.04 LTS Xenial Xerus xenial 2015-10-22 2016-04-21 2021-04-21
      16.10 Yakkety Yak yakkety 2016-04-21 2016-10-13 2017-07-20
      17.04 Zesty Zapus zesty 2016-10-13 2017-04-13 2018-01-25
      17.10 Artful Aardvark artful 2017-04-13 2017-10-19 2018-07-19
      Si habéis leído el post anterior, habréis visto que tiene una lista de juegos ordenada en columnas. Pues bien, como podéis imaginar, también podemos utilizar el comando column para transformar un fichero que tiene un dato por cada línea (en este caso el nombre de un juego) en un fichero que tiene datos en columnas. Veamos un ejemplo:
      $ head -20 listajuegos
      CONTRA 1 
      CONTRA FORC
      CONTRA 7
      KAGE
      SOPER MARIO
      MARIO 3
      MARIO 6
      DR MARIO
      MARIO BROS
      TURTLES 1
      TURTLES 4
      DOUBLE DRAGON
      DOUBLE DRAGON 2
      MEGA MAN 3
      BLOOD WRESTLE
      BLOOD SOCCER2
      ADVEN ISLAND
      ADVEN ISLAND 2
      CHIP DALE 1
      CHIP DALE 3
      Si queremos mostrar los 20 primeros juegos de una lista en columnas, haremos lo siguiente:
      $ head -20 listajuegos | sort -u | column 
      ADVEN ISLAND CONTRA 7 MARIO 6
      ADVEN ISLAND 2 CONTRA FORC MARIO BROS
      BLOOD SOCCER2 DOUBLE DRAGON MEGA MAN 3
      BLOOD WRESTLE DOUBLE DRAGON 2 SOPER MARIO
      CHIP DALE 1 DR MARIO TURTLES 1
      CHIP DALE 3 KAGETURTLES 4
      CONTRA 1 MARIO 3
      Si os dáis cuenta, para crear el listado en columnas, primero se rellenan las columnas y luego las filas.

      Si queréis que primero se rellenen las filas y luego las columnas, no tenéis más que usar el parámetro -x en el comando column:
      $ head -20 listajuegos | sort -u | column -x
      ADVEN ISLAND ADVEN ISLAND 2 BLOOD SOCCER2
      BLOOD WRESTLE CHIP DALE 1 CHIP DALE 3
      CONTRA 1 CONTRA 7 CONTRA FORC
      DOUBLE DRAGON DOUBLE DRAGON 2 DR MARIO
      KAGEMARIO 3 MARIO 6
      MARIO BROS MEGA MAN 3 SOPER MARIO
      TURTLES 1 TURTLES 4

      Publicado por primera vez en http://enavas.blogspot.com.es

      by [email protected] (Esteban M. Navas Martín) at February 20, 2018 08:04 AM