Connecter automatiquement le disque dur de sa Freebox Revolution via SAMBA sous Linux

Séries - Monter les disques durs de Freebox
Avertissement
Dernière modification de cet article le 2011-09-27, le contenu pourrait être dépassé/obsolète.

Préambule : Les box fournis par le FAI Free sont, depuis la version 5 (dite “HD”), équipés de disque dur, afin d’y copier ses images/films/musiques (depuis un autre ordinateur ou smartphone) et les regarder sur sa TV. Si avec la version 5, le disque dur était dans le boitier HD (celui branché à la télévision), avec la version 6, la révolution (sic) est que le disque dur a une vocation plus large qu’uniquement stocker des fichiers destinés à être consommés sur la TV. En effet il a pour but de transformer la Freebox en vrai mini-NAS domestique, il a donc été grossi (250Go au lieu de 40Go) et placé dans le boitier Server (celui où arrive la paire de cuivre ADSL ou la fibre optique). Le second boitier (la Freebox Player), relié à la TV, peut quand même se servir du disque, via le réseau, comme n’importe quel autre machine de votre réseau local (portable, netbook, tablette tactile, PDA, etc.).

J’avais déjà partagé mon script pour connecter automatiquement le disque dur de la Freebox via FTP. Bien qu’il fonctionne autant avec la Freebox HD qu’avec la Freebox Server, cette dernière supporte le protocole SMB/CIFS< qui est autrement plus adapté aux transferts de fichiers sur réseau local que le FTP. Je trouvais donc anormal de ne pas proposer une seconde version de mon précédent script pour la Freebox Revolution.

Le fonctionnement est identique : tester si la Freebox Server est allumée, puis “monter” le HDD directement dans le FS de son ordinateur GNU/Linux et le démonter dès qu’elle est éteinte. Sauf que celui-ci il utilise SaMBa au lieu du FTP.

Sous Linux, on utilise cifs-utils pour pouvoir monter des partages SMB :

1
mount -t cifs "//fqdn_ou_IP_serveur_FTP/dossier" "/dossier/où/monter/le/dossier/SMB"

Concernant la partie utile, l’automatisation, smbclient permet de tester convenablement la disponibilité du serveur et du partage :

1
smbclient \\fqdn_ou_IP_serveur_FTPdossier --no-pass

Et, contrairement à mon précédent code, j’ai (enfin) utilisé mountpoint en gérant le cas où le serveur est coupé et donc ne réponds pas.

