IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Linux Professional Institute Certificate. LPIC-1

Lpic1 large.gif
Certificat LPIC-1
Examen: 101 (torneu a la resta de temes)
Fitxers: LPI102.4_Utilitzar_gestors_paquets_tipus_Debian.pdf (LPI102.4_Utilitzar_gestors_paquets_tipus_Debian.odp)
Objectius: http://www.lpi.org/eng/certification/the_lpic_program/lpic_1/exam_101_detailed_objectives
Dipòsit SVN: https://svn.projectes.lafarga.cat/svn/lpi/Materials/Examen_101/102.4
Usuari: anonymous
Paraula de pas: qualsevol paraula de pas


Paquets de programari

Conceptes

  • Un paquet de programari és una sèrie de fitxers que es distribueixen de forma conjunta, la raó d'agrupar aquests fitxers sol ser que el funcionament de cadascun complementa o requereix d'uns d'ells.
  • Inconvenients de comprimir són la feina extra que li estem donant a la CPU.
  • El nom de Fedora, esta ambientat amb els barrets d'Indiana Jones.

Tipus de paquet

  • .rpm (RedHat): format dels paquets en distribucions Linux de la familiar Red Hat.
  • .deb (Debian): format dels paquets en distribucions Linux de la familiar Debian.
  • .slp (Stampede): format de paquets Stampede
  • .tgz (Slackware): format de paquet utilitzat a la distribució Linux Slackware
  • .pkg (Solaris): format de paquet en sistemes operatius Unix Solaris.

La majoria de paquets seran els .rpm i .deb, amb un 99% del paquets.

Distribucions Linux

  • Hi ha diferències entre les distribucions, encara que comparteixen una mateixa base que facilita la seva interoperabilitat.
Davidginovartdistribucions.png

Paquets Debian

  • Tipus de paquets:
Paquet binari, contenent aplicacions binaries sense el codi font, el paquet inclou els fitxers executables/binaris.
Paquet font, aquests paquets inclouen el codi font. Normalment cada paquet font té el seu equivalent amb binari.
Dependències, són quan a un paquet li falta algun altre paquet per funcionar. Les dependències més comuns són les llibreries. Aquests fitxer tenen extensió .so
Gestor de paquets, aplicacions que permeten gestionar els paquets, exemple: apt-get, dpkg, synaptic, el que fan és, instal·lar, cerca i eliminar.
Dipòsit o Repository, arxiu on s'emmagatzemen paquets, normalment es troba a Internat, encara que també es poden trobar a una xarxa local, un exemple el dipòsit de l'institut.
Paquet virtual, és un paquet que per ell sol no fa res, l'important són les dependències que instal·la. Tenen un inconvenient que quan desinstal·les aquest paquets tontos es desinstal·la el paquet però no les dependències.
Tasques, són agrupacions de paquets que instal·lats de forma conjunta proveeixin una funcionalitat comuna, exemple: tasksel, lamp

Debian Packages

  • Extensió .deb
  • Molt conegut per les seves estrictes polítiques de qualitat abans de alliberar noves versions de paquets.
  • Faciliten l'aplicació d'actualitzacions sense necessitat de reiniciar la màquina.
  • Permet configurar l'aplicació en el moment de la instal·lació (debconf)
  • Permet tasques prèvies a l'eliminació, instal·lació i/o configuració d'un paquet.
  • Són utilitzats ens totes les distribucions de la família Debian
  • El programa principal (canònic) utilitzat per gestionar aquest tipus de fitxers és dpkg, tot i que sovint dpkg es utilitzat mitjançant el front-end apt.
  • La única eina que toca els paquets es el dpkg,


Ubuntu

  • La distribució més utilitzada en l'actualitat, basada en Debian GNU/Linux, darrera esta Canonical Ltd, fundada per Mark Shuttleworth
  • L'origen d'aquesta paraula be de Zulu i Xhosa, "humanity towards others", i el seu slogan és “Linux for Human Beings”.
  • Tenen el compromís de treure una versió nova cada sis mesos.
  • Les versions d'Ubuntu són suportades com a mínim durant 18 mesos.

