Opprett en modul for Gentoo Eselect
Skrevet den 23. Okt, 2009 / / Open Source.Jeg elsker eselect!
For de som ikke vet eselect er en "modulær administrasjon og konfigurasjon av rammeverket. I enklere ord er det et styringsverktøy som sendes med Gentoo, i stand til å veksle mellom pakkene versjoner og konfigurasjoner filer, arbeider med symbolske linker og miljømessige variabler.
Bare for å bedre avklare eselect jobb, er det i stand til å gjøre deg veksle mellom Java VM versjoner, Python utgivelser, GCC kompilatorer og det gjør det mulig å velge din favoritt editor.
Eselect er et modulbasert verktøy, som betyr at du trenger bare å lage en enkel. Eselect filen for å gjøre det kjøre dine egne kommandoer. Hva skal jeg forklare nedenfor er hvordan man skal lage en enkel modul for å håndtere en symbolsk lenke.
Mål for opplæringen
Hva jeg ønsker å oppnå i denne lille opplæringen er å skape et enkelt bytte til raskt å endre / etc / resolv.conf-fil. Denne filen forteller til alle nettverksgrensesnitt hvor du skal lete for DNS løse.
Som under siste dagene jeg hadde problemer med DNS, ble jeg tvunget til å bytte ofte fra min standard domenet omformeren (dette tilfellet en intern server) til en ekstern én (OpenDNS). Bruke eselect til dette formålet virkelig forenklet livet mitt!
Forberedelse: opprette 'alternativer'
Som vi ønsker å veksle mellom to forskjellige konfigurasjoner vi trenger for å lage disse alternativene. Åpne en terminal, cd til / etc og opprette filer. Jeg opprettet en kalte resolv.orig og ett kalt resolv.opends, som skal brukes når lokale DNS Resolver er nede.
# Going to / etc katalogen cd / etc # Kopiering opprinnelige resolv.conf # Til det første alternativ cp resolv.conf resolv.orig # Opprette nye resolv.conf alternativ # Bruke OpenDNS IPer echo-e "nameserver 208.67.222.222 \ nnameserver 208.67.220.220"> resolv.prova
Nå må vi slette den opprinnelige filen og erstatte den med en symlink, åpenbart til. Orig fil
# Slette fysiske arkiv rm resolv.conf # Lage symlink ln-s resolv.orig resolv.conf
Vi er ferdig med forhåndskonfigurering, la oss fortsette med eselect modul opprettelse
Lag modulen
For en komplett utvikler guide til eselect modul skapelsen, henvises det til Gentoo Wiki offisiell guide. Dette er bare en "for eksempler 'guide for en rask start.
Først av alt alle eselect moduler bør plasseres i / usr / share / eselect / modules katalogen, så gå dit og lage en ny. Eselect fil
# Gjennom eselect moduler katalog cd / usr / share / eselect / modules # Opprette en ny modul fil touch resolv.eselect
Nå bruker et redigeringsprogram for å redigere den. I dette eksempelet jeg bruker vim
# Åpning arkiv med vim vim resolv.eselect
Hodedelen
Som alltid hoveddelen av filen inneholder meta-informasjoner om modulen og forfatter, vil bare raskt gjennom den nedenfor
# -*- Eselect-*- vim: m = eselect # Copyright 1999-2009 Gentoo Foundation # Distribuert under GNU General Public License v2 # $ Id: $ # Dette vil komme når de tilgjengelige modulene DESCRIPTION = "Rediger / etc / resolv.conf symlink" # Maintainer epost Maintainer = "personal@andreaolivato.net" # Dato, brukes til å lage en versjon SVN_DATE = '$ Date: 2009-10-23 12:00:07 +0200 (fre 23 oktober 2009) $' # Opprette versjon fra dato VERSION = $ (svn_date_to_version "$ (SVN_DATE)")
Finn alternativer
Den første viktige funksjonen vi trenger for å lage er det å ta vare på en liste over alle mulige alternativer som vi har for symlink vår. Dette betyr at du må liste alle filene som kan knyttes til resolv.conf. I vårt tilfelle er det bare to: resolv.orig og resolv.opendns.
Den enkleste fremgangsmåten ville være å skrive disse filene direkte, men som vi ønsker å lære hvordan man skal håndtere eselect ordentlig la oss lage et bash funksjon for å liste de to file. På denne måten dersom vi i fremtiden ønsker å skape et nytt alternativ vi ikke trenger å endre vår kode.
I under-funksjonen jeg bare nevnt (med ls-kommandoen) alle filer som begynner med resolv. i / etc mappe og deretter utelukker (ved hjelp av grep-v) den opprinnelige filen, som er resolv.conf. På denne måten kan vi legge til flere alternative ved å opprette resolv.xxx filer. Her er koden
find_targets () ( lokale p for p in $ (ls / etc / resolv .* | grep-v conf) gjøre echo $ p gjort; )
Lag og fjerne symlink
Fortsetter med koden vår, vi må være i stand til å fjerne og opprette symlink.
For å fjerne den, trenger vi bare å bruke rm kommando som dette
remove_symlink () ( rm "/ etc / resolv.conf" )
For å opprette symlink, må vi håndtere brukerens valg. Dette valget er representert av et tall, å identifisere filen for å bytte koblingen til. Dette betyr at vi trenger å knytte en parameter sendes til funksjonen med plasseringen av valget i vår filliste.
set_symlink () ( # Få parameteren local target = $ (1) # Check it er et tall hvis is_number "$ (mål)"; da # Få listen over filer via laget tidligere funksjon lokale mål = ($ (find_targets)) # Hent filen knyttet til parameteren bestått target = $ (mål [target - 1]) fi # Hvis resultatet filen ikke eksisterer Hvis [[-z "$ target"]], så # Vi output en feil die-q "Mål" $ (1) "ikke synes å være gyldig! # Selv om det finnes ellers # Vi skaper koblingen ln-s "$ (mål)" "/ etc / resolv.conf" fi )
Sette ting sammen
Nå har vi fått en funksjon for å liste, til en fjern og én for å sette inn. Vi trenger å sette dem sammen og bytte mellom dem avhengig av brukerens valg. Følgende funksjonen mottar parameteren fra brukeren, sjekker den, fjerne nåværende koblingen hvis den finnes, og kaller oppretter funksjonen videresending parameteren.
do_set () ( Hvis [[-z $ (1)]], så # Hvis ingen parameter ble vedtatt die-q "Du gjorde ikke fortelle meg hva jeg skal sette symlink til" elif [[-L / etc / resolv.conf]], så # Dersom linkene finnes prøve å fjerne den dersom, hvis! remove_symlink; da # Hvis ikke kan fjerne den utdata-feil die-q "Kunne ikke fjerne eksisterende symlink" # Prøv å lage elif! set_symlink "$ (1)", så # Hvis ikke kan opprette, output feil die-q "Kunne ikke sette et nytt symlink" fi # Hvis koblingen finnes, men er ikke en link, men en fysisk fil elif [[-e / etc / resolv.conf]], så # Vi har noe merkelig, output feil die-q "/ etc / resolv.conf eksisterer, men er ikke en symlink" ellers # Prøv å lage set_symlink "$ (1)" | | die-q "Kunne ikke sette en ny symlink" fi )
Den komplette fil
Resterende nødvendige funksjoner er hovedsakelig beskrivende og jeg har ikke tenkt å gå gjennom dem i detalj. Nedenfor er den komplette koden jeg brukte for modulen.
# -*- Eselect-*- vim: m = eselect # Copyright 1999-2009 Gentoo Foundation # Distribuert under GNU General Public License v2 # $ Id: $ DESCRIPTION = "Rediger / etc / resolv.conf symlink" Maintainer = "personal@andreaolivato.net" SVN_DATE = '$ Date: 2009-09-20 22:26:07 +0200 (søn 20 september 2009) $' VERSION = $ (svn_date_to_version "$ (SVN_DATE)") find_targets () ( lokale p for p in $ (ls / etc / resolv .* | grep-v conf) gjøre echo $ p gjort; ) remove_symlink () ( rm "/ etc / resolv.conf" ) set_symlink () ( local target = $ (1) hvis is_number "$ (mål)"; da lokale mål = ($ (find_targets)) target = $ (mål [target - 1]) fi Hvis [[-z "$ target"]], så die-q "Target \" $ (1) \ "ikke synes å være gyldig! ellers ln-s "$ (mål)" "/ etc / resolv.conf" fi ) describe_show () ( echo "Vis gjeldende resolv.conf symlink" ) do_show () ( write_list_start "Current resolv.conf symlink:" Hvis [[-L / etc / resolv.conf]], så lokale resolv = $ (canonicalise "/ etc / resolv.conf") write_kv_list_entry "$ (resolv% /)" "" ellers write_kv_list_entry "(unset)" "" fi ) describe_list () ( echo "List available resolv.conf symlink mål" ) do_list () ( lokale i mål = ($ (find_targets)) write_list_start "Ledige resolv.conf symlink mål:" for ((i = 0; i <$ (# mål [@]}; i + +)); do [[$ (Mål [i]) = \ $ (basename "$ (canonicalise" / etc / resolv.conf ")")]] \ & & Mål [i] = $ (highlight_marker "$ (mål [i])") ferdig write_numbered_list-m "(none found)" "$ (mål [@]}" ) describe_set () ( echo "Sett en ny resolv.conf symlink target" ) describe_set_parameters () ( echo "" ) describe_set_options () ( echo "target: Target navn eller nummer (fra" listen "handling)" ) do_set () ( Hvis [[-z $ (1)]], så die-q "Du gjorde ikke fortelle meg hva jeg skal sette symlink til" elif [[-L / etc / resolv.conf]], så dersom, hvis! remove_symlink; da die-q "Kunne ikke fjerne eksisterende symlink" elif! set_symlink "$ (1)", så die-q "Kunne ikke sette et nytt symlink" fi elif [[-e / etc / resolv.conf]], så die-q "/ etc / resolv.conf eksisterer, men er ikke en symlink" ellers set_symlink "$ (1)" | | die-q "Kunne ikke sette en ny symlink" fi )
Usage
Når du har lagret filen, kan du begynne å bruke den nye modulen.
Hvis listen tilgjengelige filer do
eselect resolv liste Hvis du vil angi de originale
eselect resolv sett 1 Hvis du vil angi OpenDNS en
eselect resolv sett 2 Hvis du vil vise gjeldende valg
eselect resolv show

















































