Opprett en modul for Gentoo Eselect

Skrevet den 23. Okt, 2009 / / Open Source.

Jeg elsker eselect!

gentoo eselect Create a module for Gentoo 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 

    Bloggen kommentarer drevet av Disqus