Les versions LTS (Long Term Support) són suportades durant un mínim de 3 anys (desktop) o 5 (servidors).

Relacions entre paquets

  • El paquet A depèn del Paquet B: Implica que és absolutament necessari que el paquet B estigui instal·lat abans de poder instal·lar A. També pot ser

que A depengui d'una versió especifica de B.

  • El paquet A recomana B: B no és necessari però el desenvolupador de A creu que la majoria d'usuaris d'A trobaran útil B.
  • El paquet A suggereix B: El paquet A suggereix el B per què B conté funcionalitats relacionades amb A (sovint milloren la seva funcionalitat).
  • El paquet A entra en conflicte amb el paquet B: El paquet A no pot operar al sistema si existeix B. Sovint per què tots dos proporcionen el mateix fitxer.
  • El paquet A reemplaça B: Al instal·lar A s'esborren els fitxers de B i en alguns casos es sobreescriuen.
  • El paquet A proveeix de B: Quan tots els fitxers i funcionalitats de B han estar incorporades a A.

Importància d'un paquet

  • Standard: Els paquets Standard, són aquells paquets mínims que s'haurien de trobar a tota màquina. Hi han les eines bàsiques per navegar per la web (w3m), enviar correus electrònics (mutt) o descarregar fitxers o servidors FTP. Aquests paquets (i els de prioritat superior) són els que s'instal·len per defecte. No inclou moltes aplicacions importants.
  • Optional: Paquets que possiblement molta gent voldrà instal·lar però que no són imprescindibles pel sistema. Aquí trobem paquets tant importants com X11.
  • Extra: Paquets que entren en conflicte amb altres de major prioritat però que en certes condicions els usuaris poden preferir.

NOTA: Una instal·lació per defecte de Debian instal·la tots els paquets de prioritat estàndard o inferior

Debian

  • Instal·lem aquest paquet
$ sudo apt-get install hello
  • Ara anem a veure on s'ha instal·lat el programa:
$ cd /var/cache/apt/archives/
$ ls
  • Aquí tenim totes les aplicacions que s'han instal·lat pels usuaris.
  • Podem borra aquesta cache amb:
$ sudo apt-get clean
  • Podem reinstal·lar amb:
  • Eina file-roller podríem dir que es el des compressor de paquets.

Podem trobar informació del paquet a

/var/cache/apt/archives$ file-roller hello_2.4-3_i386.deb 
Package: hello
Version: 2.4-3
Architecture: i386 
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Santiago Vila <[email protected]>
Installed-Size: 644
Depends: libc6 (>= 2.3.4), dpkg (>= 1.15.4) | install-info
Section: devel
Priority: optional
Description: The classic greeting, and a good example
The GNU hello program produces a familiar, friendly greeting.  It
allows non-programmers to use a classic computer science tool which
would otherwise be unavailable to them.
.
Seriously, though: this is an example of how to do a Debian package.
It is the Debian version of the GNU Project's `hello world' program
(which is itself an example for the GNU Project).


  • Això es el mateix que podem veure al synaptic
Davidginovartdistribucions1.png

Anatomia d'un paquet Debian

  • data.tar.gz: Fitxers a instal·lar al sistema.
  • control.tar.gz: Scripts de manteniment i metadades.
  • debian-binary: Conté la versió del format de paquets Debian
  • Instal·lem el paquet apache2.2-common
$ sudo apt-get install apache2.2-common 
  • Si el tenim instal·lat, utilitzem:
$ sudo apt-get install --reinstall apache2.2-common
  • Després anem a:
$ file-roller /var/cache/apt/archives/apache2.2-common_2.2.14-5ubuntu8.7_i386.deb
  • On podem veure la informació del paquet:
Davidginovartdistribucions2.png
  • En la meva versió, que es la 10.10, es representa d'aquesta manera, encara que en la versió nova, el fitxer Control, es troba dins la carpeta Debian, i les carpetes /usr /etc /var, representen al fitxer Data.

Fica la imatge de la nova versió.

  • Anem a per el fitxer Control/Debian, depenen de la versió del SO. Aquí i trobem el md5sum de tots els fitxers.
  • Al fitxer conffiles, i trobem els fitxers de configuració, si desinstal·lem aquest paquet, aquests fitxers no es desinstal·len.
  • Sols podem desinstal·lar amb:
