Fullmenu null

 

13 October 2017

El caso que vamos a tratar es la modificación del contenido de un fichero con el formato clave:valor.

Si trabajamos con varias máquinas, seguramente nos hayamos encontrado con que cada una de ellas tiene ficheros de configuración que indiquen la url de la base de datos a la que debe conectectarse, messages.properties de nuestra aplicación …​

El problema de trabajar con estos ficheros es que en la mayoría de los casos, sobre todo cuando hablamos de ficheros de configuración, son personalizados y en el caso de tener que cambiar algún valor debemos de tener mucho cuidado ya que no son ficheros que podamos copiar a todas nuestras maquinas de manera masiva porque dedemos respetar la configuración que tienen cada uno de ellos.

A continuación vamos a explicar como crear un script que modifique el usuario con el que hacemos la conexión a la base de datos en base a cierta condición propia de la máquina.

Note
Vamos a usar una herramienta que ya hemos utilizado en alguno de nuestros scripts sshoogr.
  • Añadimos la dependencia de sshoogr

    @Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
    @GrabConfig(systemClassLoader=true)
  • Definimos el nombre del servidor y el de nuestro fichero de configuración.

    def server_name = "server_1"
    def file_config = '/tmp/file.properties'
  • Creamos el método de lectura de nuestro fichero

    def getFile(file_config,server_name){
      remoteSession("user:passwd@$server_name:22") {// (1)
            result =  remoteFile(file_config).text // (2)
      }
      return result.readLines()// (3)
    }
    1. Establecemos los parámtros de conexión usuario = user, contraseña = passwd mientras que el servidor es variable.

    2. En la función remoteFile le pasamos por parámetro la ruta complete la fichero.

    3. Con la función readLines obtenemos una lista con el contenido del fichero.

  • Creamos el método para sobreescribir el fichero con los datos actualizados

    def putFile(file_name,server_name,new_file){
        remoteSession("user:passwd@$server_name:22") {// (1)
            remoteFile(dir).text = properties // (2)
        }
    }
    1. Establecemos los parámtros de conexión usuario = user, contraseña = passwd mientras que el servidor es variable.

    2. Actualizamos el contenido de nuestro fichero de configuración.

  • Aplicamos la lógica de sustitución. En nuestro caso vamos a cambiar la variable user.sql por el valor de una variable de entorno más una cadena fija _changeme

    def read = getFile(file_config,server_name) // (1)
    
    def properties = read.collect{
        if (it.startWith("user.sql")){ // (2)
             return "user.sql=${System.getenv('HOSTNAME')}_changeme"
        }
        return it
    }.join('\n')
    
    putFile(file_config,server_name,properties)// (3)
    1. Lo primero que hacemos es emplear nuestra función getFile para obtener en contenido del fichero.

    2. Si econtramos la clave en nuestro fichero que queremos actualizar la modificamos y si no saltamos a la siguiente linea.

    3. Llamaremos a nuestro método putFile el cúal nos actualizará el contenido de nuestro fichero de configuración.

    Note
    Si te da error al conectar con el host, prueba a desactivar la comprobación estricta de la clave del host:
    options.trustUnknownHosts = true

Script
//tag::dependencies[]
@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
//end::dependencies[]

import static com.aestasit.infrastructure.ssh.DefaultSsh.*

options.trustUnknownHosts = true

//tag::config[]
def server_name = "server_1"
def file_config = '/tmp/file.properties'
//end::config[]

//tag::main[]
def read = getFile(file_config,server_name) // (1)

def properties = read.collect{
    if (it.startWith("user.sql")){ // (2)
         return "user.sql=${System.getenv('HOSTNAME')}_changeme"
    }
    return it
}.join('\n')

putFile(file_config,server_name,properties)// (3)
//end::main[]

//tag::write[]
def putFile(file_name,server_name,new_file){
    remoteSession("user:passwd@$server_name:22") {// (1)
        remoteFile(dir).text = properties // (2)
    }
}
//end::write[]

//tag::read[]
def getFile(file_config,server_name){
  remoteSession("user:passwd@$server_name:22") {// (1)
        result =  remoteFile(file_config).text // (2)
  }
  return result.readLines()// (3)
}
//end::read[]