Underc0de

Programación General => C / C++ => Mensaje iniciado por: DtxdF en Abril 08, 2020, 07:48:05 AM

Título: CLIConfig: Una utilidad para manipular archivos de configuración .CONF
Publicado por: DtxdF en Abril 08, 2020, 07:48:05 AM
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) [Seleccionar]
git clone https://github.com/DtxdF/CLIConfig.git
cd ./CLIConfig
sudo make install
man CLIConfig # o CLIConfig -h


Repositorio: github.com/DtxdF/CLIConfig

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) [Seleccionar]
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) [Seleccionar]
[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) [Seleccionar]
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) [Seleccionar]
CLIConfig -k server -s dnsmasq.conf

El resultado sería el siguiente

Código (text) [Seleccionar]
[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) [Seleccionar]
cp /etc/wvdial.conf .
CLIConfig -s dnsmasq.conf wvdial.conf


Resultado:

Código (text) [Seleccionar]
[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) [Seleccionar]
CLIConfig -s /etc/wvdial.conf -k "Username "

Resultado:

Código (text) [Seleccionar]
[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) [Seleccionar]
CLIConfig dnsmasq.conf -k server -v 8.8.8.8 -o

Código (text) [Seleccionar]
[Procesando: dnsmasq.conf]

¡server ha sido modificado con éxito!

[Procesado: dnsmasq.conf]


Si vemos el archivo modificado:

Código (bash) [Seleccionar]
cat dnsmasq.conf

Código (text) [Seleccionar]
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) [Seleccionar]
CLIConfig dnsmasq.conf -k server -v 8.8.4.4 -o -p 2
...
cat dnsmasq.conf


Código (bash) [Seleccionar]
...
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) [Seleccionar]
CLIConfig dnsmasq.conf -k dhcp-range -v wlan0,10.42.0.2,10.42.0.254,5h -w

Código (text) [Seleccionar]
[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) [Seleccionar]
CLIConfig dnsmasq.conf -d -k server

Eliminar sólo la segunda coincidencia:

Código (bash) [Seleccionar]
CLIConfig dnsmasq.conf -d -k server -p 2

Ver la ayuda:

Código (bash) [Seleccionar]
CLIConfig -h

Funcionamiento de cada parámetro


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:


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) [Seleccionar]
clave=valor

Ejemplo de la librería

Primero compilamos la librería:

Código (bash) [Seleccionar]
make conf_parser.o

Teniendo el siguiente archivo de configuración:

Código (bash) [Seleccionar]
cat test.conf
Código (text) [Seleccionar]
name=Josef
lastname=Naranjo
age=17
alias=DtxdF


Y teniendo el siguiente parser (test.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) [Seleccionar]
gcc -Wall -O2 -o program test.c conf_parser.o strip.o
./program


Y obtenemos:

Código (text) [Seleccionar]
Información del sujeto:
----------------------

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


TODO


Gracias a

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

~ DtxdF
Título: Re:CLIConfig: Una utilidad para manipular archivos de configuración .CONF
Publicado por: ??????? en Abril 08, 2020, 01:51:29 PM
Interesante herramienta y buen post compañero, la probaré más tarde  :)

Saludos!
-Kirari
Título: Re:CLIConfig: Una utilidad para manipular archivos de configuración .CONF
Publicado por: DtxdF en Abril 08, 2020, 02:26:43 PM
Gracias @Kirari (https://underc0de.org/foro/index.php?action=profile;u=92682)  :D

~ DtxdF