Skapa en modul för Gentoo Eselect

Skrivet den 23 okt 2009 / / Open Source .

Jag älskar eselect!

gentoo eselect Create a module for Gentoo Eselect För dem som inte vet eselect är en "moduler administration och konfiguration ramar". Med enklare ord är det ett verktyg levereras med Gentoo, kunna växla mellan paket versioner och konfigurationer filer, arbeta med symboliska länkar och miljömässiga variabler.

Bara för att bättre klargöra eselect jobb är det kan göra dig växla mellan Java VM versioner, Python releaser, gcc kompilatorer och det gör det möjligt att välja din favorit editor.

Eselect är ett modulärt verktyg, vilket innebär att du bara behöver skapa en enkel. Eselect filen så att den köra dina egna kommandon. Vad jag kommer att förklara nedan är hur man skapar en enkel modul för att hantera en symbolisk länk.

Syftet med handledningen

Vad jag vill uppnå i den här lilla guiden är att skapa en strömbrytare för att snabbt ändra min / etc / resolv.conf fil. Denna fil talar till alla nätverkskort var du ska leta för DNS lösa.

Som under senaste dagarna har jag haft problem med DNS, var jag tvungen att byta ofta från min default domän resolver (det här fallet en intern server) till en extern en (Öppen). Använda eselect för detta ändamål verkligen förenklat mitt liv!

Förberedelse: skapa "alternativ"

Eftersom vi vill växla mellan två olika konfigurationer vi måste skapa dessa alternativ. Öppna en terminal, cd i / etc och skapa filerna. Jag skapade en heter resolv.orig och en som kallas resolv.opends, som skall användas vid lokala DNS-resolver är nere.

  # Gå till katalogen / etc
 cd / etc
 # Kopiera original resolv.conf
 # För att det första alternativet
 cp resolv.conf resolv.orig
 # Skapa nya resolv.conf alternativ
 # Med Öppen IP-adresser
 echo-e "nameserver 208.67.222.222 \ nnameserver 208.67.220.220"> resolv.prova 

Nu måste vi ta bort den ursprungliga filen och ersätta den med en symbolisk länk, uppenbarligen till. Orig fil

  # Ta bort fysisk fil
 rm resolv.conf
 # Skapa symlink
 ln-s resolv.orig resolv.conf 

Är vi klara med förkonfigurerad, låt oss fortsätta med eselect modul skapande

Skapa modulen

För en komplett utvecklare av eselect modul skapande, se Gentoo Wiki officiella guiden . Detta är bara en "för exempel" guide för en snabb start.

Först och främst alla eselect moduler bör finnas i din / usr / share / eselect / modules katalogen, så gå dit och skapa en ny. Eselect fil

  # Gå in eselect moduler katalog
 cd / usr / share / eselect / modules
 # Skapa en ny modul fil
 beröring resolv.eselect 

Nu använda din favorit editor för att redigera den. I detta exempel jag använder vim

  # Öppna filen med vim
 vim resolv.eselect 

Head avsnitt


Som alltid rubrikavsnittet filen innehåller meta informationer om modulen och författaren kommer bara snabbt granska den nedan

  # -*- Eselect-*- vim: m = eselect
 # Copyright 1999-2009 Gentoo Foundation
 # Distribueras enligt villkoren i GNU General Public License v2
 # $ Id: $

 # Det här kommer att visas vid uppräkningen av de tillgängliga moduler
 BESKRIVNING = "Hantera / etc / resolv.conf symbolisk länk"
 # Ansvarig e-post
 Ansvarig = "personal@andreaolivato.net"
 # Datum, används för att skapa en version
 SVN_DATE = '$ Date: 2009/10/23 00:00:07 0200 (fre, 23 Oct 2009) $'
 # Skapa version från datum
 Version = $ (svn_date_to_version "$ (SVN_DATE)") 

Hitta alternativen


Den första viktiga uppgift vi måste skapa är en som tar hand om förteckning över alla tänkbara alternativ som vi har för vår symbolisk länk. Det innebär att du måste lista alla filer som kan kopplas till resolv.conf. I vårt fall finns det bara två: resolv.orig och resolv.opendns.

Det enklaste förfarandet skulle vara att skriva dessa filer direkt, men eftersom vi vill lära dig att hantera eselect ordentligt låt oss skapa ett bash funktion att ange vilka två fil. Detta sätt om vi i framtiden vill skapa ett nytt alternativ, vi behöver inte ändra vår kod.

I nedanstående funktion jag just räknat upp (med hjälp av ls kommando) alla filer som börjar med resolv. i / etc mappen och sedan utesluter (med grep-v) den ursprungliga filen, som är resolv.conf. Så sätt kan vi lägga till fler alternativ genom att skapa resolv.xxx filer. Här är koden

  find_targets () (
     lokala p
     för p i $ (ls / etc / resolv .* | grep-v Conf)
     göra
         echo $ p
     gjort;
 ) 

Skapa och ta bort den symboliska länken


Fortsätter med vår kod, nu måste vi kunna ta bort och skapa symbolisk länk.

För att ta bort det, bara måste vi använda rm kommando som detta

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

