¿Cómo administras remotamente tus cajas de Linux? [cerrado]


13

NOTA: Hice esta pregunta esta mañana con respecto a los cuadros EC2, pero solo obtuve enlaces a herramientas para iniciar y detener instancias, así que reformularé ...

Tengo algunas cajas de Linux que realizan trabajos de procesamiento nocturno para uno de mis proyectos. De vez en cuando, tendré que entrar, hacer algunos cambios en el código, configurar algunas cosas, mover archivos, etc.

Mi conjunto de herramientas para estas operaciones es dolorosamente escaso (SSH en la caja, edito archivos en VIM, archivos remotos WGET que necesito), y sospecho que hay una manera mucho mejor de hacerlo. Tengo curiosidad por saber qué están haciendo otras personas en mi posición.

¿Está utilizando algún tipo de sistema de ventanas y un escritorio remoto equivalente para acceder al cuadro, o es todo línea de comando? La administración de cuadros remotos de Windows es trivial, ya que simplemente puede usar el escritorio remoto y transferir archivos a través de la red. ¿Hay un equivalente a esto en el mundo de Linux?

¿Está haciendo los cambios del archivo de configuración / ajustes de script directamente en la máquina? ¿O tiene algo configurado en su casilla local para editar estos archivos de forma remota? ¿O simplemente los edita de forma remota y luego los transfiere en cada guardado?

¿Cómo mueve los archivos de un lado a otro entre el servidor y su entorno local? FTP? ¿Algún tipo de unidad asignada a través de VPN?

Realmente necesito tener algunas mejores prácticas para administrar estos cuadros. ¡Cualquier sugerencia para eliminar algo del dolor sería bienvenida!


No use FTP, use SFTP en su lugar.
Brad Gilbert

O incluso mejor, use FUSE sshfs .
Cristian Ciupitu

Respuestas:


19

Mi conjunto de herramientas para estas operaciones es dolorosamente escaso (SSH en la caja, edito archivos en VIM, archivos remotos WGET que necesito), y sospecho que hay una manera mucho mejor de hacerlo. Tengo curiosidad por saber qué están haciendo otras personas en mi posición.

¿Escaso? ¿Qué demonios quieres decir? Disculpe por despotricar, pero descartar ssh, vim y wget como doloroso es casi insultante. De su pregunta deduzco que usted es principalmente un programador para su trabajo diurno, así que entiendo la pregunta. Pero, sinceramente, no contrataría a un administrador de Linux que no se sienta cómodo con ninguna de las tres herramientas que mencionó.

¿Está utilizando algún tipo de sistema de ventanas y un escritorio remoto equivalente para acceder al cuadro, o es todo línea de comando? La administración de cuadros remotos de Windows es trivial, ya que simplemente puede usar el escritorio remoto y transferir archivos a través de la red. ¿Hay un equivalente a esto en el mundo de Linux?

Para tareas de administrador, nunca uso un entorno X. No necesita uno, solo ocupará recursos del sistema y, la mayoría de las veces, son un obstáculo en lugar de una ayuda. La mayoría de las herramientas de configuración de la GUI (bueno, prácticamente todas, realmente) solo ofrecen un subconjunto de la opción de configuración que puede establecer en un archivo de configuración con vim.

Administrar un cuadro de Linux no es menos trivial que administrar un cuadro de Windows. Solo toma un tiempo obtener un conjunto de habilidades decente.

¿Y una transferencia de archivos de red equivalente? Mucho. scp, sftp, ftp, nfs, cifs / smb (protocolos de intercambio de archivos de Windows) y más.

¿Está haciendo los cambios del archivo de configuración / ajustes de script directamente en la máquina? ¿O tiene algo configurado en su casilla local para editar estos archivos de forma remota? ¿O simplemente los edita de forma remota y luego los transfiere en cada guardado?

Depende de lo que estoy haciendo. La mayoría de las cosas que hago directamente en los archivos de configuración en la máquina (para cuadros de desarrollo y prueba) y luego inserto el archivo en un canal de configuración en nuestro servidor satelital, después de lo cual implemento el archivo directamente en todos los servidores (para cuadros de producción ) Realmente, vim es un tesoro. Es decir, cuando descubres cómo usarlo correctamente.

