Tensin

Aller au contenu Aller au menu Aller à la recherche

mercredi, décembre 12 2012

Démarrer une virtualbox en plein écran sur un desktop dédié

VirtualBoxEn trois lignes :

  • démarrer la machine virtuelle avec la commande “VirtualBox” et les bons paramètres (startvm et fullscreen)
  • récupérer l’ID de la fenêtre démarrée avec wmctrl
  • positionner, toujours avec wmctrl, cette fenêtre sur un autre desktop

Fonctionne parfaitement dans mon cas sur Ubuntu + Cinnamon.

La version longue (à enregistrer dans un .sh, dont le premier paramètre sera le nom de la virtualbox et le deuxième le numéro du desktop) :

#!/bin/zsh
[[ "$#" -ne 2 ]] && echo "Usage: $(basename $0) VIRTUALBOX_NAME DESKTOP_ID" && exit 1
VIRTUALBOX="$1"
DESKTOP="$2"

# === Starts virtualbox in fullscreen mode (detached from the current shell)
[[ $(wmctrl -l|egrep -i ".*${VIRTUALBOX}.*running.*virtualbox.*"|wc -l) -eq 1 ]] && echo "Virtualbox [$VIRTUALBOX] already running" && exit 1
nohup VirtualBox --startvm "$VIRTUALBOX" --fullscreen >/dev/null 2>&1 &

# === Move window to another desktop as soon as the window is available
WINDOW_ID=""
COUNT=0
while [[ -z "$WINDOW_ID" ]] ; do
  wmctrl -l|egrep -i ".*${VIRTUALBOX}.*running.*virtualbox.*"|read WINDOW_ID DUMMY
  if [[ -z "$WINDOW_ID" ]] ; then
    COUNT=$(expr $COUNT + 1)
    if [[ "$COUNT" -gt 10 ]] ; then
      echo "Waited 10 seconds without finding the virtual box window, now stopping ..."
      exit 1
    fi
    sleep 1
  else
    break;
  fi
done  

echo "Now sending virtualbox [$VIRTUALBOX] running on window [$WINDOW_ID] to desktop [$DESKTOP]"
wmctrl -i -r "$WINDOW_ID" -t "$DESKTOP"

Remarque : à savoir, pour le positionnement sur un desktop précis, le premier bureau est numéroté 0.

Commandes utiles additionnelles.

Lister tous les desktops disponibles :

wmctrl -d

Ex. :

0  * DG: 1920x1080  VP: 0,0  WA: 0,0 1920x1080  Espace de travail 1
1  - DG: 1920x1080  VP: N/A  WA: 0,0 1920x1080  Espace de travail 2

Liste toutes les fenêtres :

wmctrl -l

Stopper une virtualbox par la ligne de commande :

VBoxManage controlvm NOM_VIRTUALBOX savestate

mardi, août 21 2012

Eclipse, astuces & optimisations

EclipseCi-dessous les slides d’une présentation réalisée pour le boulot et détaillant un certain nombre d’astuces, de raccourcis-claviers, d’optimisations, de plugins, que l’on gagne à connaître quand on utilise Eclipse comme IDE de développement Java.

Il y a un peu de tout, chaque développeur en connaît forcément une bonne partie, mais peut-être pas tout. Cette présentation ne se veut aucunement exhaustive, c’est juste un moyen de centraliser un certain nombre d’informations à même de permettre de mieux utiliser l’outil.

Elle est essentiellement centrée sur Eclipse 3.7 Indigo, mais tout ce qui y figure est toujours valide pour Eclipse 3.8/4.2 Juno.

Au programme : des plugins injustement méconnus et pourtant très utiles comme Grep Console, les raccourcis-claviers indispensables (recherche incrémentale, quick-edit, etc.), des optimisations (sur le content-assist, la purge du cache OSGI, certaines désactivations, la bonne cohabitation Eclipse / Maven), etc.

Présentation Eclipse

La présentation en HTML5/javascript étant propulsée par deck.js, un navigateur récent (Chrome ou FireFox) est obligatoire. Une version .pdf, non interactive (pas de vidéos, pas d’images aggrandissables) est toutefois disponible en complément ici.

Convertir une image virtuelle VMDK (VMWare) au format VirtualBox (VDI)

VirtualBoxPour convertir un disque source au format .vmdk (format natif VMWare) vers le format VirtualBox (.vdi), utiliser :

vboxmanage clonehd image-source.vmdk image-destination.vdi -format VDI

Ce qui s’avère plus efficace et plus direct que de faire un transfert logique avec un outil de clonage comme CloneZilla

mardi, mai 8 2012

PS3MediaServer et boîtier Sony SMP-N200

Sony SMP-N200Sony propose depuis quelques mois un boîtier multimédia dont le coeur est issu de celui de la PS3 : le boîter Sony SMP-N200. La navigation dans les menus reprend celle du XMB de la PS3.

Pour accéder depuis ce boîtier, par le réseau, au contenu diffusé par PS3MediaServer, il faut utiliser la configuration suivante (adaptée depuis le fichier de configuration du lecteur BluRay de Sony).

Fichier à placer : renderers/SMP-N200.conf

