Creeu un mòdul per a Gentoo eselect

Escrit el 23 d'octubre 2009 / / Open Source .

Faig eselect Amor!

gentoo eselect Create a module for Gentoo Eselect Per aquells que no saben eselect és una «administració de configuració modular i el marc. En paraules més simples és una eina de gestió inclòs en Gentoo, capaç de canviar entre les versions i paquets d'arxius de configuració, treballant amb els enllaços simbòlics i les variables ambientals.

Només per aclarir millor treball eselect, és capaç de fer canviar entre versions de Java VM, comunicats de Python, els compiladors gcc i que permet escollir el seu editor preferit.

Eselect és una eina modular, el que significa que només ha de crear un simple. Eselect arxiu per fer-ho córrer seus propis comandes. El que vaig a explicar a continuació és com crear un mòdul simple de fer servir un enllaç simbòlic.

Objectiu del tutorial

El que vull aconseguir amb aquest petit tutorial és crear un senzill interruptor per canviar ràpidament el meu / etc / resolv.conf. Aquest arxiu indica a qualsevol interfície de xarxa on buscar la resolució de DNS.

Igual que en els darrers dies he tingut problemes amb el DNS, em vaig veure obligat a canviar molt sovint del meu programa de resolució de domini per defecte (aquest cas un servidor intern) a un extern (Obert). Usant eselect per a aquest fi realment em va simplificar la vida!

Preparació: crear les alternatives "

Com volem canviar entre dues configuracions diferents que hem de crear aquestes alternatives. Obre un terminal, cd / etc i crear els arxius. He creat una trucada i un resolv.orig resolv.opends anomenat, que s'utilitzarà quan resolució DNS local s'ha reduït.

  # Anar al directori / etc
 cd / etc
 # Còpia original resolv.conf
 # Per a la primera alternativa
 cp resolv.conf resolv.orig
 # La creació d'alternatives noves resolv.conf
 # Using OpenDNS IP
 echo-e "nameserver 208.67.222.222 \ nnameserver 208.67.220.220"> resolv.prova 

Ara hem de esborrar el fitxer original i substituir-lo per un enllaç simbòlic, òbviament a la orig arxiu.

  # Eliminació d'arxiu físic
 rm resolv.conf
 # Crear l'enllaç simbòlic
 ln-s resolv.conf resolv.orig 

Hem acabat amb pre-configuració, anem a procedir a la creació del mòdul eselect

Crear el mòdul

Per una guia completa per desenvolupadors eselect creació de mòduls, si us plau aneu a Gentoo Wiki guia oficial . Això és només una "guia d'exemples" per a un començament ràpid.

En primer lloc tots els mòduls eselect ha d'estar ubicat a / usr / share / eselect / modules, així que anar enllà i crear una nova. Eselect arxiu

  # A l'entrar en mòduls eselect directori
 cd / usr / share / eselect / modules
 # Crear un arxiu nou mòdul
 toc resolv.eselect 

Ara fa servir el teu editor favorit per editar-lo. En aquest exemple estic fent servir vim

  Obertura # arxiu amb vim
 resolv.eselect vim 

Cap de la Secció


Com sempre, la secció de capçalera del fitxer conté la informació de metadades sobre el mòdul i l'autor, serà la mateixa rapidesa de revisar a continuació

  # -*- Vim eselect-*-: m = eselect
 # Copyright 1999-2009 Fundació Gentoo
 # Distribuït sota els termes de la GNU General Public License v2
 # $ Id: $

 # Això apareixerà a obtenir una llista dels mòduls disponibles
 DESCRIPTION = "Gestionar l'arxiu / etc / resolv.conf enllaç simbòlic"
 # Mantenidor de correu electrònic
 Mantenidor = "personal@andreaolivato.net"
 # Data, que serveix per crear una versió
 SVN_DATE = '$ Data: 10/23/2009 12:00:07 +0200 (dv, 23 octubre 2009) $'
 # La creació de la versió partir de la data
 VERSION = $ (svn_date_to_version "$ () SVN_DATE") 

Buscar les alternatives


La primera funció important que hem de crear és la cura de prendre una de la inclusió de totes les possibles alternatives que tenim per al nostre enllaç simbòlic. Això vol dir que vostè ha de mostrar tots els fitxers que poden estar vinculats a resolv.conf. En el nostre cas, només hi ha dos: resolv.orig i resolv.opendns.

El procediment més fàcil seria escriure els fitxers directament, però com volem aprendre com fer front a eselect correctament crearem una funció de bash per incloure una llista d'arxiu de dos. D'aquesta manera si en el futur ens agradaria crear una nova alternativa, no cal modificar el nostre codi.

En la funció que acabo d'enumerar a continuació (amb la comanda ls) tots els arxius que comencin per resoldre. a la carpeta / etc i després exclou (utilitzar grep-v) l'arxiu original, que és resolv.conf. D'aquesta manera podem afegir més alternativa mitjançant la creació d'arxius resolv.xxx. Aquí està el codi

  find_targets () (
     dels productes locals
     per p a $ (ls / etc / resoldrà .* | conf grep-v)
     fer
         echo $ p
     fer;
 ) 

Crear i eliminar l'enllaç simbòlic


Continuant amb el nostre codi, ara hem de ser capaços d'eliminar i crear l'enllaç simbòlic.

Per treure, només hem d'utilitzar la comanda rm com aquest

  remove_symlink () (
	 rm "/ etc / resolv.conf"
 ) 