¿Cómo mueve los archivos de un lado a otro entre el servidor y su entorno local? FTP? ¿Algún tipo de unidad asignada a través de VPN?

scp todo el camino y tal vez algo de sftp, y te sugiero que también lo hagas. Nunca, nunca use FTP para mover archivos confidenciales (por ejemplo, archivos de configuración) a través de una red pública. No uso una red asignada porque, de nuevo, todo lo que necesito está en el servidor. Si te refieres a archivos c y no a archivos de configuración aquí, generalmente uso algo como svn o git y luego empujo mis cambios al cuadro.

Realmente necesito tener algunas mejores prácticas para administrar estos cuadros. ¡Cualquier sugerencia para eliminar algo del dolor sería bienvenida!

Ya los está utilizando: ssh, scp, wget y vim. Esos no son dolor. Puede haber algunos dolores de dentición, mientras te das cuenta de lo poderosos que son. Pero, para recuperar la analogía de Windows, me siento seriamente obstaculizado cuando tengo que usar una caja de Windows. Para ti es al revés. Es justo a lo que estás acostumbrado. Entonces, dale un poco de tiempo y vendrá a ti.


12

Ya mencionaste ssh, vim y wget, que es esencial y perfecto. Algunas herramientas adicionales que pueden facilitarle la vida:

1. Pantalla GNU / byobu

"GNU Screen es un multiplexor de terminal gratuito que permite al usuario acceder a múltiples sesiones de terminal separadas dentro de una sola ventana de terminal o sesión de terminal remota. Es útil para manejar múltiples programas desde la línea de comandos y para separar programas del shell que comenzó el programa." (Desde la página GNU_Screen en wikipedia)

Una ventaja principal es que puede tener uno o varios terminales virtuales que se encuentran exactamente en el mismo estado en que los dejó cuando regresa (es decir, vuelva a iniciar sesión mediante ssh). Esto también es bueno cuando su conexión se interrumpe por alguna razón.

La pantalla funciona independientemente del software que utiliza para conectarse a la caja (vive en el servidor), por lo que combina bien con la masilla o la mayoría de los demás software de terminal.

Este artículo muestra algunas cosas buenas que puede hacer con él: http://www.pastacode.de/extending-gnu-screen-adding-a-taskbar/en/

Una buena alternativa es byobu, que viene muy bien preconfigurado en algunas distribuciones: http://byobu.co/


2. Comandante de medianoche

Una herramienta de navegación tipo consola basada en gráficos para ver y manipular archivos y directorios.

También puede hacer transferencias remotas seguras. Hay un cliente FISH y FTP integrado.

Esto significa que tiene 2 ventanas de texto una al lado de la otra en una consola de línea de comandos y una muestra su casilla remota y la otra donde sea que la conecte (que también puede ser su sistema local). Luego puede navegar por ambos sistemas de archivos uno al lado del otro y marque o investigue archivos individuales o archivos de árbol y también cópielos o muévalos entre ubicaciones. FISH es seguro, FTP no lo es. Muy potente y simple para principiantes.


3. rsync

Para una transferencia y sincronización de archivos rápida, segura y confiable entre diferentes ubicaciones


4. VCS

Uso de un sistema de control de versiones distribuido como bazar, mercurial o git para actualizar el código. Github o Bitbucket ofrecen alojamiento de código comercial, pero no es necesario, también puede usarlo de manera eficiente en sus propias máquinas.

Joseph Kern: ¿puedes explicar cómo usas exactamente git para la organización de configuración remota?


5. Clientes terminales

En sistemas similares a Unix ya están a bordo, en Windows puede usar Putty, Tera Term, Mind Term o Pandora. O haga una instalación de cygwin y ssh desde las ventanas del terminal de cygwin a los cuadros remotos (lo que tiene más ventajas, pero esta es una cuestión de lo que prefiere).


6. Túneles y reenvío de puertos

Puede ser útil reenviar ciertos puertos de forma segura a su máquina local. Por ejemplo, puede reenviar el puerto mysql TCP 3306 o postgres TCP 5432 e instalar alguna herramienta de administración de base de datos localmente.

Puede construir túneles desde máquinas Windwos con masilla (o línea de comando basada en su hermano pequeño plink), con cygwin y Mindterm también pueden hacer reenvío de puertos. Si está localmente en una máquina similar a Unix, puede usar ssh odr plink para crear ese túnel.