För att skapa symboliska länken måste vi ta itu med valfrihet för användaren. Detta val representeras av ett nummer, som identifierar filen för att byta länken till. Det betyder att vi måste koppla en parameter överföras till funktionen med den ståndpunkt av valet i vår fillistan.

  set_symlink () (
     # Få parametern
     lokala target = $ (1)
     # Kolla att det är ett antal
     Om is_number "$ (mål)" och sedan
         # Hämta listan över filer via tidigare skapat funktionen
         lokala mål = ($ (find_targets))
         # Hämta fil associerad med parametern passerade
         target = $ (mål [mål - 1])
     fi

     # Om resultatet filen inte finns
     om [[-z "$ mål"]], då
         # Vi utgång ett fel
         die-q "Target" $ (1) "verkar inte vara giltig!"
    # Även om den finns
     annat
         # Vi skapar länken
         ln-s "$ (mål)" "/ etc / resolv.conf"
     fi
 ) 

Sätt saker tillsammans


Nu har vi fått en funktion att lista, att ett bort och en infoga. Vi måste lägga ihop dem och växla mellan dem beroende på användarens val. Följande funktion får parameter från användaren, kontrollerar det, ta bort den aktuella länken om det existerar, och kallar skapa funktionen vidarebefordran parametern.

  do_set () (

     om [[-z $ (1)]], då
         # Om ingen parameter antogs
         die-q "Du har inte berätta vad för att ställa in symbolisk länk till"
     Elif [[-L / etc / resolv.conf]], då
         # Om kopplingar finns försöka ta bort den
         om!  remove_symlink, sedan
             # Om inte kan ta bort den produktion fel
             die-q "Kunde inte ta bort befintliga symbolisk länk"
         # Försök att skapa
         Elif!  set_symlink "$ (1)", då
             # Om inte kan skapa, produktion fel
             die-q "Kunde inte ställa in en ny symbolisk länk"
         fi
     # Om länken finns men inte ett band, men en fysisk fil
     Elif [[-e / etc / resolv.conf]], då
         # Vi har något konstigt, produktion fel
         die-q "/ etc / resolv.conf finns men inte en symbolisk länk"
     annat
         # Försök att skapa
         set_symlink "$ (1)" | | die-q "Kunde inte ställa in en ny symbolisk länk"
     fi
 ) 

Den fullständiga


Kvarvarande funktioner som behövs är mestadels beskrivande och jag tänker inte granska dem i detalj. Nedan är hela koden jag använde för modulen.

 # -*- Eselect-*- vim: m = eselect # Copyright 1999-2009 Gentoo Foundation # Distribueras enligt villkoren i GNU General Public License v2 # $ Id: $ BESKRIVNING = "Hantera / etc / resolv.conf symbolisk länk" Ansvarig = "personal@andreaolivato.net" SVN_DATE = '$ Date: 2009/09/20 22:26:07 0200 (Sun, 20 Sep 2009) $ "version = $ (svn_date_to_version" $ (SVN_DATE) ") find_targets ( ) (lokala p för p $ (ls / etc / resolv .* | grep-v conf) göra echo $ p gjort;) remove_symlink () (rm "/ etc / resolv.conf") set_symlink () (lokal target = $ (1) om is_number "$ (mål)" och sedan lokala mål = ($ (find_targets)) target = $ (mål [mål - 1]) fi om [[-z "$ mål"]], sedan dö - q "Target \" $ (1) \ "verkar inte vara giltig!" annan ln-s "$ (mål)" "/ etc / resolv.conf" fi) describe_show () (echo "Visa den aktuella resolv . conf symbolisk länk ") do_show () (write_list_start" Nuvarande resolv.conf symboliska länken: "om [[-L / etc / resolv.conf]], sedan lokala resolv = $ (canonicalise" / etc / resolv.conf ") write_kv_list_entry" $ (resolv% /) "" "annars write_kv_list_entry" (urkopplat) "" "fi) describe_list () (echo" Förteckning finns symboliska länken mål resolv.conf ") do_list () (lokal i mål = ($ (find_targets)) write_list_start "Finns resolv.conf symboliska länken mål:" för ((i = 0; i <$ (# mål [@]}; i + +)), gör [[$ (mål [i]) = \ $ (basnamn "$ (canonicalise "/ etc / resolv.conf") ")]] \ & & mål [i] = $ (highlight_marker" $ (mål [i]) ") gjort write_numbered_list-m" (none found) "" $ (mål [@] ) ") describe_set () (echo" Ange en ny symbolisk länk mål resolv.conf ") describe_set_parameters () (echo" ") describe_set_options () (echo" mål: Mål namn eller nummer (från "listan" åtgärd) ") do_set ( ) (if [[-z $ (1)]], sedan dö-q "Du har inte berätta vad för att ställa in symbolisk länk till" elif [[-L / etc / resolv.conf]], sedan om!  remove_symlink, sedan dö-q "Kunde inte ta bort befintliga symbolisk länk" Elif!  set_symlink "$ (1)", sedan dö-q "Kunde inte ställa in en ny symbolisk länk" fi elif [[-e / etc / resolv.conf]], sedan dö-q "/ etc / resolv.conf finns men är inte en symbolisk länk "annars set_symlink" $ (1) "| | die-q" Kunde inte ställa in en ny symbolisk länk "fi) 

Användning

När du har sparat filen kan du börja använda den nya modulen.

För att lista tillgängliga filer gör

  eselect resolv lista 

För att ställa det ursprungliga

  eselect resolv som en 

För att ställa in OpenDNS en

  eselect resolv som 2 

För att visa nuvarande val

  eselect resolv visa 

    blogg kommentarer drivs av Disqus