$ sudo apt-get remove --purge apache2.2-common
  • Instal·lem pas a pas:
$ sudo apt-get install apache2.2-common 
S'està llegint la llista de paquets... Fet
S'està construint l'arbre de dependències       
S'està llegint la informació de l'estat... Fet
Els paquets següents s'instal·laren automàticament i ja no són necessaris:
wwwconfig-common libmcrypt4 libjs-mootools javascript-common
dbconfig-common acroread-common
Empreu «apt-get autoremove» per a suprimir-los.
Paquets suggerits:
apache2-doc apache2-suexec apache2-suexec-custom
S'instal·laran els paquets NOUS següents:
apache2.2-common
0 actualitzats, 1 nous a instal·lar, 0 a suprimir i 0 no actualitzats.
Es necessita obtenir 0B/291kB d'arxius.
Després d'aquesta operació s'empraran 2167kB d'espai en disc addicional.
S'està seleccionant el paquet apache2.2-common prèviament no seleccionat.
(S'està llegint la base de dades ... hi ha 240867 fitxers i directoris instal·lats actualment.)
S'està desempaquetant apache2.2-common (de .../apache2.2-common_2.2.14-5ubuntu8.7_i386.deb) ...
 Part de configuració
S'estan processant els activadors per a ufw ...
S'estan processant els activadors per a ureadahead ...
S'estan processant els activadors per a man-db ...
S'està configurant apache2.2-common (2.2.14-5ubuntu8.7) ...
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime. 
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.
  • Aquesta part final que fa la configuració l'executen aquests programes:
Davidginovartdistribucions3.png
  • Aquests scripts fan,
preinst: S'executa abans d'extreure els fitxers del paquet al sistema
postinst: S'executa després d'extreure els fitxers del sistema
prerm: S'executa abans d'esborrar els fitxers del sistema
postrm: S'executa després d'esborrar els fitxers del sistema
Davidginovartcreaciopaquetsdebian.png

Debconf

  • Una gran base de dades, és l'encarregat de configurar els paquets Debian, ens proporciona interfícies de comunicació d'usuari.
  • Com tornem a configurar o reconfigurar
$ sudo dpkg-reconfigure moodle

També hem de mostrar el synaptic, per aquí amb plantilles per l'apt amb debconf.

  • Eines per crear pantalles de diàleg
  • Instal·lar dialog
# apt-get install dialog
  • Exemples:
$ dialog -- stdout --inputbox "Com et dius?" 20 30
$ dialog --title "Et recomanem..." --msgbox "... que DESCANSIS! de tant en tant..." 10 41


  • Podem instal·lar també:
# apt-get install zenity
  • Exemples:
$ zenity --warning --title="Et recomanem..." --text="Què DESCANSIS\!" --width=500
$ zenity --title "This is a list" --text "Please choose a fruit" --list --radiolist --column "Buy this" --column "Fruit" False Mango False Pineapple False Grapes True Strawberries

Debian templates

  • Plantilles de les qüestions a fer durant la configuració
Davidginovartemplates.png
  • Amb aquest resultat:
Davidginovartemplates1.png

Dipòsits o Repositoris Debian

  • Seccions que te el repositori:
  • Main: La distribució Debian oficial és el que està contingut en aquesta secció.
  • Com a servei als usuaris, hi ha seccions separades que no es poden incloure en la distribució main degut o a una llicencia restrictiva o a temes legals
  • Contrib: Paquets amb llicència lliure però que depenen de programari que no és lliure
  • Non-Free: Paquets que tenen alguna condició en la llicencia que restringeix l'ús o la redistribució del programari.
  • Non-US/Main: Paquets lliures però que no es poden redistribuir des d'un servidor dels EUA.
  • Non-US/Non-Free: No lliures i no es poden distribuir des de EUA.

Versions de Debian

  • Debian té una política de llançament de versions segons l'estat (maduresa) de la versió
  • stable: La distribució «stable» conté la última distribució llançada oficialment. Recomanada per a producció. Nom codi Busca el nom.
  • testing: conté paquets que no han estat encara acceptats a una distribució «stable», però que estan a la cua per a fer-ho. Té versions més recents de programari. Nom en codi Busca el nom. Per a Gent experta
  • unstable: El desenvolupament actiu de Debian té lloc a la distribució «inestable». Nom codi sid. Es la que s'instal·la en entorn d'escriptori. La versió d'Ubuntu sempre es vasa amb aquesta versió.
  • Noms tenen origen en els protagonistes de Toy Story (1995)

Dipòsits o Repositoris Ubuntu

  • Quan surt el logo es main(Debian)
  • main: Aplicacions lliures i plenament suportades per l'equip d'Ubuntu. Aplicacions populars.
  • restricted: Programari d'ús comú (drivers) que no és PL. Suportat per l'equip d'Ubuntu tot i que no tenen el codi font (només poden reportar els errors)
  • universe: Aplicacions lliures no suportades per Ubuntu però que formen part de l'univers d'aplicacions Linux. No donen suport explícit.
  • multiverse: Programari Linux no lliure. Sense suport d'Ubuntu.

Tipus d'actualitzacions

  • Una versió d'Ubuntu surt cada sis mesos, estigui com estigui.
  • Un paquet pot estar en varis apartats:
  • Security: Actualitzacions de seguretat importants.
  • Updates: Actualitzacions recomanades, Ubuntu més o menys també dona suport.
  • Proposed: Actualitzacions disponibles abans del seu alliberament a la primera versió, no assegurades.
  • Backports: (Actualitzacions no suportades) Vaig la teva responsabilitat.
Davidginovartsynaptic1.png
Davidginovartsynaptic2.png
Davidginovartsynaptic.png
  • Anem al fitxer on se li fiquen línies noves per a les noves actualitzacions:
# sudo geany /etc/apt/saources.list

Gestors de paquets Debian

dpkg

  • Debian package dpkg, aplicació important, totes utilitzen aquesta aplicació, synaptic, apt-get o altres.
  • Aplicació encarregada de gestionar els paquets Debian. Eina de baix nivell.
  • El dpkg sols l'instal·la, no el descarrega el paquet.
  • Sintaxi:
Davidginovartdpkg.png
  • On es, o on esta:
# whereis dpkg
dpkg: /usr/bin/dpkg /etc/dpkg /usr/lib/dpkg /usr/share/dpkg /usr/share/man/man/dpkg.1.gz
  • Paquet inprescindible:
$ dpkg -S /usr/bin/dpkg
dpkg: /usr/bin/dpkg

Opcions dpkg

  • Només consulta (dpkg-query-actions)
dpkg -l | --list package-name-pattern: Llista els paquets que compleixen amb un determinat patró.
dpkg -s | --status package-name: mostra l'estatus actual d'un paquet i la metainformació del paquet.
dpkg -L | --listfiles package: Mostra la llista de fitxers instal·lats
dpkg -S | --search filename-search-pattern: Busca un fitxer concret dins dels paquets instal·lats
dpkg -p | --print-avail package: Mostra detalls sobre un paquet instal·lat.
dpkg -I | --info package-name: Mostra informació sobre un paquet desinstal·lat.
  • Exemples:
Davidginovartdpkg1.png
$ dpkg -l | wc
1757   15105  224553
  • Comprovem si tenim una aplicació:
$ dpkg -l | grep hello
ii  hello         2.4-3     
  • Opció amb L majúscula, et mostra els fitxer del paquet:
$ dpkg -L hello
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/hello
/usr/share/doc/hello/NEWS
/usr/share/doc/hello/copyright
/usr/share/doc/hello/changelog.gz
/usr/share/doc/hello/changelog.Debian.gz
/usr/share/info
/usr/share/info/hello.info.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/hello.1.gz
/usr/bin
/usr/bin/hello

  • Buscar l'executable d'una aplicació:
$ dpkg -L firefox | grep bin
/usr/lib/firefox-3.6.24/firefox-bin
/usr/bin
/etc/apparmor.d/usr.bin.firefox
/usr/bin/abrowser
/usr/bin/firefox
  • Accions que modifiquen el sistema. Cal ser superusuari:
dpkg -i | --install package-file: Instal·la un paquet a partir d'un fitxer .deb
dpkg --configure package-name: Torna a configurar un paquet ja instal·la. Executa l'script de post-instal·lació.
dpkg -r | --remove package_name: Elimina un paquet, però deixa els fitxers de configuració de sistema.
dpkg -P | --purge package_name: Elimina un paquet incloent els fitxers de configuració.
dpkg -C | --audit: busca fitxers instal·lats parcialment al sistema i suggereix que fer amb ells.

NOTA: No es el mateix l'opció dpkg --configure, que l'opció dpkg-reconfigure, ja que amb la primera opció configurem el paquet i amb la segona opció sols és configura els paquets pendents de instal·lar durant la instal·lació. Amb l'opció dpkg -C podem buscar paquets d'aquest tipus.

  • Status d'un paquet:
install (i): El paquet esta seleccionat per ser instal·lat.
deinstall(r): Els paquet esta seleccionat per ser desinstal·lat
purge (p): el paquet esta instal·lat per ser purgat (desinstal·la i esborra els fitxers de configuració)
Desconegut (u): No es coneix l'estat de selecció
Installed (i): el paquet s'ha desempaquetat i instal·lat correctament
half-installed(h): la instal·lació del paquet s'ha començat però no s'ha acabat per algun motiu/error.
Not-installed (n): el paquet no esta instal·lat al sistema
unpacked(u): el paquet esta desempaquetat per no configurat.
half-configured: el paquet s'ha desempaquetat i la configuració s'ha iniciat però no s'ha acabat per algun motiu/error.
config-files(c): només queden els fitxers de configuració
triggers-awaited: pendent d'un trigger (gallet)
triggers-pending: El paquet a estat triggered.
  • Error status:
hold (h): Els paquets marcats amb hold no son controlats per dpkg (excepte que s'utilitzi --force-hold).
reinst-require (r): paquet trencat que necessita ser reinstal·lat
None: no apareix cap caràcter
Both problems (x): els dos problemes anteriors

Procés d'instal·lació

1. S'extreu el fitxer de control del nou paquet.
2. Si ja hi ha una versió del paquet a instal·lar en el sistema (actualització) s'executa l'script prerm si existeix.
3. S'executa l'script preinst si el paquet proveïx d'aquest script.
4. Es desempaqueta el nou paquet, al mateix temps és fa una copia dels antics fitxers (permet restaurar en cas d'error)
5. Si ja hi ha una versió del paquet a instal·lar en el sistema (actualització) s'executa l'script postrm si existeix.
6. Es configura el paquet (--configure). La configuració del paquet suposa:
6.1. Desempaquetar els fitxers de configuració i al mateix temps fer una copia de seguretat dels antics
6.2. Executar l'script postinst si existeix.

Procés de desinstal·lació

1. S'executa l'script prerm.
2. S'eliminen els fitxers instal·lats (si a més hi ha la opció --purge s'eliminen els fitxers de configuració també)
3. S'executa l'script postrm.

Exercici.

  • Eliminem el paquet hello.
$ sudo apt-get remove --purge hello
  • Comprovar la versió que tenim instal·lada.
# lsb_release -a
  • Buscar el paquet, aquí:

http://es.archive.ubuntu.com/ubuntu/

  • Busquem la carpeta Dists, la nostra versió.
  • Els paquets estan a pool.
  • Podem ajudar-nos a ubuntu packages
  • Podeu trobar un enllaç al exercici aquí Exercici dpkg
  • Com fer una copia de seguretat de tots els paquets instal·lats dpkg

apt

  • les seves sigles amb anglès són: Advanced Packaging Tool.
  • Utilitzat per la gestió de paquets en sistemes Debian GNU/Linux, simplifica molt la feina d'administració de paquets amb sistemes UNIX, per que automatitza el procés d'obtenció, instal·lació i configuració del paquet.
  • No existeix un programa apt en si mateix, sinó que APT és una biblioteca de funcions C++ que s'empra per diversos programes de Línia de comandes per a distribuir paquets.
  • Podríem dir que apt és el front-end del dpkg. També pot treballar amb altres tipus de paquets com els .rpm.

NOTA: A diferencia de dpkg, apt instal·la les dependències.

  • Ordres o fitxers binaris:
$ dpkg -L apt | grep bin
/usr/bin
/usr/bin/apt-cache
/usr/bin/apt-cdrom
/usr/bin/apt-config
/usr/bin/apt-get
/usr/bin/apt-key
/usr/bin/apt-mark
  • Fitxers de configuració:
$ dpkg -L apt | grep etc
/etc
/etc/apt
/etc/apt/apt.conf.d
/etc/apt/apt.conf.d/01autoremove
/etc/apt/apt.conf.d/01ubuntu
/etc/apt/preferences.d
/etc/apt/sources.list.d
/etc/apt/trusted.gpg.d
/etc/logrotate.d
/etc/logrotate.d/apt
/etc/cron.daily
/etc/cron.daily/apt
  • Podeu veure com configurar apt per anar per un proxy

Synaptic

Update-manager

software-center

Ordres

dpkg

dpkg-reconfigure

  • No es el mateix que dpkg --configure.
  • Sols s'aplica quan un paquet ha quedat pendent de configurar durant la instal·lació. Es poden buscar paquets d'aquests tipus amb l'opció dpkg -C.
$ dpkg -C
Els paquets següents només estan configurats a mitges, probablement
a causa de problemes en la configuració inicial.  S'ha de reintentar
la configuració amb dpkg --configure <paquet> o l'opció configurar
en el menú de dselect:
moodle               Course Management System for Online Learning
  • Després hem d'utilitzar aquesta comanda.
$ sudo dpkg --configure moodle

  • Aquesta ordre ens la proporciona el debconf
$ sudo dpkg-reconfigure moodle

Opcions de la comanda

  • ftype, --frontend=type: Seleccioneu el frontend a utilitzar
  • -pvalue, --priority=value: Especifica el llindar mínim de prioritat. Tots les opcions de configuració igual o per sobre d'aquest llindar, seran mostrades.
  • --default-priority: Utilitzar la prioritat per defecte.
  • -a, --all: Configurar tots els paquets del sistema que utilitzen debconf
  • -u, --unseen-only: Només mostra les qüestions que no han esta contestades prèviament.
  • --force: Força un dpkg-reconfigure inclús si el paquet està en un estat inconsistent o trencat.
  • --no-reload: No torna a carregar les plantilles.

apt-get

Actualitzacions

  • Sincronitzar la base de dades de paquets:
$ sudo apt-get update
  • Cada vagada que fem un canvi en els repositoris, o volem comprovar si tenim les últimes versions dels paquets al repositori, hem d'executar un update.
  • La base de dades de paquets package cache, és local i no es sincronitza automàticament amb els repositoirs, la base de dades es pot gestionar amb apt-cache
  • S'ha d'executar regularment sinó tenim paquets com update manager que comprova periòdicament si tenim actualitzacions.
  • Hi ha una tasca cron diaria:
$ dpkg -L  apt| grep cron
/etc/cron.daily
/etc/cron.daily/apt

Instal·lacions

  • Instal·lar un paquet
$ sudo apt-get install bind9

NOTA: Aquesta eina suporta l'autocompletar en les opcions i en els noms de paquet

  • També poden simular la instal·lació, amb:
$ sudo apt-get --simulate install bind9
  • Altres opcions.
-d: Només descarrega el paquet.
-f: Força la instal·lació encara que falli el test d'integritat.
-y: Respon si a totes les preguntes.

apt-cache

aptitude

Conversió de paquets

Vegeu també

Objectius del tema

102.4. Utilitzar els gestors de paquets tipus Debian
Objective.jpg
  • Objectiu: Els candidats han de ser capaços de gestionar els paquets de programari utilitzant les eines per paquets de Debian.
  • Pes: 3
060317 Icon - Theory of Knowledge v01 pdc.jpg

Àrees Clau de Coneixement:

Icon list.jpg

La següent és una llista parcial de fitxers, termes i utilitats utilitzades:

Text-editor.svg

Apunts: LPI 102.4. Utilitzar els gestors de paquets tipus Debian

Enllaços externs