Para crear un túnel más estable y permanente para varios puertos, recomiendo OpenVPN. El método de túnel de "clave precompartida" de punto a punto no es tan difícil de instalar.


7. Tener un sistema local similar a Unix

Cuando su máquina local es una Mac, ya tiene esto, puede abrir un shell local. Cuando su estación de trabajo está basada en Windows, podría ser útil crear un servidor similar a Unix local, que esté en la misma red local. Esta puede ser una máquina diferente en una habitación diferente conectada al mismo enrutador o conmutador. O si solo desea una máquina, puede instalar el servidor vmware gratuito y crear una máquina virtual, preferiblemente el mismo sistema operativo que su máquina remota. Instale un servidor de samba en él y puede "usar en red" los recursos compartidos de samba desde su escritorio.

Si tiene un servidor ssh en el servidor local y abre el puerto 22 en su enrutador, puede ingresar a su sistema local cuando esté fuera.

Puede construir túneles para máquinas remotas o transferir y sincronizar archivos y árboles de archivos completos con rsync. Puede usarlo para pruebas, para VSC, para desarrollo local, como servidor web local, para fines de capacitación.

Puede extraer copias de seguridad de máquinas remotas. Puede crear trabajos cron locales que realicen copias de seguridad de forma automática (por ejemplo, bases de datos que desea guardar de forma local regularmente)


8. X GUI remota

Si está trabajando físicamente en Linux como un sistema, también es posible ejecutar aplicaciones GUI en sus servidores Linux que dibujan la GUI en su máquina local. Esto podría ser una herramienta de comparación de archivos gráficos o casi cualquier cosa que desee.

Aunque no es muy común y en muchos casos no es necesario usar el software gui para la administración de Linux Box, en algunos casos puede resultarle útil si puede.

En la máquina remota, asegúrese de que en / etc / ssh / sshd_config exista esta línea:

X11Forwarding Yes

Reinicie el servidor ssh con

/etc/init.d/sshd restart

Luego, la próxima vez que inicies sesión con

ssh -X me@remote-box

Tendrá un túnel X, intente instalar xclock en el servidor remoto para realizar pruebas y ejecutar xclock IIN la sesión ssh que acabo de mencionar. Debería aparecer un simple reloj x para fines de prueba en su GUI de Linux.

Esto también es posible en una Mac si instala un entorno X local.


9. Si tiene un montón de cuadros o tareas similares: use una herramienta de configuración del sistema

Si tiene una granja de servidores o realiza grandes implementaciones en la nube con muchas máquinas redundantes o de otro modo iguales o similares, puede usar esto.

Probablemente no tendría sentido, si la mayoría de las cajas son individuales o tienen diferentes sistemas operativos o diferentes versiones ejecutándose.

Hay varias herramientas:


10. Implemente contenedores de aplicaciones con docker

Esto va incluso un paso más allá. Docker es un proyecto de código abierto que automatiza la implementación de aplicaciones dentro de contenedores de software: https://www.docker.io


11. Utilice Google Compute Engine con gestión de implementación automática

https://cloud.google.com/products/compute-engine/

Google ofrece máquinas virtuales Linux con posibilidades muy interesantes. Puede implementar rápidamente grandes grupos de máquinas virtuales con herramientas que incluyen una API RESTful, una interfaz de línea de comandos y una consola web. También puede usar herramientas como RightScale y Scalr para administrar automáticamente su implementación .


Creo que esta es una respuesta mucho más útil que la aceptada. MC es mi herramienta preferida, especialmente porque le permite cd /#sh:<user>@<server>:<directory>iniciar sesión en una máquina remota para navegar y transferir archivos, y dado que Ctrl-o lo cambia temporalmente a la consola. ¡Otra Ctrl-o te devuelve a MC con solo presionar una tecla!
Gustav Bertram

No se puede exagerar la conveniencia de tener un escritorio Linux al administrar servidores Linux. Aunque veo poco uso para Midnight Commander ...
Michael Hampton

@Michael El cliente FISH de mc es lo que uso mucho.
mit

4

Si está buscando una buena GUI para trabajar con la administración de archivos a través de SSH desde los cuadros de Windows, eche un vistazo a WinSCP: http://winscp.net