On applique ces commandes dans le principe suivant :

  1. La disponibilité du serveur SMB de la Freebox est testé : via smbclient

  2. Si le serveur est prêt, le point de montage est vérifié via mountpoint, afin de ne pas remonter le dossier s’il l’est déjà.

  3. Si le point de montage n’est pas déjà utilisé, le DD de la Freebox Server est monté via :

    1
    
    mount -t cifs "//mafreebox.freebox.fr/Disque Dur" "/mnt/FreeboxServer"`.
    
  4. Si le serveur n’est pas prêt (eg. Freebox débranchée), alors le dossier “/mnt/FreeboxServer” est démonté via umount.

Dans mon installation, ce script est appelé par cron toutes les 3 minutes (choix personnel : rien n’empêche d’appeler le script toutes les minutes si on veut).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash

# Monte/démonte le serveur SMB/CIFS de la Freebox Server dans un dossier ($MOUNT_PATH)
# @author DUVERGIER Claude
# @date 2011-09-27
#
# Pré-requis :
# - Outil "netcat"
# - Package "cifs-utils"
# - Package "smbclient"
#
# Références :
# - Monter automatiquement et accéder au disque dur de sa Freebox HD/Server via FTP sous Linux : http://blog.claude.duvergier.fr/2011/06/monter-hdd-freebox-via-ftp-linux/
# - Monter le disque dur du Freebox Server (v6) en ligne de commande : http://voidandany.free.fr/index.php/monter-le-disque-dur-du-freebox-server-v6-en-ligne-de-commande/
# - smbmnt(8) - Linux man page : http://linux.die.net/man/8/smbmnt
# - Bash-Check If FS is Already Mounted On Directory : http://www.linuxquestions.org/questions/programming-9/bash-check-if-fs-is-already-mounted-on-directory-137282/
# - Capturing program return codes in a bash script? : http://www.technologyquestions.com/technology/linux/218765-capturing-program-return-codes-bash-script.html
# - Samba - ArchWiki : https://wiki.archlinux.org/index.php/Samba#Error:_Value_too_large_for_defined_data_type
# - how do I pipe STDERR? : http://eglug.org/pipe_stderr

##########################################
## Configuration
##########################################

# SMB host to connect to
SMB_HOST="mafreebox.freebox.fr"

# Network port where SMB/CIFS is running on $SMB_HOST (should be 445)
SMB_PORT=445

# SMB share to mount
SMB_SHARE="Disque Dur"

# User to connect with (leave empty for guest connection)
SMB_LOGIN=""

# Password of SMB_LOGIN (ignored if SMB_LOGIN is empty)
SMB_PWD=""

# UID that will own all files/directories on the mounted share (format: username or a numeric uid)
SMB_UID=1000

# GID that will own all files/directories on the mounted share (format: groupname or a numeric gid)
SMB_GID=1000

# Local path to mount SMB share into
MOUNT_PATH="/mnt/FreeboxServer/"
##########################################


##########################################
## Actual process
##########################################

if (smbclient \\$SMB_HOST\$SMB_SHARE --port $SMB_PORT --no-pass -g -c exit); then # Serveur disponible
	#BUG: mountpoint: xxx: Value too large for defined data type
	#BUGFIX: Utiliser les options ",nounix,noserverino" dans le "mount" (https://wiki.archlinux.org/index.php/Samba#Error:_Value_too_large_for_defined_data_type)
	mountpoint -q "$MOUNT_PATH"
	if [ $? -ne 0 ]; then # Si mountpoint n'a pas retourné 0, c'est donc que "$MOUNT_PATH" n'est pas un point de montage
		if [ -z "$SMB_LOGIN" ]; then # Si login vide
			AUTH_OPTIONS="guest" # Authentification en "invité" (le script ne demandera pas de mot de passe)
		else
			AUTH_OPTIONS="user=$SMB_LOGIN,password=$SMB_PWD" # Authentification avec les identifiants fournis
		fi
		
		echo "Mounting \\$SMB_HOST\$SMB_SHARE into $MOUNT_PATH..."
		mount -t cifs "//$SMB_HOST/$SMB_SHARE/" "$MOUNT_PATH" -o $AUTH_OPTIONS,uid=$SMB_UID,gid=$SMB_GID,rw,nounix,noserverino; # On monte
	else
		echo "\\$SMB_HOST\$SMB_SHARE already mounted into $MOUNT_PATH"
	fi
else # Serveur non disponible
	#BUG: Si dossier monté mais serveur SMB indisponible, mountpoint se plaint que l'hôte est inacessible/down ("mountpoint: $MOUNT_PATH: Host is down")
	#BUGFIX: Tester mountpoint pour un retour de "is a mountpoint" et de "Host is down"
	if (mountpoint "$MOUNT_PATH" | grep "$MOUNT_PATH is a mountpoint" || mountpoint "$MOUNT_PATH" 2>&1 | grep "mountpoint: $MOUNT_PATH: Host is down"); then # Si mountpoint a retourné 0, c'est donc que "$MOUNT_PATH" est un point de montage
		echo "Unmounting \\$SMB_HOST\$SMB_SHARE from $MOUNT_PATH..."
		umount "$MOUNT_PATH"; # On démonte
	else
		# Gère les autres plaintes possibles de mountpoint: "... No such file or directory" et "... is not a mountpoint")
		echo "\\$SMB_HOST\$SMB_SHARE not mounted: no need to unmount"
	fi
fi
##########################################

Bien entendu, ce script est configurable et peut être utilisé avec n’importe quel serveur SMB qu’il s’agisse d’une machine sous Windows, GNU/Linux ou un Network Attached Storage (Synolog, QNAP, etc.)