RendererName=Sony SMP-N200
RendererIcon=/home/applications/ps3mediaserver/1.52.1/SMP-N200.png
UserAgentSearch=UPnP/1.0
UserAgentAdditionalHeader=X-AV-Client-Info
UserAgentAdditionalHeaderSearch=(cn="Sony Corporation"; mn="Media Player" )
Video=true
Audio=true
Image=true
SeekByTime=true
DLNALocalizationRequired=true
TranscodeVideo=MPEGAC3
TranscodeAudio=WAV
DefaultVBVBufSize=true
MuxH264ToMpegTS=false
MuxDTSToMpeg=false
WrapDTSIntoPCM=false
MuxLPCMToMpeg=false
MaxVideoBitrateMbps=0
MaxVideoWidth=0
MaxVideoHeight=0
H264Level41Limited=true
TranscodeAudioTo441kHz=false
TranscodeFastStart=false
TranscodedVideoFileSize=0
AutoExifRotate=true
MimeTypesChanges=video/avi=video/x-divx
StreamExtensions=
ChunkedTransfer=true
ForceJPGThumbnails=true
MediaInfo=true
# Supported = f:mpegps|mpegts    v:mpeg2    a:ac3|aac|mpa   m:video/mpeg
# Supported = f:mp3   m:audio/mpeg
# Supported = f:lpcm  m:audio/L16
# Supported = f:jpg   m:image/jpeg
# --- video ---
Supported = f:mpegps|mpegts     v:mpeg1|mpeg2   a:ac3|dts|lpcm|mpa|mp3  m:video/mpeg
Supported = f:mpegts    v:h264|vc1      a:ac3|dts|dtshd|truehd|aac|lpcm|mpa|mp3 m:video/vnd.dlna.mpeg-tts
Supported = f:mp4|m4v   v:mp4|h264      a:ac3|dts|dtshd|truehd|aac|lpcm|mpa|mp3 m:video/mpeg
######### NON-US MODELS: CHANGE THE FOLLOWING 2 MIME-TYPES TO m:video/divx
Supported = f:avi|divx  v:divx|mp4      a:ac3|lpcm|mpa|mp3      m:video/divx
Supported = f:mkv       v:mp4|divx|h264 a:ac3|dts|dtshd|truehd|aac|lpcm|mpa|mp3 m:video/divx
# --- audio ---
Supported = f:wma       n:2     m:audio/mpeg
Supported = f:mp3       n:2     m:audio/mpeg
Supported = f:lpcm n:2 s:48000 m:audio/L16
# --- image ---
Supported = f:jpg       m:image/jpeg

mardi, avril 10 2012

En finir avec les répertoires target de Maven sous Eclipse

Pour ne plus être pollué par le contenu des répertoires target de Maven (contenant notamment les classes compilées) lorsque l’on travaille sous Eclipse, il suffit de les marquer en “derived”. Ceci permet d’indiquer à Eclipse que le contenu de ce répertoire ne doit pas être pris en compte lors des recherches, lors des mécanismes de navigation type CTRL+T, etc. C’est un vrai gain de temps sur de gros projets (sans compter que le résultat des recherches est dès lors plus clair).

Propriété "derived" sur une ressource Eclipse

Cette manipulation n’est aujourd’hui pas automatisable depuis Maven (même si d’antédiluviens bugs y font référence). Le problème étant dès lors qu’à chaque fois qu’une opération “clean” est effectuée côté Maven, le répertoire est effacé, et Eclipse perd l’état derived, qu’il faut donc réappliquer.

La solution pour s’en sortir est de paramétrer Maven, côté pom.xml, pour qu’il n’efface plus le répertoire target, mais uniquement son contenu.

Pour ce faire il suffit de mettre à jour la configuration du plugin maven-clean-plugin.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-clean-plugin</artifactId>
  <version>2.4.1</version>
  <configuration>
    <excludeDefaultDirectories>true</excludeDefaultDirectories>
      <filesets>
        <fileset>
          <directory>target</directory>
          <includes>
            <include>**/*</include>
          </includes>
        </fileset>
      </filesets>
  </configuration>
</plugin>

Le résultat est visible dans la log de Maven :

------------------------------------------------------------------------ [INFO] Building sonos-root [INFO] task-segment: [clean] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean {execution: default-clean}] [INFO] Deleting /home/users/sergio/Java/workspaces/eclipse/perso-java/sonos-root/target (includes = [**/*], excludes = []) [INFO] [cobertura:clean {execution: clean}] [INFO] ------------------------------------------------------------------------

Cette paramétrie gagne bien sûr à être mutualisée à travers différents projets en la définissant dans pom parent root.

jeudi, mars 10 2011

Colorer différemment le background de vos sessions SSH

ShellPour mettre en couleur le fond d’un terminal sous Linux, il n’y a guère de solutions … Jusqu’ici le plus simple était de jouer avec les profils de Gnome-Terminal (ou autre) et d’associer à tous les onglets la même couleur de fond. Par contre pour avoir une couleur différente sur chaque onglet, c’était jusqu’ici mission impossible, ce qui au demeurant est relativement étonnant, pour ma part j’aurais besoin de cette fonctionnalité :

  • au travail pour avoir une couleur de fond différente selon le type de machine sur laquelle je me connecte (rouge pour les machines en production, noir pour les serveurs de développement par ex.) ;
  • chez moi pour différencier la machine sur laquelle je suis connecté (serveur domotique, serveur dédié en ligne, etc.) ;

Je configure bien ces infos dans le prompt (via PS1, avec le login et le hostname), mais c’est très insuffisant (pas suffisament visuel).

Or une solution plutôt élégante existe désormais, mise en place par Ian Blanes : un petit programme en C, sans dépendances, qui s’appelle “colorize”. C’est ce programme qui lance la commande ssh, redirige les entrées / sorties entre le terminal et la connexion ssh, et dans l’intervalle, modifie les couleurs de fond et/ou de police de caractères.

Colorize

Testée sous evilvte et gnome-terminal, çà fonctionne parfaitement bien, à priori sans ralentissements visibles. Ian explique toutefois que les lignes ayant déjà nativement un fond de couleur se comporteront mal (ce n’est quasiment jamais le cas chez moi).