No administro ninguna instancia EC2, pero en general si tengo más de una máquina desempeñando un rol, intentaré escribir un script para realizar el trabajo en todos los cuadros similares, en lugar de hacer cambios cuadro por cuadro .

Me gustaría comenzar a usar Puppet ( http://reductivelabs.com/products/puppet/ ), porque hace que la administración del sistema sea más un ejercicio de administración de la configuración. Todavía no he tenido los ciclos de repuesto para echarle un vistazo en detalle, pero he escuchado cosas muy buenas.


4

Debe considerar una herramienta de administración de configuración del sistema como Chef.

Ya casi no manejo los sistemas manualmente a través de sesiones SSH. Guardo todo el código para aplicaciones web y proyectos en un repositorio de código fuente al que puedo acceder desde los sistemas que los ejecutan, por ejemplo, sitios web en EC2. Cuando se trabaja en la nube, es esencial contar con infraestructura automatizada.

El flujo de trabajo básico se ve así. Primero, para el código de la aplicación y los datos de configuración:

  • Código de clonación / pago de GitHub u otro repositorio de control de versiones.
  • Edite el código en mi editor favorito en mi estación de trabajo / laptop local.
  • Confirmar cambios, empujar al repositorio central.

Para la configuración, agregue:

  • Instale los archivos de configuración en la ubicación donde Chef puede servirlos.
  • Dispare una ejecución chef-cliente, o espere el intervalo, en los nodos de borde.

Los sistemas se configuran como instalaciones de paquetes, creación de usuarios, archivos de configuración generados a partir de plantillas, etc.

[Casi] nunca edito manualmente archivos de configuración, datos de aplicaciones o cualquier otra cosa en los sistemas remotos directamente. Los cambios se realizan a través de mi repositorio local y se envían al maestro. Sé que mis sistemas se configurarán correctamente cada vez, sin importar si tengo que matar una instancia y reiniciarla.

Los archivos necesarios para la configuración se sirven directamente desde el servidor Chef, que es solo una aplicación web (merb, que se ejecuta en Apache + Passenger). El acceso para los clientes se controla a través de la autorización openid.

Mi configuración incluye ganchos en Nagios y Munin, por lo que también obtengo monitoreo y tendencias sin tener que hacer nada manualmente para configurarlos.

Las mejores prácticas en estos días se están inclinando hacia la gestión de configuración automatizada. Si todavía está haciendo las cosas manualmente, está trabajando demasiado duro.


3

¿Qué hay de malo con ssh, vim y wget? Joyas desconocidas para la mayoría de los usuarios de Windows, en mi opinión. :-)

A veces uso gVim de forma remota a través de FTP o SFTP.

Si prefiere usar la GUI en la máquina Linux, puede ejecutar un servidor X (consulte Cygwin para obtener uno) en su host local y reenviar su pantalla a través de su conexión ssh.

Nunca consideré una solución VPN que valiera la pena el gasto o la molestia para administrar Linux.

Si está desarrollando y necesita ejecutar sus trabajos de desarrollo en el servidor, simplemente configure un cliente de control de revisión en el servidor, inicie sesión de forma remota, sincronice el cliente y ejecute su proceso.


3

La administración de cuadros remotos de Windows es trivial, ya que simplemente puede usar el escritorio remoto y transferir archivos a través de la red. ¿Hay un equivalente a esto en el mundo de Linux?

¿Se pretende este curricán?

La administración remota de cuadros de Windows no es trivial. La administración remota de cajas Unix se debe a que fueron diseñadas para ser administradas de forma remota y para estar en una red. Para Windows, era una conexión a un sistema que no estaba diseñado desde cero para vivir en una red.

Esto es anecdótico, pero según la experiencia en varias compañías, la relación entre el servidor y el administrador del sistema para las cajas de Linux es mucho, mucho más alta que para Windows. Simplemente porque la automatización en Windows no es trivial y una interfaz gráfica de usuario siempre será más lenta que las secuencias de comandos. Dicho esto, hay administradores de Windows que pueden acariciar una infraestructura de Windows para que sea fácil de administrar, sin embargo, estos administradores son muy raros.