Per crear l'enllaç simbòlic, hem de fer front a l'elecció dels usuaris. Aquesta opció està representada per un nombre, identificar l'arxiu per canviar el vincle. Això vol dir que hem de associar un paràmetre que es passa a la funció amb la posició de l'elecció a la nostra llista de fitxers.

  set_symlink () (
     # Obtenir el paràmetre
     locals target = $ (1)
     # Comprovem que és un nombre
     si is_number "$ (target)", a continuació,
         # Obtenir la llista dels fitxers mitjançant la funció creada anteriorment
         objectius locals = ($ (find_targets))
         # Obtenir l'arxiu associat amb el paràmetre passat
         $ (Target = metes objectiu [- 1])
     fil

     # Si el fitxer de resultats no existeix
     if [[-z "$ destí"]], a continuació,
         # Tenim la sortida d'un error
         moren-q "Target" $ (1) "no sembla ser vàlida!"
    # Si bé si és que existeix
     més
         # Creem l'enllaç
         ln-s "$ (target)" "/ etc / resolv.conf"
     fil
 ) 

Poseu les coses en conjunt


Ara tenim una funció a la llista, un per eliminar i un va a inserir. Hem de posar-los junts i canviar entre ells en funció de les opcions d'usuari. La següent funció rep el paràmetre de l'usuari, els controls, tregui el vincle actual si és que existeix i la crida de la funció de reenviament de crear el paràmetre.

  do_set () (

     if [[-z $ (1)]], a continuació,
         # Si no hi ha cap paràmetre es va aprovar
         moren-q "No em va dir el que per establir l'enllaç a"
     elif [[-L / etc / resolv.conf]], a continuació,
         # Si la relació que existeix ha de tractar de retirar
         si!  remove_symlink, a continuació,
             # Si no ho pot treure de sortida d'error
             moren-q "No és possible eliminar l'enllaç simbòlic existent"
         # Intenta crear
         Elif!  set_symlink "$ (1)", a continuació,
             # Si no pot crear, la sortida d'errors
             moren-q "No s'ha pogut establir un enllaç simbòlic nou"
         fil
     # Si l'enllaç existeix, però no és un enllaç, sinó un arxiu físic
     elif [[-e / etc / resolv.conf]], a continuació,
         # Tenim una cosa estranya, error de sortida
         moren-q "/ etc / resolv.conf existeix però no un enllaç simbòlic"
     més
         # Intenta crear
         set_symlink "$ (1)" | | die-q "No s'ha pogut establir un vincle simbòlic nou"
     fil
 ) 

L'expedient complet


Resta de funcions necessàries són majoritàriament descriptius i jo no els vaig a revisar en detall. A continuació es mostra el codi complet que he fet servir per al mòdul.

 # -*- *-- Vim eselect: m = # eselect Drets d'autor 1999-2009 Fundació Gentoo # Distribuït sota els termes de la GNU General Public License v2 # $ Id: $ DESCRIPTION = "Gestionar l'arxiu / etc / resolv.conf enllaç simbòlic" mantenidor = "personal@andreaolivato.net" SVN_DATE = '$ Data: 09/20/2009 22:26:07 0200 (Sun, 20 Sep 2009) $' VERSION = $ (svn_date_to_version "$ () SVN_DATE") find_targets ( ) (p locals per p a $ (ls / etc / resoldrà .* | grep-v conf) do echo $ p fet;) remove_symlink () (rm "/ / resolv.conf") set_symlink () (local de destinació, etc = $ (1) si is_number "$ (target)", a continuació, els objectius locals = ($ (find_targets)) ($ target = metes objectiu [- 1]) fil if [[-z "$ destí"]], i després moren - q "Target \" $ (1) \ "no sembla ser vàlida!" else ln-s "$ (target)" "/ etc / resolv.conf" fil) describe_show () (echo "Mostra l'actual resoldran . conf enllaç simbòlic ") do_show () (write_list_start" resolv.conf enllaç simbòlic actual: "si [[-L / etc / resolv.conf]], després resoldran local = $ (canonicalise" / etc / resolv.conf ") write_kv_list_entry" $ (% resoldrà /) "" "write_kv_list_entry altres" (desconnectat) "" "fil) describe_list () (echo" Llista d'objectius disponibles enllaç simbòlic resolv.conf ") do_list () (local objectius i = ($ (find_targets)) write_list_start "enllaç simbòlic resolv.conf disponible objectius:" per ((i = 0; i <$ (# [@]}; objectius i + +)); fer [[$ (objectius [i]) = \ $ (basename "$ (canonicalise "/ etc / resolv.conf") ")]] \ & & objectius [i] = $ (highlight_marker" $ (objectius [i]) ") write_numbered_list fet-m" (no trobat) "" $ ([objectius @] ) ") describe_set () (echo" Establir un objectiu nou enllaç simbòlic resolv.conf ") describe_set_parameters () (echo" ") describe_set_options () (echo" destí: nom de destinació o el nombre (de 'llista' d'acció) ") do_set ( ) (if [[-z $ (1)]], i després morir-q "No em va dir el que per establir l'enllaç a" elif [[-L / etc / resolv.conf]], i després si!  remove_symlink, després morir-q "No és possible eliminar l'enllaç simbòlic existent" elif!  set_symlink "$ (1)", i després morir-q "No s'ha pogut establir un enllaç simbòlic nova" fil elif [[-e / etc / resolv.conf]], i després morir-q "/ / resolv.conf etc existeix, però és no és un enllaç simbòlic "else set_symlink" $ (1) "| | die-q" No s'ha pogut establir un enllaç simbòlic nova "fil) 

Ús

Després de desar l'arxiu, vostè pot començar a utilitzar el nou mòdul.

Per a una llista de fitxers disponibles no

  eselect llista resoldran 

Per establir l'original

  resoldran eselect sèrie 1 

Per establir el OpenDNS

  resoldran eselect sèrie 2 

Per mostrar l'opció actual

  eselect mostren resoldran 

    blog alimentat pels informes Disqus