Sources : http://deic.uab.es/~iblanes/colorize-0.1-src.tar.gz [Colorizer (sources) v0.1mirror ] Homepage : http://deic.uab.es/~iblanes/

L’installation est très simple :

wget http://deic.uab.es/~iblanes/colorize-0.1-src.tar.gz tar xzvf colorize-0.1-src.tar.gz make

Copier ensuite le programme colorize dans un répertoire accessible via le path, par ex. /usr/bin. Le lancement se fait ensuite via pour lancer un SSH avec un fond (-b) gris foncé (Ox333333) par ex. :

colorize -b 0x333333 — ssh root@192.168.0.1

Ensuite à l’utilisation, deux possibilités. Soit définir des alias de commande ssh pour chacune des machines sur laquelle se connecter.

alias ssh-production=’colorize -b 0x333333 — ssh root@192.168.0.1’

alias ssh-dedie=’colorize -b 0xCC0000 — ssh tensin’ # réutilisation alias défini dans ~/.ssh/config

Soit enrober l’appel de la commande ssh avec un fichier de paramétrie. Il suffit dans dans ce cas de créer un fichier ~/.ssh-colorize avec le contenu suivant (premier champ = le hostname, ou l’alias ssh ; deuxième champ, la couleur de background) :

192.168.0.2    0x440000
192.168.0.3    0x440000
solaris        0x000044

Et dans son fichier .profile (ou équivalent si autre shell) mettre en place la fonction suivante :

  1. function ssh {
  2. typeset DEST=$1
  3. if [[ -s ~/.ssh-colorize ]] ; then
  4. HOSTNAME=$(echo "$DEST" | sed 's/.*@//')
  5. egrep "^$HOSTNAME" .ssh-colorize 2>/dev/null | awk ' { print $2 } ' | read COLOR
  6. fi
  7. if [[ ! -z "${COLOR}" ]] ; then
  8. colorize -b "${COLOR}" -- /usr/bin/ssh "${DEST}"
  9. else
  10. /usr/bin/ssh "${DEST}"
  11. fi
  12. }

De fait, tous les appels ssh passeront par cette fonction, qui ira relire dans ~/.ssh-colorize, si renseigné, le code couleur de background à utiliser ! Ca permet de centraliser toutes les définitions de couleur de background et de facilement en ajouter sans devoir créer des alias.

mardi, mars 8 2011

Choix du workspace Eclipse à utiliser au démarrage via un launcher interactif (Linux)

EclipseComme je travaille avec plusieurs workspaces Eclipse (regroupant chaque plusieurs projets Eclipse corrélés entre eux, par ex. tous les modules d’un même projet, ou tous mes projets personnels Java ou PHP, ou tous mes projets de tests, etc.), il est beaucoup plus pratique pour moi de choisir le workspace sur lequel je veux travailler directement en démarrant Eclipse (plutôt que de switcher après coup).

De fait, tous mes raccourcis Eclipse pointent en fait sur le script ci-dessous.

Le script se base sur le méconnu mais assez pratique Zenity pour gérer la fenêtre de lancement, et se contente ensuite de démarrer Eclipse avec le paramètre -location chemin_du_workspace.

Visuellement et concrètement çà ressemble à çà, la liste des workspaces, le nombre de projets dans chaque workspace, il suffit de sélectionner celui sur lequel on veut démarrer :

workspaces-eclipse-launcher.png

Remarque : bien sûr l’autre manière de changer de workspace consiste à switcher depuis un Eclipse déjà démarré vers un autre workspace (ne pas oublier dans ce cas de cocher la petite case “Copy Settings > Workbench Layout” pour garder la disposition des fenêtres / perspectives).

workspaces-eclipse.png