Todas las herramientas que necesita están disponibles de forma predeterminada en cada distribución de Linux. Si desea un inicio de sesión gráfico, continúe y hágalo, solo desperdicia CPU y memoria y le dará los mismos problemas que tiene con Windows. Y como ya se dijo, para más de un puñado de cajas, debe considerar títeres, chef, cfengine o una de las muchas otras herramientas disponibles.


1
Me refería a Trivial en el sentido de que la experiencia de administrar un cuadro de Windows remoto es exactamente la misma que en mi escritorio. No hay aprendizaje necesario. Trabajar a través de SSH me parece como construir un barco en una botella. Tiene este pequeño agujero a través del cual puede tocar el servidor con un juego de pinzas largo. De hecho, me sorprende ver que todos ustedes realmente usan y disfrutan las herramientas de línea de comandos que ya estoy usando. Solo esperaba encontrar un rico conjunto de herramientas que había pasado por alto.
Jason Kester

2

Dice que está utilizando SSH para administrar "unos" cuadros. Recomiendo encarecidamente ClusterSSH para escribir los mismos comandos a todos a la vez (suponiendo que tengan un propósito similar).

http://www.linux.com/learn/tutorials/413853:managing-multiple-linux-servers-with-clusterssh

El uso es tan simple como "cssh -l username clustername", que abrirá muchas ventanas uxterm que puede administrar de una vez o por separado. El clúster se define mediante una lista de IP en un archivo de configuración. Lo único que falta es el soporte X, que yo sepa.

EDITAR: He migrado a Terminator ya que el diseño de múltiples terminales se puede guardar y restaurar fácilmente, además de obtener 10 túneles X simultáneos si es necesario. Facilita la configuración de las computadoras del servidor y del cliente al mismo tiempo.

Además, Fabric es útil cuando hago actualizaciones de software en mis clientes, básicamente reemplazando todo ese material zip / scp / unzip / cp.


1

Yo suelo:

  • SSH - Para acceso
  • SCP - Copiando archivos
  • SSHFS: si necesito montar una unidad o directorio
  • git: guardar configuraciones

Poner mis configuraciones bajo control de versiones fue probablemente la cosa más inteligente que hice. Utilizo herramientas basadas en SSH tan a menudo como sea posible para reducir la huella administrativa y la superficie de ataque.

Actualmente todos mis repositorios de git son locales. En el futuro, moveré las configuraciones a repositorios remotos.


1

No se olvide de usar Webmin , una interfaz basada en web para la administración del sistema para Unix / Linux.


0

SSH siempre ha sido suficiente para mí. Hay otras opciones X11 es esencialmente escritorio remoto, aunque es intrínsecamente inseguro ya que solo no está encriptado. Sin embargo, se puede tunelizar a través de una conexión SSH (y obtiene el beneficio de no tener que abrir puertos adicionales). Por supuesto, esto supone que tiene un entorno X instalado en el servidor.

SFTP (que es ftp sobre SSH, por lo que, una vez más, no es necesario abrir puertos adicionales) se puede utilizar para colocar archivos en el servidor en lugar de extraerlos. Puede encontrar un buen cliente sftp de Windows en http://filezilla-project.org/


0

Me desplazo al cuadro y hago cambios en la línea de comandos y con editores como vi / nano cuando el cambio es simple. Para un cambio más complejo en el archivo, como editar múltiples códigos fuente al mismo tiempo, uso BBEdit en Mac OS X. Puede acceder al sistema de archivos usando SCP. Estoy seguro de que existe dicho editor para Windows y Linux. sshfs es una forma de acceder a su sistema de archivos de forma remota utilizando ssh.


0

Definitivamente PuTTY; Además del cliente ssh, también hay un cliente SCP basado en Windows.


0

Línea de comando sobre ssh para linux (ya que ni siquiera tienen instalado X11) y una combinación de ssh y ARD para mis máquinas Apple.

Tenga en cuenta que nunca uso Apple Remote Desktop para transferir archivos, porque AFP sobre TCP es ridículamente lento ; Yo solo uso scp.


0

Si desea acceso gráfico remoto, seguramente querrá configurar VNC.

Si desea editar sus archivos de forma remota a través de SSH, tiene algunas opciones:

  • si usa herramientas KDE (Kate, KDevelop), use el pez protocolo .
  • configurar FUSIBLE para (automático) montar su volumen remoto.
  • Use muCommander (un gráfico multiplataforma mc) para mover sus archivos de un lado a otro
  • algunos editores de texto (por ejemplo, TextWrangler en Mac) admiten la obtención de archivos a través de ssh y moverlos de un lado a otro

