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

  • 2 Respuestas
  • 547 Vistas

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

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 730
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
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
  1. git clone https://github.com/DtxdF/CLIConfig.git
  2. cd ./CLIConfig
  3. sudo make install
  4. 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
  1. cd /tmp
  2. cp /etc/dnsmasq.conf .
  3. 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
  1. [Procesando: dnsmasq.conf]
  2.  
  3. domain-needed
  4. bogus-priv
  5. no-resolv
  6. log-queries
  7. log-dhcp
  8. log-facility=/var/log/dnsmasq.log
  9. server=1.1.1.1
  10. server=1.0.0.1
  11. dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
  12. interface=eth0
  13.  
  14. [Procesado: dnsmasq.conf]

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

Código: Text
  1. domain-needed
  2. bogus-priv
  3. no-resolv
  4. log-queries
  5. log-dhcp
  6. log-facility=/var/log/dnsmasq.log
  7. server=1.1.1.1
  8. server=1.0.0.1
  9. dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
  10. interface=eth0

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

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

El resultado sería el siguiente

Código: Text
  1. [Procesando: dnsmasq.conf]
  2.  
  3. server=1.1.1.1
  4. server=1.0.0.1
  5.  
  6. [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
  1. cp /etc/wvdial.conf .
  2. CLIConfig -s dnsmasq.conf wvdial.conf

Resultado:

Código: Text
  1. [Procesando: dnsmasq.conf]
  2.  
  3. domain-needed
  4. bogus-priv
  5. no-resolv
  6. log-queries
  7. log-dhcp
  8. log-facility=/var/log/dnsmasq.log
  9. server=1.1.1.1
  10. server=1.0.0.1
  11. dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
  12. interface=eth0
  13.  
  14. [Procesado: dnsmasq.conf]
  15. [Procesando: wvdial.conf]
  16.  
  17. [Dialer Defaults]
  18. Init1 = ATZ
  19. Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
  20. Modem Type = Analog Modem
  21. Baud = 9600
  22. New PPPD = yes
  23. Modem = /dev/ttyUSB2
  24. ISDN = 0
  25. Phone = *99
  26. Password = none
  27. Username = none
  28.  
  29. [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
  1. CLIConfig -s /etc/wvdial.conf -k "Username "

Resultado:

Código: Text
  1. [Procesando: /etc/wvdial.conf]
  2.  
  3. Username = none
  4.  
  5. [Procesado: /etc/wvdial.conf]

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

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

Código: Text
  1. [Procesando: dnsmasq.conf]
  2.  
  3. ¡server ha sido modificado con éxito!
  4.  
  5. [Procesado: dnsmasq.conf]

Si vemos el archivo modificado:

Código: Bash
  1. cat dnsmasq.conf

Código: Text
  1. domain-needed
  2. bogus-priv
  3. no-resolv
  4. log-queries
  5. log-dhcp
  6. log-facility=/var/log/dnsmasq.log
  7. server=8.8.8.8
  8. server=8.8.8.8
  9. dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
  10. 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
  1. CLIConfig dnsmasq.conf -k server -v 8.8.4.4 -o -p 2
  2. ...
  3. cat dnsmasq.conf

Código: Bash
  1. ...
  2. server=8.8.8.8
  3. server=8.8.4.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
  1. CLIConfig dnsmasq.conf -k dhcp-range -v wlan0,10.42.0.2,10.42.0.254,5h -w

Código: Text
  1. [Procesando: dnsmasq.conf]
  2.  
  3. Escrito: dhcp-range=wlan0,10.42.0.2,10.42.0.254,5h
  4.  
  5. [Procesado: dnsmasq.conf]

Para eliminar todas las claves coincidentes:

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

Eliminar sólo la segunda coincidencia:

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

Ver la ayuda:

Código: Bash
  1. 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
  1. clave=valor

Ejemplo de la librería

Primero compilamos la librería:

Código: Bash
  1. make conf_parser.o

Teniendo el siguiente archivo de configuración:

Código: Bash
  1. cat test.conf
Código: Text
  1. name=Josef
  2. lastname=Naranjo
  3. age=17
  4. alias=DtxdF

Y teniendo el siguiente parser (test.c):

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5.  
  6. #include "conf_parser.h"
  7.  
  8. #define CMP(x,y) strcmp(x, y) == 0
  9.  
  10. struct configuration {
  11.    char * name;
  12.    char * lastname;
  13.    long age;
  14.    char * alias;
  15.  
  16. };
  17.  
  18. int parser(void * config, char * key, char * value) {
  19.    struct configuration * conf = (struct configuration *)config;
  20.    char *endstr;
  21.  
  22.    if (CMP(key, "name")) {
  23.       conf->name = strdup(value);
  24.    
  25.    } else if (CMP(key, "lastname")) {
  26.       conf->lastname = strdup(value);
  27.    
  28.    } else if (CMP(key, "age")) {
  29.       conf->age = You are not allowed to view links. Register or Login(value, &endstr, 10);
  30.  
  31.       if (errno != 0) {
  32.          return errno;
  33.      
  34.       }
  35.    
  36.    } else if (CMP(key, "alias")) {
  37.       conf->alias = strdup(value);
  38.    
  39.    } else {
  40.       return 3; // Cuando una clave no es válida (Opcional)
  41.    
  42.    }
  43.  
  44.    return 0;
  45.  
  46. }
  47.  
  48. int main(void) {
  49.    struct configuration config;
  50.    FILE * file;
  51.  
  52.    if ((file = You are not allowed to view links. Register or Login("test.conf", "rb")) == NULL) {
  53.       You are not allowed to view links. Register or Login("Error abriendo el archivo de configuración");
  54.                
  55.       return errno;
  56.    
  57.    }
  58.  
  59.    if (ini_parse(file, &config, parser) != 0) {
  60.       You are not allowed to view links. Register or Login("Ocurrio un error interpretando el archivo de configuración");
  61.  
  62.       return errno;
  63.    
  64.    }
  65.  
  66.    You are not allowed to view links. Register or Login("Información del sujeto:\n");
  67.    You are not allowed to view links. Register or Login("----------------------\n\n");
  68.  
  69.    You are not allowed to view links. Register or Login("Nombre: %s\n", config.name);
  70.    You are not allowed to view links. Register or Login("Apellido: %s\n", config.lastname);
  71.    You are not allowed to view links. Register or Login("Edad: %ld\n", config.age);
  72.    You are not allowed to view links. Register or Login("Alias: %s\n", config.alias);
  73.  
  74.    You are not allowed to view links. Register or Login(config.name);
  75.    You are not allowed to view links. Register or Login(config.lastname);
  76.    You are not allowed to view links. Register or Login(config.alias);
  77.  
  78.    You are not allowed to view links. Register or Login(file);
  79.  
  80.    return EXIT_SUCCESS;
  81.  
  82. }

Lo compilamos y ejecutamos:

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

Y obtenemos:

Código: Text
  1. Información del sujeto:
  2. ----------------------
  3.  
  4. Nombre: Josef
  5. Apellido: Naranjo
  6. Edad: 17
  7. 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
« Última modificación: Abril 11, 2020, 10:01:38 pm por DtxdF »
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Conectado Kirari

  • *
  • Moderador
  • Mensajes: 161
  • Actividad:
    100%
  • Country: ru
  • Reputación 9
  • No dejes que el mundo te corrompa
    • Ver Perfil
    • Baúl para el público
Interesante herramienta y buen post compañero, la probaré más tarde  :)

Saludos!
-Kirari
Jamás te contarán la verdadera versión, siempre te dirán la suya... Por eso... Si quieres saber la verdad, debes buscarla tú mismo...

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 730
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
Gracias @You are not allowed to view links. Register or Login  :D

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

 

Ahorcado_game hecho en cosola, Basico para realizar proyectos

Iniciado por vasilick

Respuestas: 2
Vistas: 4433
Último mensaje Febrero 07, 2018, 08:11:28 am
por Mr.Tru
Ideas para la programacion de w0rm's o malware en general

Iniciado por ksha

Respuestas: 4
Vistas: 4521
Último mensaje Abril 24, 2011, 11:24:11 pm
por Ahkbar
AsciitoX - conversor de texto para tu terminal

Iniciado por andergedon

Respuestas: 0
Vistas: 4789
Último mensaje Marzo 19, 2018, 02:35:17 am
por andergedon
Estructuras, para quien las quiera xD

Iniciado por binary112

Respuestas: 1
Vistas: 5563
Último mensaje Mayo 29, 2019, 05:56:23 pm
por ravenheart
Un poco sobre Qt y C++ para que se animen! :)

Iniciado por Turka

Respuestas: 5
Vistas: 11693
Último mensaje Julio 18, 2018, 02:41:04 pm
por K&R