Le script ( eclipse-launcher.sheclipse-launcher.sh ). A adapter pour les paramètres qui vous seraient propres, bien sûr (chemin vers Eclipse et paramètres additionnels Eclipse notamment).

  1. #!/bin/ksh
  2.  
  3. # ========================================================
  4. # === Variables
  5. # ========================================================
  6. export windows_title="Eclipse Launcher"
  7. export WNG_ICON="/opt/gnome/share/pixmaps/gnome-warning.png"
  8. export ECLIPSE_ICON="/opt/Eclipse_DEV/Eclipse-V3-2-1/icon.xpm"
  9. export WORKSPACES_DIR="/home/user/java/workspaces/eclipse/"
  10. export JAVA_HOME="/home/user/applications/java/jdk1.6.0_24"
  11. export ECLIPSE_BIN="/home/user/applications/eclipse/helios/java/eclipse"
  12. export JAVA_PARAMETERS="-vmargs -Xss4m -Xms326m -Xmx444m -XX:PermSize=256m -XX:MaxPermSize=256m"
  13.  
  14. # ========================================================
  15. # === Récupération de la liste des workspaces
  16. # === et construction pour affichage par Zenity
  17. # ========================================================
  18. WORKSPACES=""
  19. ls -1d "${WORKSPACES_DIR}"/* | egrep -v "\..*|*\.xml" | sort -u | while read ITEM
  20. do
  21. WORKSPACE_NAME="$(basename ${ITEM})"
  22. WORKSPACE_COUNT=$(ls -1d "${ITEM}"/* 2>/dev/null | grep -v total | wc -l)
  23. WORKSPACES="${WORKSPACES}${WORKSPACE_NAME} ${WORKSPACE_COUNT}
  24. "
  25. done
  26.  
  27. # ========================================================
  28. # === Lancement de Zenity
  29. # ========================================================
  30. ret=`zenity --list --width="320" --height="520" --window-icon="${ECLIPSE_ICON}" \
  31. --text "Choisissez le workspace" \
  32. --column "Workspace" \
  33. --column "Projets" \
  34. $WORKSPACES --title "${windows_title}"`
  35.  
  36. # ========================================================
  37. # === Démarrage d'Eclipse avec le bon workspace
  38. # ========================================================
  39. if [[ ! -z $ret ]] ; then
  40. export GTL_MODULES="";
  41. cmd='nohup '${ECLIPSE_BIN}' -showlocation -data "'${WORKSPACES_DIR}$ret'" -vm '${JAVA_HOME}'/bin/java ${JAVA_PARAMETERS} >/dev/null 2>&1 &'
  42. echo $cmd
  43. eval $cmd
  44. fi

Recevoir un mail de notification quand de nouveaux paquets apt-get sont disponibles

ShellAyant plusieurs machines dont deux connectées constamment sur le net’, je n’aime pas ne pas les avoir à jour. En même temps, je ne tiens pas à activer l’installation automatique des packages, afin de garder la main sur ce qui est installé et d’éviter les mauvaises surprises (typiquement pouvant survenir sur une montée de version sensible comme PHP).

Du coup j’ai installé ce petit script très simple en cron sur chaque machine, il tourne une fois par jour et m’envoi un mail pour m’indiquer s’il y a des mises à jour en attente sur ce système. Le principe est simplement de lancer la commande apt-get en mode simulation pour savoir s’il y a des installations à faire.

A noter :

  • j’utilise sur toutes mes machines le très simple esmtp plutôt que sendmail ;
  • le script fonctionne sur un système anglais ou français (j’ai les deux) ;
  • le script fonctionne sous Debian Squeeze et Ubuntu (j’ai les deux aussi) ;
  • au sein du mail reçu, les packages sont clickables et renvoit sur la documentation officielle correspondante ;
  • il doit bien sûr être lancé en root pour pouvoir exécuter les commandes apt-get ;

Résultat du mail.

notify-apt-updates.png

Lancement en cron (par ex. depuis /etc/crontab).

notify-apt-updates-crontab.png

Le script (à mettre dans /usr/bin/notify_apt_updates.sh et à paramétrer) ( notify_apt_updates.sh ).

  1. #!/bin/ksh
  2.  
  3. # ======================================================================
  4. # === Mise à jour
  5. # ======================================================================
  6. echo "--- DEBUT -------------------- $(date) --------------------"
  7. apt-get update
  8.  
  9. # ======================================================================
  10. # === Variables système
  11. # ======================================================================
  12. HOSTNAME=$(hostname)
  13. IP=$(ifconfig | grep "inet ad" | grep -v "127.0.0.1" | head -1 | cut -f2 -d: | awk '{print $1}')
  14. DATE=$(date "+%Y-%m-%d %H:%M:%S")
  15. SYSTEM_NAME=$(lsb_release -a 2>/dev/null | grep -i codename | awk ' { print $2 } ' )
  16. SYSTEM_TYPE=$(lsb_release -a 2>/dev/null | grep -i "distributor id" | awk ' { print $3 } ' )
  17. SYSTEM_TYPE_m=$(echo "${SYSTEM_TYPE}" | tr "[A-Z]" "[a-z]")
  18. MAIL_CONTENT_FILENAME="/tmp/mail_content_$$.txt"
  19. PACKAGES_BASE_URL=""
  20. if [[ "${SYSTEM_TYPE_m}" = "debian" ]] ; then
  21. PACKAGES_BASE_URL="http://packages.debian.org/${SYSTEM_NAME}/"
  22. else
  23. if [[ "${SYSTEM_TYPE_m}" = "ubuntu" ]] ; then
  24. PACKAGES_BASE_URL="http://packages.ubuntu.com/fr/${SYSTEM_NAME}/"
  25. fi
  26. fi
  27.  
  28. # ======================================================================
  29. # === Variables à paramétrer
  30. # ======================================================================
  31. MAIL_FROM="me@hostname"
  32. MAIL_DEST="me@hostname"
  33. MAIL_SUBJECT="Server [${HOSTNAME}] - new updates found"
  34.  
  35. # ======================================================================
  36. # === Corps du traitement
  37. # === Exemple de sortie apt-get si mise à jour :
  38. # === 18 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  39. # ======================================================================
  40. NB_EN=$(apt-get -s upgrade | egrep ".*upgraded.*newly installed.*remove" | grep -v "0 upgraded" | wc -l)
  41. NB_FR=$(apt-get -s upgrade | egrep ".*mis à jour.*nouvellement installés.*à enlever.*non mis à jour" | grep -v "0 mis à jour" | wc -l)
  42. if [[ "$NB_EN" -eq 0 && "$NB_FR" -eq 0 ]] ; then
  43. echo "No updates found, nothing to notify."
  44. else
  45. echo "Updates found."
  46. PACKAGES=""
  47. HTML_PACKAGES=""
  48. apt-get -s upgrade 2>/dev/null | grep "^Inst" | while read INST PACKAGE DUMMY
  49. do
  50. if [[ ! -z "${HTML_PACKAGES}" ]] ; then
  51. HTML_PACKAGES="${HTML_PACKAGES}, "
  52. PACKAGES="${PACKAGES} "
  53. fi
  54. if [[ ! -z "${PACKAGES_BASE_URL}" ]] ; then
  55. URL='<a href="'${PACKAGES_BASE_URL}${PACKAGE}'">'${PACKAGE}'</a>'
  56. else
  57. URL="${PACKAGE}"
  58. fi
  59. HTML_PACKAGES="${HTML_PACKAGES}${URL}"
  60. PACKAGES="${PACKAGES}${PACKAGE}"
  61. done
  62. echo "Packages to be updated : ${PACKAGES}"
  63. cat << EOF > "${MAIL_CONTENT_FILENAME}"
  64. From: ${MAIL_FROM}
  65. To: ${MAIL_DEST}
  66. Subject: ${MAIL_SUBJECT}
  67. MIME-Version: 1.0
  68. Content-Type: multipart/mixed;
  69. boundary="PAA08673.1018277622/${HOSTNAME}"
  70.  
  71.  
  72. This is a MIME-encapsulated message
  73.  
  74.  
  75. --PAA08673.1018277622/${HOSTNAME}
  76. Content-Type: text/html
  77.  
  78. <html>
  79. <head>
  80. <title>${MAIL_SUBJECT}</title>
  81. </head>
  82. <body>
  83. <table border="0">
  84. <tr>
  85. <td><b>Server</b></td><td>&nbsp;:&nbsp;</td><td>${HOSTNAME} (${IP}) [${SYSTEM_TYPE_m}-${SYSTEM_NAME}]</td>
  86. </tr><tr>
  87. <td><b>Date</b></td><td>&nbsp;:&nbsp;</td><td>${DATE}</td>
  88. </tr><tr>
  89. <td><b>New packages</b></td><td>&nbsp;:&nbsp;</td><td>${HTML_PACKAGES}</td>
  90. </tr>
  91. </table>
  92. </body>
  93. </html>
  94. EOF
  95. echo "Sending mail to : ${MAIL_DEST}"
  96. esmtp -t < "${MAIL_CONTENT_FILENAME}"
  97. fi
  98. echo "--- FIN -------------------- $(date) --------------------\n"

samedi, janvier 1 2011

Quelle solution de backup

backupVoilà, je cherche une solution de backup à installer sur mon environnement réseau, et j’ai du mal à trouver une.

Je liste ci-dessous ce que j’ai à sauvegarder, les outils essayés ou en cours de tests, et quelques pistes de réflexion sur une solution “idéale” pour mon cas de figure.

Ma configuration à backuper :

  • Un PC “serveur” Linux sous Ubuntu 10.10 : sauvegarde de fichiers de configuration, sites web, plusieurs bases de données, repository GIT, données personnelles. Donc des fichiers locaux à sauvegarder (tout /etc, quelques fichiers sous /usr/bin, un /home/user, etc.).
  • Un serveur dédié Linux sous Ubuntu 9.10 en ligne (chez OVH) : sauvegarde de fichiers de configuration, sites web, plusieurs bases de données, repository GIT.
  • Un PC portable sous Linux SUSE Enterprise SLED11 : fichiers de configuration, fichiers personnels, bases de données MySQL, etc.
  • Un netbook sous Windows XP : quelques rares fichiers de configuration.
  • Un plug computer sous Debian : fichiers de configuration.

Mes souhaits pour l’outil de backup :

  • simplicité de configuration (tant pour le serveur principal que pour les machines à sauvegarder) ;
  • installation simple (pas de dépendances compliquées) ;
  • fonctionnement possible en réseau : backup vers une machine centrale, backups croisés, mode push et/ou pull, etc. ;
  • multi-protocoles : sauvegarde de fichiers locaux, de fichiers distants, exports de bases de données, prises de snapshot de repository GiT, CVS et éventuellement SubVersion, etc. ;
  • si possible, facilité d’accès aux fichiers sauvegardés : pas de manipulations compliquées pour récupérer un fichier : comme la récupération est tout de même rare et ponctuelle, ce point est mineur, mais dans l’idéal une récupération directement sur disque serait parfaite ;
  • interfaçage DropBox ou autre (Amazon S3) pour envoi de certains fichiers en ligne ;
  • encryption éventuelle des données sauvegardées ;
  • fonctionnement obligatoire en ligne de commande (configuration + lancement), mais interface de configuration / manipulation à côté envisageable (client lourd ou client web) ;
  • projet actif ;
  • une bonne gestion des erreurs : si quelque chose se passe mal, il faut que j’en sois averti !

Les fonctions dont je n’ai pas besoin et que beaucoup de solutions de backup proposent :

  • gravage des données sur disques ou bandes ;
  • mécanismes de sauvegardes incrémentales / différentielles ;

Bref pour résumer, dans l’idéal, il me faudrait un système de plugins (qui doivent être faciles à écrire / modifier / paramétrer) :

  • plusieurs plugins en entrée quoi sauvegarder (fichiers locaux, fichiers distants, bases de données, outils, etc.) ;
  • plusieurs plugins en sortie où sauvegarder (FTP, SSH distant, machine locale, DropBox, Amazon S3, etc.) ;

Avec simplement un appairage entre éléments en entrée et éléments en sortie (quoi sauvegarder, où).

Les pistes de logiciels existants à ma connaissance :

  • rsnapshot : l’outil que j’utilise actuellement mais qui ne me satisfait clairement pas totalement (configuration laborieuse et peu souple, mauvaise gestion des erreurs, …) ;
  • Unison ;
  • Duplicity + frontal ;
  • Cedar backup ;
  • Backup Manager : voilà bien un projet que je trouve obscur et pas intuitif … pas pour moi ;
  • Backupeur : pas mal, léger, mais tout en shell script (donc difficilement portable, et nécessiterait pas mal d’évolutions) ;
  • rdup ;
  • rdiff-backup ;
  • boxbackup ;
  • dirvish ;
  • backupninja : semble intéressant, à creuser ;

Concernant les outils “bas-niveau”, il y a bien sûr :

  • rsync : répond nativement à une partie des problématiques, sauvegarde différentielle de répertoires locaux ou distants ;
  • dar : Disk ARchive, projet très intéressant, une sorte de tar plus évolué, adapté aux sauvegardes de type backup ;

Ces outils en eux-même ne gèrent pas toutes les problématiques que je souhaite couvrir.

Reste la piste de créer moi-même mon propre système de backup … réflexion en cours, pour le moment je partirais sur :

  • réalisation en Java ;
  • principe client / serveur : dans un premier temps, une partie serveur, exécutable sur une ou plusieurs machines, et dans un deuxième temps un ou plusieurs clients (client lourd / client web) ;
  • le principe de plugins en entrée et en sortie évoqué plus haut ;
  • problème n°1 : la librairie rsync n’a pas de réelle implémentation Java (il y a 2 projets non terminés et qui n’évoluent plus : librsync et jarsync, plus peut-être plus tard java-rsync, mais ce projet n’a encore produit aucun code) ;
  • problèmé n°2 : la librairie dar n’existe pas en Java, donc pas d’usage possible en natif ;
  • ces outils ne seraient donc utilisables, comme les autres commandes systèmes type export de bases de données mysql, que par exécution depuis la couche Java de commandes systèmes, ce qui est évidemment facile à faire, mais tout de même moins élégant (problème de configuration, de multi-plateforme, etc.) ;

Annexes.

A noter un ouvrage chez O’Reilly dédié à cette problématique : backup and recovery.

Backup and recovery (O'Reilly)

Quelques liens en vrac en complément :

Retirer en ligne de commande le password d'un fichier .pdf

PDFPour retirer, sous Linux, le mot de passe d’un fichier .pdf, rien de plus simple. On parle bien ici du cas de figure où l’on est (légalement) en possession de ce password et où on veut simplement rendre l’usage du .pdf plus souple (cas d’un achat en ligne dont le .pdf est verrouillé par un password, password qu’il faut saisir à chaque lecture, ce qui s’avère passablement exaspérant à la longue).

Plusieurs solutions existent mais la plus simple est de passer par qpdf.

Installer qpdf :

sudo apt-get install qpdf

Procéder au retrait du mot de passe :

qpdf --password=xxxxxxx --decrypt fichier_avec_password.pdf fichier_destination.pdf

D’autres solutions existent (conversion .pdf > .ps puis retour en .ps avec xpdf-utils, manipulations avec pdftk, etc.), mais la version en ligne de commande avec qpdf est vraiment la plus simple.

dimanche, décembre 19 2010

La semi-déception du jour : plug computer Ionics Stratus

Après le fiasco des Guruplug trop bruyants - que je m’étais fait remboursés sans problème par NewIT, très corrects dans l’histoire et sans doute très embêtés par les problèmes de retards et de bruits de ces serveurs - j’étais parti sur un autre modèle : un Stratus Plug Computer (sur base de Sheevaplug), produit par une société américaine, Ionics Plug.

Reçus il y a peu, et à nouveau une grosse déception : alors que j’ai bien commandé un modèle compatible avec les prises françaises, c’est un modèle US qui m’a été expédié !

Le pire c’est que :

  • j’ai contacté le service des ventes avant commande, on m’a bien répondu que oui, il était possible d’avoir ces plugs au format européen, mais qu’il y aurait un délai supplémentaire ;
  • je le précise bien lors de ma commande : il me faut deux plugs avec prises françaises ;
  • on me répond immédiatement après ma commande “attention, nous n’avons que des versions avec prises US en stock, que doit-on faire de votre commande ?”, ce à quoi je maintiens ma commande de plugs avec prise françaises, en forwardant le mail initial ;

Et bien malgré tout çà, j’ai quand même reçu (deux mois après ma commande) des plugs avec prises US.

Et le support d’Ionics, recontacté, ne me propose que soit un remboursement, soit … d’aller à la quincaillerie du coin m’acheter des adaptateurs US > FR. Ben voyons.

Comme c’est mon deuxième fiasco sur ce sujet, et que çà commence à me faire cher en frais d’expéditions UK > France, France > UK, US > France, je n’ai pas trop d’autres choix que d’en rester là, mais du coup, avec un adaptateur US > France, impossible de faire tenir le plug au mur comme prévu (avec l’adaptateur, il faut forcément le laisser à plat sur une multiprise au sol (sans quoi, à la verticale, étant relativement lourd, il ne tient pas en place, à cause du poids et du décalage lié à l’adaptateur).

Quant au plug lui-même - qui fonctionne heureusement en 110-220V / 50-60Hz - il fonctionne tout de même bien. Il chauffe, mais il ne fait pas de bruit, c’est déjà çà. Plus d’informations sans doute dans un billet ultérieur

Au passage, les CD-Rom fournis (contenant le kit de développement) sont totalement illisibles (testés sur 3 lecteurs différents). Dommage aussi. Recontacté à ce sujet, le support ne m’a pas donné de réponse sur ce sujet.

Enfin, le packaging sur la boîte n’indique même pas quelles sont les options des plugs à l’intérieur, alors que j’en ai commandé un standard (pas pour moi) et un avec option Zigbee, difficile - sans pouvoir les démarrer pour le problème de prises - du coup de savoir quel boîtier est à qui.

Bref, de mon point de vue, un service commercial pas très efficace de la part d’Ionics.

Donc pour résumer :

  • les Guruplugs sont trop bruyants pour une utilisation normale, mais NewIT, l’importateur UK, a un très bon service ;
  • les Ionics Plugs ne sont pas bruyants du tout (mais chauffent un peu quand même), mais les services logistique et commercial d’Ionics n’est vraiment pas bon : incapables d’envoyer ce qui a été commandé, et incapables de corriger comme il le faudrait leur erreur (au passage, ils auraient suffi qu’ils me réexpédient la pièce - (dé)clipsable, voir photos ci-dessous - qui correspond à la prise elle-même … mais non). Bref, je déconseille finalement de commander auprès de cette société.

Quelques photos du plug en open-the-box pour finir :

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

Ionics Stratus plug computer

dimanche, décembre 5 2010

Accéder à un repository GIT / subversion derrière un proxy authentifié.

Proxy

GIT

Pour accéder à un repository GIT en étant derrière un proxy d’entreprise (avec authentification).

Installer socat.

sudo apt-get install socat

Créer le script git-proxy.sh (dans un répertoire accessible via le PATH courant, ex. /usr/bin) :

#!/bin/bash
HTTP_PROXY_HOSTNAME="url_du_proxy_d_entreprise"
HTTP_PROXY_PORT="port_du_proxy"
HTTP_PROXY_USERNAME="username"
HTTP_PROXY_PASSWORD="password"
socat STDIO PROXY:${HTTP_PROXY_HOSTNAME}:$1:$2,proxyport=${HTTP_PROXY_PORT},proxyauth=${HTTP_PROXY_USERNAME}:${HTTP_PROXY_PASSWORD}

Remarque : il suffit de retirer la partie “,proxyauth” si le proxy ne demande pas d’authentification.

En ligne de commande il suffit ensuite de positionner l’accès au proxy pour GIT :

export GIT_PROXY_COMMAND=git-proxy.sh

Puis de lancer normalement une commande git, par ex. :

git clone git://git.gnome.org/conduit

Subversion

La manipulation est nettement plus simple pour subversion.

Il suffit d’éditer le fichier ~/.subversion/servers, de localiser la paramétrie “[global]” et de décommenter / renseigner ou ajouter les lignes suivantes :

\[global\]
http-proxy-host = url_du_proxy_d_entreprise
http-proxy-port = port_du_proxy
http-proxy-username = username
http-proxy-password = password

dimanche, octobre 17 2010

Retour sur migration d'une partition en ext3 vers ext4 sur une baie RAID5

RAIDSuite au passage sans trop de problèmes en Ubuntu 10.10 ce week-end pluvieux, j’ai franchi le pas aussi pour le format de la partition de ma partition RAID5 qui était jusqu’ici en ext3, que j’ai migrée en ext4.

Ce format de partition me semble aujourd’hui suffisamment stable, je l’utilise depuis Ubuntu 10.04 sur ma partition système sans soucis. Qui plus est, sur cette partition RAID5 en ext3, je rencontrais des problèmes de temps de réponses, notamment des créations de répertoires assez longues, temps que j’espère meilleurs en ext4.

La manipulation pour faire la conversion sans tout reformater est décrite partout sur le web, comme par exemple ici : Convert file system from ext3 to ext4.

Dans mon cas, j’ai migré une partition /dev/md0/ constituée de quatre disques Samsung 1.5TO - soit en pratique 3 disques utiles et 1 spare — pour une taille utilisable de 4.1TO, remplie avant la manipulation à 3.3TO.

/dev/md0      ext4    4,1T  3,3T  749G  82% /mnt/internal/1500go-raid

Au final, la conversion est longue, mais s’est bien passée (j’avais tout de même un backup partiel des données au cas où …).

Etape 1. Un premier fsck pour valider que tout va bien sur la partition durée = __120 minutes__

# sudo e2fsck -pf /dev/md0

Résultat :

/dev/md0 : 964328/274718720 fichiers (3.1% non contigus), 902621888/1098851952 blocs

Etape 2. La conversion des inodes par tune2fs durée = __0 minutes__

# sudo tune2fs -O extents,uninit_bg,dir_index /dev/md0

Etape 3. Un deuxième fsck (obligatoire) durée = __116 minutes__

# sudo e2fsck -pf /dev/md0

Etape 4. Changer le type de la partition de ext3 en ext4 dans /etc/fstab

# sudo vi /etc/fstab

Pour avoir :

/dev/md0                                        /mnt/internal/1500go-raid 	ext4	     defaults,relatime		 0  3

Etape 5. Remontage manuel et/ou reboot.

# sudo mount /dev/md0

A noter la présence d’une floppée d’erreurs “normales” lors de l’étape 3 (voir par exemple ce lien qui confirme que c’est le comportement attendu) :

(...)
Le checksum du descripteur de groupe 33533 est invalide. CORRIGÉ.
Le checksum du descripteur de groupe 33534 est invalide. CORRIGÉ.
Passe 1 : vérification des i-noeuds, des blocs et des tailles

Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
/dev/md0 : 964328/274718720 fichiers (3.1% non contigus), 902621888/1098851952 blocs

Bien sûr, le bénéfice de cette migration sera moins important qu’après un reformatage complet : c’est seulement au fur et à mesure que les données seront réécrites sur la partition migrée que les optimisations liées à ext4 auront lieu.

En premier test qui ne veut vraiment pas dire grand chose : j’ai un site web stocké sur cette partition RAID5 et qui a une utilisation assez intensive du filesystem. Pour une recherche précise qui mettait 0.08 secondes en ext3, je suis passé maintenant à 0.02 secondes en ext4 ;)

MAJ : par contre petite déception, dans certains cas (profondeur assez importante dans l’arborescence des répertoires), la création d’un nouveau sous-répertoire tout simple n’est toujours pas instantannée en ext4 chez moi. A première vue çà prendrait un poil moins de temps qu’en ext3, mais plus que sur d’autres partitions (je suppose que c’est le nombre de fichiers / répertoires présents sur cette partition qui est pénalisant, au demeurant la partition RAID5 en question se porte très bien et affiche de bonnes perfs’ en lecture/écriture, donc pas de problèmes matériels). A voir dans la durée au fur et à mesure que les données seront réécrites …

samedi, octobre 2 2010

Convertir un enregistrement iPhone .m4a en .mp3 sous linux

m4aRien de plus simple, pour convertir les fichiers audio par ex. enregistrés sur un iPhone en .mp3.

Il suffit d’avoir lame et faad (Advanced Audio Decoder player). Il est bien sûr possible d’en profiter pour utiliser les différentes fonctions de LAME (changement du bitrate, ajout de métadata avec les options tt pour le titre, tg pour le genre, etc.).

sudo apt-get install faad lame

Et de lancer la conversion comme ceci :

faad -o - “fichier_source.m4a” | lame - “fichier_destination.mp3”

Exemple de sortie :

guruplug.m4a file info:

LC AAC	17.120 secs, 2 ch, 44100 Hz

  ---------------------
 | Config:  2 Ch       |
  ---------------------
 | Ch |    Position    |
  ---------------------
 | 00 | Left front     |
 | 01 | Right front    |
  ---------------------

Decoding guruplug.m4a took:  0.04 sec. 427.99x real-time.
LAME 3.98.3 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding <stdin> to guruplug.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3

En bonus un petit script qui encapsule cette commande pour réaliser ce traitement en batch en lien externe.

Guru Plug Server Plus : bonne petite machine, mais trop bruyante

La déception du jour : le serveur Guru Plus Server Plus (un plug computer).

Guruplug

Sur le papier c’est une excellente petite machine permettant d’avoir un serveur Linux complet dans un boîtier de la taille d’un boîtier CPL, avec les caractéristiques suivantes :

  • processeur Marvell 1.2Ghz ;
  • 512 mo de RAM interne ;
  • 512 mo de flash interne ;
  • 1x port micro-SD ;
  • 2x ports ethernet Gigabit 10/100/1000 ;
  • Wi-Fi ;
  • bluetooth ;
  • 2x ports USB ;
  • 1x port e-SATA ;

Avec une consommation max donnée à 5W seulement. Le serveur est livré prêt à l’emploi avec une distribution Debian déjà installée.

Et tout çà pour 99$, soit 120 euros port compris chez le revendeur UK NewIT. Bref, une machine très complète pour faire un parfait petit serveur avec de nombreux usages potentiels (serveur de fichier, de mail, routage, domotique, etc.).

Pour l’heure, c’est toutefois une grosse déception. J’ai pré-commandé le boîtier en mai 2010, et les premiers envois ont rapidement été interrompus car il s’est avéré que le boîtier chauffait anormalement, notamment au niveau des connecteurs ethernet (au point de s’y brûler au touché).

La société qui produit le plug, Globalscape, a pris quelques mois pour revoir sa copie avec le fabricant chinois, pour ajouter, sur l’unité dont j’ai reçu un modèle ce jour, un petit ventilateur à l’intérieur. Vu la petite taille du boîtier, ils n’ont évidemment pas pu mettre un gros heatsink et un gros ventilateur, le ventilateur équipé ne fait que 20 mm x 20 mm.

Au final il remplit à peu près son rôle de ventilateur (le boîtier reste cependant après 3 heures de fonctionnement chaud au toucher sur les côtés et le dessus), mais le bruit généré par l’engin est franchement conséquent (bien au delà du niveau sonore de n’importe quel PC traditionnel que j’ai déjà pu entendre).

Une petite vidéo pour se rendre compte (je pense qu’en vrai, c’est encore plus perceptible que sur la vidéo, le .mp3 ci-dessous est d’ailleurs plus représentatif). Le plug s’entend ronronner sans problèmes à plusieurs mètres.


fichier mp3 autonome (enregistrement brut sans altérations)

Qui plus est des tests poussés réalisés par des personnes ayant reçue la première version font état de piètres performances de la partie matérielle, voir ce très bon test sur le sujet : GuruPlug Server Plus : don’t waste your money on it!.

Cela dit, pour mon usage, je pense que les performances de la machine seraient tout à fait suffisantes.

Pour moi, le bruit généré rend ce serveur totalement impropre à l’utilisation auquel je le destinais : avoir un mini-serveur silencieux, ne consommant pratiquement rien, sur lequel faire tourner un certain nombre de services de gestion et de services domotiques sous Linux. Vu sa faible taille, je comptais le mettre entre mon entrée et mon salon, pour y brancher dessus un mir:ror de Violet (lecteur RFID). Le bruit conséquent que génère le serveur rend cet usage impossible. J’hésite entre l’ouvrir et le bidouiller (faisable, mais sans garanties de réussir à mettre en place une bonne dissipation thermique sans bruit, pour au final un boîtier qui risque de devoir resté ouvert ou qui risque d’être découpé de partout, donc on sera loin du concept initial d’un simple boîtier intègre sans câbles) ou le retourner pour remboursement et trouver un autre modèle (peut-être l’ancien modèle, le sheevaplug (qui ne semblait pas souffrir de ces défauts de chauffe), ou un Ionics plug).

Quelques photos en open-the-box :

Guruplug - La boîte

Guruplug - les câbles

Guruplug - Découverte du plug

Guruplug - Le plug de près

Guruplug - Le dos du plug

Au déballage, pas de soucis pour s’en servir, bien qu’il n’y ait aucune documentation fournie avec le packaging.

Le serveur boote en moins de 30 secondes et, avec la configuration par défaut, se retrouve en Wi-Fi “Access Point”, ce qui fait qu’il suffit de se connecter dessus en ssh, par exemple depuis un PC portable en WiFi (en prenant le réseau ouvert par le guruplug, quelque chose du genre Plug2-uAP-1713) :

ssh root@192.168.1.1

Le mot de passe root par défaut étant “nosoup4u”.

Et en liens annexes … :

- page 1 de 3