Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez vous et reconnectez vous depuis ce lien en cochant le case
Me connecter automatiquement lors de mes prochaines visites.

nombre réponses : 25

#0 Re : -1 »  Récupération du fichier le plus récent sur un SFTP en bash » Le 03/04/2016, à 20:40

Totor
Réponses : 4

Suivant la fréquence de tes sauvegarde, tu peux utiliser l'option --newer-than de mirror.
Pour exemple, si tes sauvegardes sont quotidiennes, ceci devrait le faire :

rm glpi_database_*.sql
lftp -d -u glpi,[pass] 192.168.1.37 -c 'mirror --include-glob=glpi_database_*.sql --newer-than=1days'

Note : j'ai ajouté un rm avant la commande pour être sur de downloader le fichier.
Si il est déjà présent, mirror ne le récupère pas, même si il est corrompu localement.

#1 Re : -1 »  Suppression lignes vides impossible [RÉSOLU] » Le 27/02/2016, à 11:23

Totor
Réponses : 14
pingouinux a écrit :

Bonsoir,
Je confirme ce que dit nany en #4 : tes commandes en #1 éliminent bien les lignes vides dans ton fichier exemple.
N'y aurait-il pas des caractères cachés ? Quel est le retour de

hd ton_fichier_test

ou ceci :

cat -e ton_fichier_test

le résultat est plus compréhensible (enfin, je trouve).

#3 Re : -1 »  [Résolu] Accès NAS par telnet impossible » Le 05/02/2016, à 21:10

Totor
Réponses : 8

huum, je me posais la même question.
Et d'après ce manuel, il y a une GUI d'admin.
Clique ici pour essayer.

Sinon, regarde au moins les ports ouverts :

# si besoin, faire un sudo apt-get install nmap liblinear-tools liblinear1
nmap -T5 192.168.0.20

#4 Re : -1 »  [BASH] Comment faire un timer ? » Le 27/01/2016, à 20:09

Totor
Réponses : 6
serged a écrit :

[...]
Si tu veux tester un truc pendant 30s :

#!/bin/bash
[...]

La vache, comme ça, tu va bouffer tout le CPU ... enfin... tout dépend de ce qu'il entend par "user ne fait rien pendant 10s"....
Comme le dit Watael, tout dépend du contexte, etc...

#5 Re : -1 »  [BASH] Comment faire un timer ? » Le 27/01/2016, à 23:32

Totor
Réponses : 6

Si tu veux un "Timer" autonome en bash, alors soit le script "Timer.sh" suivant :

#!/bin/bash 

_SHELL_PID=
_SHELL_SIG=SIGUSR1
_SHELL_TIMESTAMP=60

function startTimer {
	while sleep ${_SHELL_TIMESTAMP}s
	do
		# on envoie le signal uniquement si le process existe toujours
		ps -p ${_SHELL_PID} &>/dev/null || return 0
		
		builtin kill -${_SHELL_SIG} ${_SHELL_PID}		
	done
}

# vérification des paramétres
while getopts :s:p:t: option 
do
	case "${option}" in
		p) _SHELL_PID=${OPTARG};;
		s) _SHELL_SIG=${OPTARG};;		
		t) _SHELL_TIMESTAMP=${OPTARG};;
		:) echo "Argument manquant pour l'option '${OPTARG}'" >&2
			exit 1;;
		"?") echo "Option non valide : ${OPTARG}." >&2
			exit 1;;
	esac
done

# vérifications liées au PID
# par défaut, le PID est le PID du parent
[[ ${_SHELL_PID} ]] || _SHELL_PID=${PPID}

# vérification du format & de l'existence du process
[[ ${_SHELL_PID//[0-9]} ]] && {
	# erreur dans le format attendu
	echo "Numéro de PID '${_SHELL_PID}' erroné !" >&2
	exit 1
}

# le PID existe-t-il ?
ps -p ${_SHELL_PID} &>/dev/null || {
	echo "Aucun processus pour le PID '${_SHELL_PID}'" >&2
	exit 1
}	

# Vérification du signal à passer
[[ ${_SHELL_SIG} ]] || _SHELL_SIG=SIGUSR1

# précautions d'usage
_SHELL_SIG="${_SHELL_SIG^^}"
_SHELL_SIG="SIG${_SHELL_SIG#SIG}"

_SIG_LISTE="$(builtin kill -l)"
# on vérifie si c'est un signale valide
[[ "${_SIG_LISTE}" == *${_SHELL_SIG}\)* || "${_SIG_LISTE}" == *\)\ ${_SHELL_SIG}[[:space:]]* ]] || {
	echo "Signal '${_SHELL_SIG}' non valide !" >&2
	exit 1
}

# vérification du délai
# par défaut, le timestamp est de 60sec
[[ ${_SHELL_TIMESTAMP} ]] || _SHELL_TIMESTAMP=60
[[ ${_SHELL_TIMESTAMP//[0-9]} ]] && {
	# erreur dans le format attendu
	echo "Délai '${_SHELL_TIMESTAMP}' non valide !" >&2
	exit 1
}
startTimer

et un script de test :

#!/bin/bash

trap test SIGUSR1
cpt=0

function test {
 echo "signal"
 ((cpt++))
}

coproc TIMER { ./Timer.sh -t 2 -p $$ ; }

_PID=${TIMER_PID}
echo ${_PID}
while ((cpt <= 2))
do
	ps -f -p $_PID --no-headers
	sleep 1	
done

Si tu exécutes ce dernier script, tu verras apparaitre dans cet ordre :

  • Le n° du processus du Timer sur la 1ère ligne

  • Puis 3 fois de suite 2 lignes contenant les infos sur ce même processus suivi du texte "signal"

Il est possible d'arrêter le Timer en envoyant le signal "SIGKILL" au processus "${TIMER_PID}".
Si tu changes le nom de ton coproc (tu peux utiliser ainsi plusieurs Timer), alors le nom de la variable contenant son PID changera également.
Pour plus d'info sur les coproc :

man bash | less +'/coproc \['

#6 Re : -1 »  [RESOLU] Manipulation de chaine de caractere » Le 23/01/2016, à 17:14

Totor
Réponses : 3

tongue

zsh -c 'variable="12345"; echo "${${(s..)variable}// //}"'
1/2/3/4/5

ou encore :

zsh -c 'variable="12345"; echo "${(j:/:)${(s..)variable}}"'

#7 Re : -1 »  [Ubuntu 14.04] Le terminal se ferme tout seul » Le 10/01/2016, à 21:00

Totor
Réponses : 3

déplace le fichier ~/.bash_aliases comme ceci :
Combinaison des touches ALT+F2, puis tapes mv /home/tonlogin/.bash_aliases /tmp (remplace tonlogin par la bonne valeur)
Ensuite, essaie d'ouvrir une console.

#8 Re : -1 »  [RESOLU]Probleme avec la commande jobs » Le 04/01/2016, à 22:30

Totor
Réponses : 5
alius a écrit :

Si tu veux lancer top en background bien que j'avouerai ne pas comprendre l'utilité d'une telle manipulation il y a un moyen simple de le faire en utilisant la commande screen et d'y lancer la le programme top puis enfin de détacher screen de terminal avec Ctrl+b puis d. Cela aura pour effet de laisser en background la session screen avec top.

Pas besoin de tant d'artifice pour avoir top en arrière plan sans qu'il soit arrêté...
Il suffit de lancer top en mode batch :

top -b &

Mais lancé comme tel, cela pollue l'affichage du terminal. Il est donc préférable de rediriger la sortie de top vers un fichier/device...

Pour détacher le processus mis en background du terminal, il faut utiliser la builtin bash disown

top -b >/tmp/top.log &
disown -h %+

Le seul inconvénient, c'est que l'on ne peut pas récupérer la tâche en foreground comme avec screen.

#9 Re : -1 »  [RESOLU]Ou est la commande jobs ? » Le 03/01/2016, à 17:59

Totor
Réponses : 3
man bash|less +'/jobs \['

#10 Re : -1 »  [RESOLU]Ou est la commande jobs ? » Le 03/01/2016, à 21:00

Totor
Réponses : 3

jobs est une builtin bash. Son utilisation est donc définie dans le man bash.

#11 Re : -1 »  [RÉSOLU] Ajouter un texte en début et fin de chaque ligne » Le 24/12/2015, à 01:05

Totor
Réponses : 46

Ma contribution (tardive - je précise que je n'ai pas parcouru la totalité du post) :

#!/bin/bash
shopt -s nocaseglob
pattern="www|fr"
while read
do
	[[ "${REPLY}" == http* ]] && {
		IFS='[/.]' read -a words <<<${REPLY}
		site=${words[2]}
		[[ "${site}" =~ ${pattern} ]] && site=${words[3]}
		printf '[url=%s]%s[/url]\n' "${REPLY}" "${site^}"
	}
done < site.lst

à toi de faire évoluer la liste des mots que tu ne souhaites pas comme "nom de site"

Une variante en zsh :

#!/bin/zsh
setopt EXTENDED_GLOB
pattern=( http https www fr )
while read
do
	[[ "${(L)REPLY}" == http* ]] && {
		IFS='[/.:]' read -A  <<<"${REPLY}"
		set -A site ${${(L)reply[@]}:|pattern}
		printf '[url=%s]%s[/url]\n' "${REPLY}" "${(C)site[1]}"
	}
done < site.lst

#12 Re : -1 »  remplacer ls » Le 07/12/2014, à 19:51

Totor
Réponses : 21
compgen -G "$(printf "\x2A")"

#13 Re : -1 »  RESOLU Problèmes avec les conditions!!!! » Le 09/06/2014, à 15:03

Totor
Réponses : 9
tiramiseb a écrit :

2/ on ne peut pas affecter une valeur aux variables d'arguments ($1, $2, etc)

Ce n'est pas tout à fait vrai.
Il est possible d'affecter des valeurs aux paramètres de position mais on ne peut pas le faire individuellement.

Ceci permet de remplacer les paramètres de position 1, 2 et 3 et de réinitialiser tous les autres :

set -- val1 val2 val3

#14 Re : -1 »  awk comment faire plus court » Le 06/06/2014, à 13:55

Totor
Réponses : 5

sans awk, ni cut... full bash

IFS="/" read -a fu <<< "/home/syst/Ubuntu One/course"
echo "${fu[3]}"

#15 Re : -1 »  barre de progression sur notification en root [finalisé] » Le 01/03/2014, à 17:36

Totor
Réponses : 22
gaara92 a écrit :

D'accord, et si quelqu'un trouve une amélioration (notify + barre de progression par exemple), je suis preneur !

je pense que ceci peut répondre à ta demande ...

#16 -1 »  [Freebox Revolution] AirMedia en bash » Le 15/07/2013, à 21:11

Totor
Réponses : 5

Bonjour,

Avec l'arrivé de la mise à jour "Freebox OS", et surtout de son API... J'ai tenté d'écrire un petit script pour envoyer des fichiers multimédia via AirPlay sur la freebox. Chose que l'ont pouvait difficilement faire sous linux hmm

Bref, en fait, il y a 2 scripts.
Le 1er, sert à obtenir un token pour le script qui va faire du AirMedia (à utiliser qu'une seule fois), le 2nd est l'application en elle-même.

1er script:

#!/bin/bash

myHelp()
{
	[ $# -ne 0 ] && echo >&2 -e  "$@"
	myName=${FUNCNAME[$((${#FUNCNAME[@]}-1))]}
	cat >&2 <<EOF
	Usage : 
		${myName} -i app_id -n app_name -v app_version -d device_version
		${myName} -h

	Options:
	-i : ID de l'application
	-n : Nom de l'application
	-v : Version de l'application
	-d : Nom du device autorisé
	-h : Affiche cette aide
EOF
	[ $# -ne 0 ] && return 1
	return 0
}

while getopts :i:n:v:d:h option
do
	case "${option}" in
		h) myHelp
			exit 0;;
		:) myHelp "Argument manquant pour l'option '-${OPTARG}'"
			exit 1;;
		"?") myHelp "Option non valide : ${OPTARG}."
			exit 1;;
		i) app_id="${OPTARG}";;
		n) app_name="${OPTARG}";;	
		v) app_version="${OPTARG}";;	
		d) device_name="${OPTARG}";;	
	esac
done

[[ ${app_id} ]] || { myHelp "ID de l'application manquant !"; exit 1; }
[[ ${app_name} ]] || { myHelp "Nom de l'application manquant !"; exit 1; }
[[ ${app_version} ]] || { myHelp "Version de l'application manquante !"; exit 1; }
[[ ${device_name} ]] || { myHelp "Nom du device manquant !"; exit 1; }

chars=( '|' '/' '-' '\')

# demande d'autorisation de l\'application avec récupération du token :
IFS=$'"' read -a values < <(curl -v http://mafreebox.free.fr/api/v1/login/authorize/ -d '{"app_id":"'${app_id}'", "app_name":"'${app_name}'", "app_version":"'${app_version}'" , "device_name":"'${device_name}'"}' 2>/dev/null)

[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la demande d\'autorisation !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}

app_token="${values[7]//\\}"
app_token="${app_token//$'\r'}"
app_track="${values[10]//[:\}]}"
app_track="${app_track//$'\r'}"

printf "En attente d'authorisation - à valider sur l'écran du freebox Server :  "
i=0
while reponse=$(curl http://mafreebox.free.fr/api/v1/login/authorize/${app_track} 2>/dev/null) && [[ ${reponse} == *pending* ]]
do
	printf "\b%s" "${chars[i]}"
	sleep 1
	((i++)) && (( i == ${#chars[@]} )) && i=0
done
printf "\b\n"


case ${reponse} in	
	*timeout*)
		echo "Réponse trop tardive (time out) !" >&2; exit 2;;
	*granted*)
		printf "APP_ID=%s\nAPP_TOKEN=%s\nTRACK_ID=%s\n" "${app_id}" "${app_token}" "${app_track}";;
	*denied*)
		echo "Autorisation refusée !" >&2; exit 2;;
	*unknown*)
		echo "Erreur de token !" >&2; exit 2;;
esac
exit

ex : script -i fr.freebox.monAppli -n "Appli AirMedia" -v "1.0.0" -d $(hostname)

2nd Script :

#!/bin/bash

myHelp()
{
	[ $# -ne 0 ] && echo >&2 -e  "$@"
	myName=${FUNCNAME[$((${#FUNCNAME[@]}-1))]}
	cat >&2 <<EOF
	Usage : 
		${myName} -i app_id -t app_token -f fichier
		${myName} -h

	Options:
	-i : ID de l'application
	-t : Token d'authentification
	-f : Fichier audio/vidéo à jouer
	-h : Affiche cette aide
EOF
	[ $# -ne 0 ] && return 1
	return 0
}

while getopts :i:t:f:h option
do
	case "${option}" in
		h) myHelp
			exit 0;;
		:) myHelp "Argument manquant pour l'option '-${OPTARG}'"
			exit 1;;
		"?") myHelp "Option non valide : ${OPTARG}."
			exit 1;;
		i) app_id="${OPTARG}";;
		t) app_token="${OPTARG}";;	
		f) fichier="${OPTARG}";;
	esac
done

[[ ${app_id} ]] || { myHelp "ID de l'application manquant !"; exit 1; }
[[ ${app_token} ]] || { myHelp "Token de l'application manquant !"; exit 1; }
[[ ${fichier} ]] || { myHelp "Nom de fichier audio/vidéo manquant !"; exit 1; }

# demande du challenge :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/ 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la demande de challenge !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
CHALLENGE="${values[9]//\\}"

# construction du passord
read foo PASSWORD < <(printf "${CHALLENGE}" |openssl dgst -sha1 -hmac ${app_token})

# ouverture de la session
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/session/ -d '{"app_id":"'${app_id}'", "password":"'${PASSWORD}'"}' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la demande de session !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
SESSION_TOKEN="${values[5]}"

# encodage du nom du fichier
FILE_PATH_ENCODED=$(base64 <(printf "%s" "${fichier}"))

# vérification de la connaissance du fichier
values=$(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v1/fs/ls/${FILE_PATH_ENCODED} 2>/dev/null)
[[ "${values}" == *success\ :false* ]] && {	
	cat >&2 <<EOF
Fichier inconnu du freebox Server !
Retour de la demande : ${values}
EOF
	exit 2
}

# création d'un partage pour obtention URL
IFS='"' read -a values < <(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v1/share_link/ -d '{ "path":"'${FILE_PATH_ENCODED}'","expire":"0","fullurl":""}' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la création du partage !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
FILE_TOKEN="${values[11]//\\}"
FILE_URL="${values[21]}"

values=$(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v1/airmedia/receivers/Freebox%20Player/ -d '{ "action": "start",   "media_type": "video", "media": "'${FILE_URL}'", "password": "" }' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la lecture du fichier ${fichier} !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}

echo "Envoi de ${fichier} réussi !"
echo "Pour suppression partage : curl -X DELETE -H \"X-Fbx-App-Auth: ${SESSION_TOKEN}\" http://mafreebox.free.fr/api/v1/share_link/${FILE_TOKEN}"

exit

ex : script -i fr.freebox.monAppli -t "<valeur retournée par le 1er script>" -f <fichier reconnu par le freebox server>

Pré-requis :
- curl
- base64

Note : L'API attend une URL "HTTP" comme nom de fichier, c'est pourquoi :
- il faut autoriser l'accès HTTP extérieur au freebox serveur
- ce script créé un partage pour chaque fichier envoyé. une instruction pour supprimer ce partage est retournée mais cette dernière n'est valable que le temps de la session d'authentification. Le partage peut également être supprimé via l'interface d'administration du freebox serveur (Gestion des partages dans le gestionnaire de fichiers)

Le fichier doit être connu du freebox serveur (donc fichier sur le disque dur ou sur un média USB branché et activé)
Ex : /Disque dur/Enregistrements/UneChanson.mp3

A améliorer :
L'API freebox OS ne permet pas à ce jour de vérifier si un média est toujours en court de lecture ou pas... Si un jour cela est réalisable, la suppression du partage sera géré intrinsèquement.

#17 Re : -1 »  [Freebox Revolution] AirMedia en bash » Le 31/08/2013, à 15:14

Totor
Réponses : 5

Pour l'audio, ça "marchotte" chez moi ...
La lecture est cyclique : la piste commence a être lue puis redémarre au début pour une lecture un peu plus longue et ce indéfiniment.
Je pense que cela vient de l'API qui n'est pas encore au point.
En effet, elle ne semble pas prendre en compte l'audio car la doc ne mentionne que des médias de type photo et vidéo.

Sinon, j'avais fait évolué le script depuis, pour prendre en compte la version de l'API et pour ajouter un nouveau paramètre afin de choisir le player sur lequel on souhaite envoyer le média (à défaut, il s'agit du Freebox player) :

#!/bin/bash
# url api : http://dev.freebox.fr/sdk/os/airmedia/
v_api="1"

myHelp()
{
	[ $# -ne 0 ] && echo >&2 -e  "$@"
	myName=${FUNCNAME[$((${#FUNCNAME[@]}-1))]}
	cat >&2 <<EOF
	Usage : 
		${myName} -i app_id -t app_token -f fichier [ -p player ]
		${myName} -h

	Options:
	-i : ID de l'application
	-t : Token d'authentification
	-f : Fichier audio/vidéo à jouer
	-p : Player sur lequel doit être envoyé le contenu multimédia
	-h : Affiche cette aide
EOF
	[ $# -ne 0 ] && return 1
	return 0
}

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     cas e "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  echo "${encoded}"
}

player="Freebox Player"
while getopts :i:t:f:p:h option
do
	case "${option}" in
		h) myHelp
			exit 0;;
		:) myHelp "Argument manquant pour l'option '-${OPTARG}'"
			exit 1;;
		"?") myHelp "Option non valide : ${OPTARG}."
			exit 1;;
		i) app_id="${OPTARG}";;
		t) app_token="${OPTARG}";;	
		f) fichier="${OPTARG}";;
		p) player="${OPTARG}";;
	esac
done

player="$(rawurlencode "${player}")"
[[ ${app_id} ]] || { myHelp "ID de l'application manquant !"; exit 1; }
[[ ${app_token} ]] || { myHelp "Token de l'application manquant !"; exit 1; }
[[ ${fichier} ]] || { myHelp "Nom de fichier audio/vidéo manquant !"; exit 1; }

# demande du challenge :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v${v_api}/login/ 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la demande de challenge !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
CHALLENGE="${values[9]//\\}"

# construction du passord
read foo PASSWORD < <(printf "${CHALLENGE}" |openssl dgst -sha1 -hmac ${app_token})

# ouverture de la session
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v${v_api}/login/session/ -d '{"app_id":"'${app_id}'", "password":"'${PASSWORD}'"}' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la demande de session !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
SESSION_TOKEN="${values[5]}"

# encodage du nom du fichier
FILE_PATH_ENCODED=$(base64 <(printf "%s" "${fichier}"))

# vérification de la connaissance du fichier
values=$(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v${v_api}/fs/ls/${FILE_PATH_ENCODED} 2>/dev/null)
[[ "${values}" == *success\ :false* ]] && {	
	cat >&2 <<EOF
Fichier inconnu du freebox Server !
Retour de la demande : ${values}
EOF
	exit 2
}

# création d'un partage pour obtention URL
IFS='"' read -a values < <(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v${v_api}/share_link/ -d '{ "path":"'${FILE_PATH_ENCODED}'","expire":"0","fullurl":""}' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la création du partage !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}
FILE_TOKEN="${values[11]//\\}"
FILE_URL="${values[21]}"

values=$(curl -H "X-Fbx-App-Auth: ${SESSION_TOKEN}" http://mafreebox.free.fr/api/v${v_api}/airmedia/receivers/${player}/ -d '{ "action": "start",   "media_type": "video", "media": "'${FILE_URL}'", "password": "" }' 2>/dev/null)
[[ "${values[@]}" == *success\ :false* ]] && {
	retour=$(printf '%s"' "${values[@]}")
	cat >&2 <<EOF
Erreur lors de la lecture du fichier ${fichier} !
Retour de la demande : ${retour%$'"'}
EOF
	exit 2
}

echo "Envoi de ${fichier} réussi !"
echo "Pour suppression partage : curl -X DELETE -H \"X-Fbx-App-Auth: ${SESSION_TOKEN}\" http://mafreebox.free.fr/api/v${v_api}/share_link/${FILE_TOKEN}"

exit

#18 Re : -1 »  [Freebox Revolution] AirMedia en bash » Le 08/09/2013, à 18:05

Totor
Réponses : 5

Attention, les informations que tu as sont les capacités du player ...
il ne s'agit en aucun cas de ce que l'API est capable d'envoyer !

#19 Re : -1 »  [Utilitaire Freebox] Script pour télécharger sur votre V6 » Le 12/07/2013, à 21:16

Totor
Réponses : 168

Bonsoir,

Je tente de me faire un outil pour tester une fonctionnalité de la freebox.
J'ai donc écris un script qui me permet de me donner l'app_token et un second pour ouvrir une session et tester la fonctionnalité souhaitée.

J'arrive très bien à obtenir le token de l'app mais je n'arrive pas à obtenir de token de session...
Je bute sur l'erreur "error_code":"invalid_token"

Je ne comprends absolument pas ! J'avais également constaté la protéction du "/" dans la réponse de curl (je m'appuie sur cet outil) et j'ai donc supprimé les "\" ..
Donc, pourriez-vous tester mes scripts et me faire un retour sur vos résultats à l'obtention du token de session ?

Script pour obtenir l'app_token  :

#!/bin/bash

app_id="$1"
app_name="$2"
app_version="$3"
device_name="$4"

# demande d'autorisation de l'application avec récupération du token :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/authorize/ -d '{"app_id":"'${app_id}'", "app_name":"'${app_name}'", "app_version":"'${app_version}'" , "device_name":"'${device_name}'"}' 2>/dev/null)
app_token="${values[7]//\\}"
app_track="${values[10]//[:\}]}"

echo "En attente d'authorisation..."
while grep -q pending < <(curl http://mafreebox.free.fr/api/v1/login/authorize/${app_track} 2>/dev/null)
do
	printf "."
	sleep 1
done
echo

reponse=$(curl "http://mafreebox.free.fr/api/v1/login/authorize/${app_track}" 2>/dev/null)
case ${reponse} in	
	*timeout*)
		echo "Réponse trop tardive (time out) !";;
	*granted*)
		printf "APP_TOKEN=%s\nTRACK_ID=%s\n" "${app_token}" "${app_track}";;
	*denied*)
		echo "Autorisation refusée !";;
	*unknown*)
		echo "Erreur de token !";;
esac

A utiliser sous la forme :
nomScript <app_id> <app_name> <app_version> <device_name>

Script d'obtention du token de session :

#!/bin/bash

APP_ID="$1"
APP_TOKEN="$2"

# demande du chanllenge :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/)
CHALLENGE="${values[9]//\\}"

read foo PASSWORD < <(openssl dgst -sha1 -hmac ${APP_TOKEN} <<< ${CHALLENGE})

curl -v http://mafreebox.free.fr/api/v1/login/session/ -d '{"app_id":"'${APP_ID}'", "password":"'${PASSWORD}'"}'

A utiliser sous la forme :
nomScript <app_id> <app_token>

Merci d'avance pour vos tests (et correction ?) !

#20 Re : -1 »  [Utilitaire Freebox] Script pour télécharger sur votre V6 » Le 13/07/2013, à 13:07

Totor
Réponses : 168
Vinky41 a écrit :

Pour ce qui est des \ je les ai tous supprimés grâce à cette commande :

| sed 's/\\\//g'

Ceci ne peut pas fonctionner car l'expression est incomplète.
Je vois cette erreur partout où il est question d'utiliser l'api free os...

Pour répondre à ton interrogation, si, je fais bien le hash :

read foo PASSWORD < <(openssl dgst -sha1 -hmac ${APP_TOKEN} <<< ${CHALLENGE})

#21 Re : -1 »  [Utilitaire Freebox] Script pour télécharger sur votre V6 » Le 13/07/2013, à 13:13

Totor
Réponses : 168

Bon j'ai trouvé ...
Bon sang...  c'est l'utilisation de la forme Here-String qui posait soucis ...
Je l'utiliser pensant qu'elle n'ajoutait pas de retour à la ligne et finalement si, c'est le cas hmm

#22 Re : -1 »  [Utilitaire Freebox] Script pour télécharger sur votre V6 » Le 15/07/2013, à 21:17

Totor
Réponses : 168

@Zakhar : roll:/
Je n'ai pas demandé d'avis sur mon script ni à savoir si il était approprié à ton besoin ou pas.. mais uniquement si il fonctionnait chez vous.

#23 Re : -1 »  [Résolu] Copie de fichiers » Le 28/03/2013, à 22:00

Totor
Réponses : 4

histoire d'intruduire d'autres notions ...

( shopt -s dotglob; file **|awk -r -F: '/^[^.]+:.*JPEG/ { print $1}' )

#24 Re : -1 »  [RESOLU]Comportement étrange de la commande read » Le 27/03/2013, à 14:44

Totor
Réponses : 2

normal, dans ta fonction, l'entrée standard est la même que celle de ta boucle. du coup, le read ans1 lit la ligne suivante du fichier $1

bref, il faut que tu repenses ton script et que tu passes par un fd alternatif pour ta boucle.
nesthib, pingouinux ou autre prendront certainement le temps de corriger tout cela si tu as besoin (ce que je pense au vu de ton script)...