#! /bin/bash # Copyright (C) 2010 Zakhar for ubuntu-fr # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # The text of the GNU General Public License is available at # http://www.gnu.org/licenses/gpl-2.0.html; if you cannot access it, # write to the Free Software Foundation, Inc., 51 Franklin Street, # Fifth Floor, Boston, MA 02110-1301 USA. #=========================================================== # Fonction : # ---------- # - Ce script fonctionne avec tuXtremMerge # - Il vise à remplacer les fonctions qui n'existent pas sur # Busybox 1.16.1 utilisé sur les Synology DS1010+ # - Ce script fonctionne également sur Ubuntu (Lucid)... puisque # c'est ainsi que je le teste !.. Mais il alourdirait inutilement # les traitements puisque certaines commandes existantes sont réécrites # en shell, donc plus lent, sujet à des bugs, etc... # Par conséquent ça a été séparé expressément. # # Usage : # ------- # busyXtremMerge Nom_Du_Fichier_NNN.xtm # (N'importe lequel des fichiers fonctionne : 001 ou autre) # # Tested : Testé sur Synology DS1010+ # ------ # # Version : Syno + version du script tuXtremMerge utilisé # ------- # # Date : 2011-05-25 # ----- # # Author : Zakhar (ubuntu-fr) # ------ # # Contributor : // Ajouter votre nom si vous contribuez et redistribuez // # ----------- # stadros83 @ ubuntu.fr : début des tests Synology 1010+ # - problèmes readlink sur Synology 1010+ (pas d'option -f) # => retrait de readlink et remplacement par une fonction shell # - problème od (commande inexistante) # => Installation par une commande Syno : ipkg install textutils # - problème du -B (option inexistante) # => Supression de "du". En réalité pour homogénéiser, on utilise # stat -c%s partout # - problème stat -c (option inexistante) # => Remplacé par un ls avec découpage du résultat # - problème pas de support du "process substitution" # => le md5sum qui se servait de cela est donc remplacé par un # md5sum "pipé" avec un grep # - problème pas de ibs/obs sur la commande dd # => Nouveaux algorithmes avec uniquement des bs dans le programme # commun... et en plus c'est (un peu) plus rapide ! # # History : # --------- # 1.0.1 # - au lieu de passer par une variable, on utilise "command" pour invoquer # le md5sum qui a été "masqué" par la fonction du même nom. # 1.0.0 # - Nouveaux algorithmes (main script) pour les dd sans ibs/obs # - Contournement pour l'inexistence du "process substitution" # - Remplacement du stat -c%s par une fonction (ls + tr + cut) # - Suppression du (homogénéisation) # 0.9.0 # - readlink ne se comporte pas pareil sur Synology 1010+ # - Retrait de readlink, remplacé par la fonction shell readlnk #========================================================== # Messages and Error codes. #+ This way it is easyier, if somebody would like to localise readonly MSG_BUSY_VERSION="busyXtremMerge (turbo XTM), contournements pour Busybox, version 1.0.1" #========================================================== # Fonctions de remplacement des commandes déficientes ! # Remplace readlink qui n'a pas le même comportement partout # Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -f n'existe pas # Retourne l'emplacement absolu du fichier en le déréférençant éventuellement # Readlink est toujours utilisé dans le script principal sous cette forme : # readlink -f Nom_Fichier # On ne tient donc compte que tu deuxième argument readlink() { if [ -h "$2" ]; then # C'est un lien symbolique ! temp=$( ls -l "$2" ) target=${temp#* -> } if [ -h "$target" ]; then # Recursif... pushd $(dirname "$target") >/dev/null target=$(readlnk "$target") popd >/dev/null fi else target="$2" fi # Ici la variable "target" vaut soit $2 soit le déréférencement temp=$(cd $(dirname "$target"); pwd) if [ "$temp" != '/' ]; then # On rajoute / au dirname, sauf pour root temp="${temp}/" fi echo -n "${temp}${target##*/}" } # Remplace stat qui n'a pas le même comportement sur les anciens Busybox # Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -c n'existe pas # C'est moche, mais on remplace donc par un ls + cut # On utilise le 2ème paramètre car c'est toujours utilisé stat -c%s fichier stat() { ls -l "$2" | tr -s [:blank:] | cut -d' ' -f 5 } # md5sum fonctionne correctement... mais pas le "process substitution" # Or on l'utilise dans la version standard pour éviter d'avoir utiliser # des fichiers temporaires. Ici, on remplace ça par un md5sum # "classique" suivi d'un grep sur la signature à trouver. md5sum() { command md5sum | grep -iq "$( echo $this_file_MD5 )" } # Test pour voir si ça va plus vite ainsi pour le dernier fichier #dd() #{ # if [ ${2:3} -le 4096 ]; then # command dd "$@" # else # blocks=$(( ${2:3} / 4096 )) # last=$(( ${2:3} % 4096 )) # command dd "${1}" bs=4096 count=${blocks} &&\ # command dd "${1}" bs=1 count=${last} skip=$(( ${2:3} - ${last} )) # fi #} # Contournement du od qui ne travaille pas sur 64bits et donc problème # pour les fichiers de plus de 4G od() { if [ ${2} = '-vtu8' ]; then low=$( command od -An -vtu4 -j96 -N4 "$FIRST_SOURCE_FILE_NAME" ) high=$( command od -An -vtu4 -j100 -N4 "$FIRST_SOURCE_FILE_NAME" ) echo $(( high * 4294967296 + low )) else command od "$@" fi } #========================================================== # Et on source le script standard # S'il n'est pas mis dans le même chemin, il faut donc changer la commande THIS_SCRIPT_DIR=$( dirname $0 ) . "${THIS_SCRIPT_DIR}/tuXtremMerge"