Después de editar su archivo, simplemente use SSH para, por ejemplo, comenzar a compilar.

Otra cosa a considerar es usar un sistema de control de versiones. bzr es realmente agradable; es fácil de configurar y está diseñado para ser fácil de usar. Podría trabajar en una computadora, impulsar la actualización, extraer la actualización en su servidor, ejecutar comandos y revertir si las cosas salen mal.


0

SSH hace el trabajo la mayor parte del tiempo. Aprender las herramientas de línea de comandos disponibles para usted vale la pena. Si hay herramientas GUI que quiero usar, solo uso VNC .

Para mover archivos, suelo montar un recurso compartido CFIS / SAMBA en mi máquina local.


0

Para cambios simples, SSH y SCP hacen el truco. Si necesita realizar cambios en un mayor número de máquinas, debe buscar un sistema de administración de configuración. Podrá iniciar / detener el servicio, cambiar el contenido de los archivos de configuración y verificar que sus sistemas estén en un estado conocido.

Prefiero usar Bcfg2 pero Puppet y CFEngine también son populares.

Tengo Bcfg2 ejecutándose cada hora en todos mis servidores, aunque también se puede ejecutar manualmente. Hay un depósito central controlado por versión de todos los archivos de configuración del sistema para que podamos realizar un seguimiento de las modificaciones que se realicen. El sistema funciona extremadamente bien y es un gran paso adelante desde el inicio de sesión en los servidores de forma manual y las modificaciones.



0

La administración de sistemas Windows siempre ha sido "pesada": es decir, se necesita un entorno de ventanas completo, que requiere estar en el sitio o en una aplicación de red como Remote Desktop o VNC.

UNIX se diseñó teniendo en cuenta las redes, por lo que las herramientas están diseñadas para trabajar en la red, no para verse bien. Un servidor UNIX nunca debe tener ese entorno de ventanas (X11 generalmente) configurado.

La interfaz minimalista de SSH, wget y vim es mucho más propicia para la red; de hecho, vi fue diseñado para funcionar en una línea de módem de 300 baudios.

De hecho, existen herramientas gráficas que lo ayudarán a trabajar con sistemas remotos UNIX y Linux (wsp era uno; gvim puede ser otro).

La forma habitual de administrar sistemas UNIX es iniciar sesión en la máquina y trabajar en la misma máquina. No hay necesidad de mover archivos solo para editarlos. Lo único que debe recordarse es asegurarse de que la configuración sea buena y probarla siempre que sea posible.


0

SSH para acceder, scp si necesito transferir una cantidad limitada de archivos. Directorios compartidos a través de SMBFS / SAMBA si REALMENTE lo necesitamos. Por lo general, es una pérdida de tiempo. Algunos de nuestros empleados menos * nix-competentes utilizan webmin bloqueado para acceso de subred local a través de HTTPS.


0

Shellinabox

Shell In A Box (pronunciado como shellinabox) es un emulador de terminal basado en web creado por Markus Gutschke. Tiene un servidor web incorporado que se ejecuta como un cliente SSH basado en la web en un puerto específico y le solicita un emulador de terminal web para acceder y controlar su Shell SSH del servidor Linux de forma remota utilizando cualquier navegador habilitado para AJAX / JavaScript y CSS sin la necesidad de cualquier complemento adicional del navegador como FireSSH. - http://www.tecmint.com/shell-in-a-box-a-web-based-ssh-terminal-to-access-remote-linux-servers/

Emulación de terminal en el cliente

AjaxTerm es un programa similar a Anyterm , de Antony Lesuisse, escrito en Python. Shell In A Box es un programa similar a Anyterm, de Markus Gutschke, escrito en C. A diferencia de Anyterm y Ajaxterm, realiza la emulación de terminal en el navegador, no en el servidor: http://anyterm.org/demos.html#secid2249226

Butterfly también es un servidor web (escrito en python) que alimenta un terminal web emulado del lado del cliente con todas las funciones.


1
Nooooo !! ¡Shell in a Box es tan inseguro!
ewwhite

¿Alguna vez has usado Butterfly antes?
Pegues
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.