CLIConfig: Una utilidad para manipular archivos de configuración .CONF

Iniciado por DtxdF, Abril 08, 2020, 07:48:05 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

CLIConfig: Parsea tus archivos de configuración desde la terminal

CLIConfig es una utilidad para la línea de comandos, pero la verdadera estrella de esta película es la librería que usa "conf_parser.h" qué es la encargada de leer los archivos de configuración.CONF mientras que la herramienta antes mencionada hace mucho más.

Instalación

Código: bash
git clone https://github.com/DtxdF/CLIConfig.git
cd ./CLIConfig
sudo make install
man CLIConfig # o CLIConfig -h


Repositorio: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Ejemplos de CLIConfig

CLIConfig ayudará a la persona que esté haciendo scripting y necesite interactuar con los archivos de configuración del sistema. Por lo que siguiendo las pautas que se mostrarán a continuación quedará más que claro:

En mi caso yo usaré el archivo de configuración de DNSMASQ, pero antes haré una copia para esta demostración

Código: bash
cd /tmp
cp /etc/dnsmasq.conf .
CLIConfig dnsmasq.conf -s


CLIConfig no lee comentarios que tengan almuadillas antepuestas (#) por lo que en mi caso se mostraría lo siguiente:

Código: text
[Procesando: dnsmasq.conf]

domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0

[Procesado: dnsmasq.conf]


Sí quisieramos eliminar el procesamiento se tendría que colocar el parámetro "-n" ó "--no-banner":

Código: text
domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0


Sí quisieramos mostrar las claves "server" sería de la siguiente manera:

Código: bash
CLIConfig -k server -s dnsmasq.conf


El resultado sería el siguiente

Código: text
[Procesando: dnsmasq.conf]

server=1.1.1.1
server=1.0.0.1

[Procesado: dnsmasq.conf]


Quiero recordar que todo lo que no sea un parámetro o un argumento de un parámetro es un considerado un archivo

Código: bash
cp /etc/wvdial.conf .
CLIConfig -s dnsmasq.conf wvdial.conf


Resultado:

Código: text
[Procesando: dnsmasq.conf]

domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0

[Procesado: dnsmasq.conf]
[Procesando: wvdial.conf]

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB2
ISDN = 0
Phone = *99
Password = none
Username = none

[Procesado: wvdial.conf]


CLIConfig no le quita los espacios a las claves, por lo que en el caso de wvdial se tendría que colocar espacios.

Código: bash
CLIConfig -s /etc/wvdial.conf -k "Username "


Resultado:

Código: text
[Procesando: /etc/wvdial.conf]

Username = none

[Procesado: /etc/wvdial.conf]


Para modificar los servidores DNS de dnsmasq.conf haríamos los siguiente:

Código: bash
CLIConfig dnsmasq.conf -k server -v 8.8.8.8 -o


Código: text
[Procesando: dnsmasq.conf]

¡server ha sido modificado con éxito!

[Procesado: dnsmasq.conf]


Si vemos el archivo modificado:

Código: bash
cat dnsmasq.conf


Código: text
domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=8.8.8.8
server=8.8.8.8
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0


No se ve tan bien... Y es por qué no le especificamos qué coincidencia deseamos modificar, por lo que lo hará con todos los que encuentre, para realizarlo:

Código: bash
CLIConfig dnsmasq.conf -k server -v 8.8.4.4 -o -p 2
...
cat dnsmasq.conf


Código: bash
...
server=8.8.8.8
server=8.8.4.4
...


NOTA: El parámetro "-o" ó "--overwrite" sobre-escribe el valor de la clave y el archivo, por lo que es mejor que hagamos un respaldo del anterior en casos reales

Para agregar una nueva clave:

Código: bash
CLIConfig dnsmasq.conf -k dhcp-range -v wlan0,10.42.0.2,10.42.0.254,5h -w


Código: text
[Procesando: dnsmasq.conf]

Escrito: dhcp-range=wlan0,10.42.0.2,10.42.0.254,5h

[Procesado: dnsmasq.conf]


Para eliminar todas las claves coincidentes:

Código: bash
CLIConfig dnsmasq.conf -d -k server


Eliminar sólo la segunda coincidencia:

Código: bash
CLIConfig dnsmasq.conf -d -k server -p 2


Ver la ayuda:

Código: bash
CLIConfig -h


Funcionamiento de cada parámetro


  • -h/--help: Muestra la ayuda
  • -s/--show: Muestra el archivo de configuración parseado
  • -k/--key: Coincidir con la clave
  • -w/--write: Agregar una clave y un valor a la configuración
  • -v/--value: El valor de la clave
  • -n/--no-banner: No mostrar el procesamiento de los que se está haciendo
  • -o/--overwrite: Sobre-escribe el valor de una(s) clave(s)
  • -E/--expression: Usar un valor como coincidencia en vez de la clave
  • -I/--init: Iniciar la interacción después de un número N
  • -O/--only: Sólo actuar con N filas
  • --offset: Lo mismo que --only
  • -i/--id: Actuar solamente cuando la llamada del callback número X sea igual a Y
  • -p/--pattern: Cuándo haya N coincidencias encontradas actuar con la que ajustó el usuario
  • -d/--delete: Borrar una clave

NOTA: Es necesario comprender el funcionamiento de cada parámetro que usa, ya que no todos funcionan de la misma manera y no todos se pueden combinar, además de los valores por defecto que fueron otorgados a éstos por el diseño del mismo programa.

Combinaciones:


  • -s/--show: -k/--key, -E/--expression, -O/--only, -i/--id, -p/--pattern, -I/--init
  • -k/--key: -v/--value, -w/--write, -s/--show, -o/--overwrite, -O/--only, -i/--id, -p/--pattern, -d/--delete, -I/--init
  • -w/--write: -k/--key, -v/--value
  • -v/--value: -k/--key, -w/--write, -o/--overwrite, -O/--only, -p/--pattern, -I/--init
  • -o/--overwrite: -k/--key, -v/--value, -E/--expression, -O/--only, -p/--pattern, -I/--init
  • -E/--expression: -s/--show, -v/--value, -o/--overwrite, -O/--only, -p/--pattern, -I/--init
  • -O/--only/--offset: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -i/--id, -p/--pattern, -d/--delete, -I/--init
  • -i/--id: -s/--show, -O/--only
  • -I/--init: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -p/--pattern, -d/--delete
  • -p/--pattern: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -O/--only, -d/--delete, -I/--init

NOTA-#1: El parámetro -n/--no-banner no fue colocado en la tabla porque se puede combinar con todos

NOTA-#2: Sí se define el parámetro -k/--key al mismo tiempo que -E/--expression, el segundo no se tomara en cuenta, pero si el primero.

NOTA-#3: El valor por defecto de los siguientes parámetros es "0", lo que quiere decir que no se hará nada al menos que se le coloque un número mayor: -O/--only, -i/--id, -p/--pattern.

Sintaxis de los archivos de configuración

La sintaxis de un archivo de configuración se rige de la siguiente manera:

Código: text
clave=valor


Ejemplo de la librería

Primero compilamos la librería:

Código: bash
make conf_parser.o


Teniendo el siguiente archivo de configuración:

Código: bash
cat test.conf

Código: text
name=Josef
lastname=Naranjo
age=17
alias=DtxdF


Y teniendo el siguiente parser (test.c):

Código: c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "conf_parser.h"

#define CMP(x,y) strcmp(x, y) == 0

struct configuration {
char * name;
char * lastname;
long age;
char * alias;

};

int parser(void * config, char * key, char * value) {
struct configuration * conf = (struct configuration *)config;
char *endstr;

if (CMP(key, "name")) {
conf->name = strdup(value);

} else if (CMP(key, "lastname")) {
conf->lastname = strdup(value);

} else if (CMP(key, "age")) {
conf->age = strtol(value, &endstr, 10);

if (errno != 0) {
return errno;

}

} else if (CMP(key, "alias")) {
conf->alias = strdup(value);

} else {
return 3; // Cuando una clave no es válida (Opcional)

}

return 0;

}

int main(void) {
struct configuration config;
FILE * file;

if ((file = fopen("test.conf", "rb")) == NULL) {
perror("Error abriendo el archivo de configuración");
               
      return errno;

}

if (ini_parse(file, &config, parser) != 0) {
perror("Ocurrio un error interpretando el archivo de configuración");

return errno;

}

printf("Información del sujeto:\n");
printf("----------------------\n\n");

printf("Nombre: %s\n", config.name);
printf("Apellido: %s\n", config.lastname);
printf("Edad: %ld\n", config.age);
printf("Alias: %s\n", config.alias);

free(config.name);
free(config.lastname);
free(config.alias);

fclose(file);

return EXIT_SUCCESS;

}


Lo compilamos y ejecutamos:

Código: bash
gcc -Wall -O2 -o program test.c conf_parser.o strip.o
./program


Y obtenemos:

Código: text
Información del sujeto:
----------------------

Nombre: Josef
Apellido: Naranjo
Edad: 17
Alias: DtxdF


TODO


  • Auto-completado de comandos
  • Manpage
  • Verificador de sintaxis

Gracias a

Ustedes lectores por otra oportunidad. Comentarios, Reportes o alguna interacción sería excelente  ;)

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Interesante herramienta y buen post compañero, la probaré más tarde  :)

Saludos!
-Kirari

Gracias @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta  :D

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF