Nous nous étions quittés, lors de la partie 2 de cette série d’articles, par

J’entends déjà les plus exigeants me faire remarquer que ce serait quand même plus simple d’activer ce script par son icône présente sur la grille des applis du Jolla … Et ils ont assez raison …

Mais c’est déjà une autre histoire, racontée par un geek, pleine de hacks et de scripts … Et qui nous emmène encore plus loin ( Mc Bin, Chat qu’Expire) !

Alors il est grand temps de s’en occuper !

SDAction, la commande invoquée en touchant l’écran, que même on va tout faire soi-même pour que ça marche, même quand ça veut pas !

1-1 Qu’implémenter ?

De manière intuitive, que pourrait-on souhaiter voir ?

  • Une icone qui montre le status de la microSD (présent, monté, démonté, absent),
  • une icone qui nous propose de démonter ou remonter cette microSD.

Cela nous impose quand même de gérer 6 icones pour 2 emplacements de la grille des applications … Comme monter ou démonter est quelque peu redondant avec présent ou absent, il apparaît plus simple de ne garder qu’un emplacement sur la grille, pour lui associer 3 icones :

soit monté-> à démonter,

pont_ferméIcone associée à un script SDUMnt.sh qui ressemblerait à ça :

#!/bin/sh
SD.sh umount

 

Soit démonté->à monter

pont_ouvertIcone associée à un script SDMnt.sh qui ressemblerait à ça :

#!/bin/sh
SD.sh mount

 

On pourrait même ajouter : pas de µSD

no_SDIcone associée à un script SDMnt.sh qui ressemblerait à ça :

#!/bin/sh
SD.sh mount

 

1-2 Comment faire ?

À la louche, avec 2 scripts et 3 icones, il doit être possible de boucler le projet. Il ne reste qu’à s’inspirer du tuto « Comment sont gérées les icones et leurs applis par l’UI de Sailfish » pour réaliser une manipulation semblable : switch des scripts et des icones.

Mais pour savoir où on en est, il faudrait que SD.sh nous retourne des codes « erreur » comme par exemple

  • Si mount
  • 0 : OK
  • 1 : pas OK rien fait
  • 2 : pas OK pas de µSD
  • Si umount
  • 0 : OK
  • 1 : pas OK reste des répertoires montés
  • 2 : pas OK pas de µSD

Et donc modifier le script SD.sh en conséquence avec des

exit 0 , exit 1 ou exit 2 et aussi
return 0 , return 1 et return 2

au bon moment.

1-3 Alors ces scripts ?

Sans pour autant tester tous les cas de figure (voyez ça comme vos exercices personnels), il est possible d’insérer des tests et sortir des codes erreurs dans la nouvelle version du script SD.sh :

#!/bin/sh
CMD=$1
SD=/dev/mmcblk1p1
ERR=0
set -- `/sbin/blkid -c /dev/null -o export $SD | grep UUID= | tr '=' ' '`
UUID=$2
[ -z $UUID ] && CMD='Nodev'
function Mount {
lSDCARD=$1
err=0
mount | grep -q mmcblk1p1
[ $? -eq 1 ] &&  /usr/sbin/mount-sd.sh add mmcblk1p1 # pose des problèmes en mode desktop
df -h | grep -q $lSDCARD
[ $? -eq 0 ] && {
mount -o bind $lSDCARD /home/nemo/SD64
[ $? -ne 0 ] && err=1
mount -o bind $lSDCARD /data/sdcard/SD64
[ $? -ne 0 ] && err=1
}
return $err
}
function UMount {
lSDM=$1
lUUID=$2
err=0

MTList=`awk -v SDM=$lSDM -v UUID=$lUUID'
BEGIN {LISTE=""}
$0 ~ SDM && $0 !~ UUID { LISTE=($2" "LISTE) }
END { print LISTE} ' /etc/mtab`
for DIR in $MTList
do
umount $DIR
[ $? -ne 0 ] && err=1
done
return $err
} 
case "$CMD" in
Nodev)   ERR=2
         ;;
'')      ERR=3
         ;;
mount)   Mount /media/sdcard/$UUID
ERR=$?
;;
umount)  UMount $SD $UUID
ERR=$?
;;
*)       ERR=1
;;
esac
exit $ERR

Dès lors, les deux scripts (SDMnt.sh et SDUMnt.sh) qui effectueront les opérations seront complétés pour réaliser les switchs des icones et des scripts ; il peuvent être écrits de la sorte :

SDMnt.sh

#!/bin/sh
SD.sh mount
case $? in
0) cp /usr/share/SD/SDMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDUMnt.sh /usr/share/SD/SDAction.sh   
;;
1) cp /usr/share/SD/SDUMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh
;;
2) cp /usr/share/SD/SDNO.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDMnt /usr/share/SD/SDAction.sh
;;
esac

et SDUMnt.sh

#!/bin/sh
SD.sh umount
case $? in
0) cp /usr/share/SD/SDUMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh   
;;
1) cp /usr/share/SD/SDMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDUMnt.sh /usr/share/SD/SDAction.sh
;;
2) cp /usr/share/SD/SDNO.png /usr/share/icons/hicolor/86x86/apps/SDAction.png
cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh
;;
esac

Attention à ne pas oublier le fichier .desktop correspondant : SDAction.desktop

[Desktop Entry]
Version=1.0
Name=SDAction (un)mount
Type=Application
Comment=Show System Processes
Terminal=true
Exec="/usr/share/SD/SDAction.sh"
Icon=SDAction
Categories=ConsoleOnly;System;
GenericName=mount SDcard

1-4 Vérifications

Petit test pour s’assurer que ça marche, à partir de ma linux box :

> scp -r SD  nemo@jolla.chez.moi:SD64/devel
password: xxxxxxx
SD/SD.sh                        100% 1102     1.1KB/s   00:00    
SD/SDAction.desktop             100%  223     0.2KB/s   00:00    
SD/SDAction.png                 100%   16KB  16.4KB/s   00:00    
SD/SDAction.sh                  100%  478     0.5KB/s   00:00    
SD/SDMnt.png                    100% 6856     6.7KB/s   00:00    
SD/SDMnt.sh                     100%  476     0.5KB/s   00:00    
SD/SDUMnt.png                   100% 7632     7.5KB/s   00:00    
SD/SDUMnt.sh                    100%  478     0.5KB/s   00:00    
SD/SDno.png                     100%   16KB  16.4KB/s   00:00
> ssh nemo@jolla.chez.moi
password: xxxxxxxxx
> devel-su
password: xxxxxxxxx
# cp -rf ~SD64/devel/SD /usr/share
# cd /usr/share/SD
# ./SD.sh mount ; echo $?
0
# ./SD.sh umount ; echo $?
0
# ./SDMnt.sh ; echo $?
0
# diff ./SDUMnt.sh ./SDAction.sh 
#
# ./SDUMnt.sh ; echo $?
0
# diff ./SDMnt.sh ./SDAction.sh 
#

Et d’ailleurs votre petite icone change au gré des instructions  ./SDMnt.sh \ ./SDUMnt.sh.

Alors, Intéractif ? C’est pour quand

2-1 cela ne serait-il pas déjà opérationnel ?

Bref tout se passe très bien . Il ne reste plus qu’à « toucher » l’icone sur l’écran pour vérifier (et passer à autre chose) …

Caramba ! Encore Raté ! Maudit machin ! Et oui, ça ne marche pas ! Mais ce n’est guère étonnant, rappelez vous, quand  nemo tente de monter ou démonter un file-system :

> umount /data/sdcard/SD64
umount: /data/sdcard/SD64: umount failed: Operation not permitted

Cette limitation reste d’actualité ! Alors ne peut on rien faire ?

2-2 Si un gros trous de sécurité ,

En activant le BIT SETUID ROOT ! Car si un programme est enregistré avec le suid ou guid à root, logiquement toutes les commandes exécutées via le script le seront sous l’autorité de root !

2-3 élevons les droits du script

Pour executer un shell « harbour-filetug« , rangé dans « /tmp » avec les droits de root, il suffit de compiler ce programme « commeroot.c » écrit en C:

#include 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/tmp/harbour-filetug" );
return 0;
}

Et de lui activer le bit setuid root

# sudo chmod 4755 commroot

Alors certes, seul root peut exécuter cette commande. Mais une fois fait il faudra bien faire attention à qui s’en sert, car à partir de maintenant, n’importe quel usager peut exécuter /tmp/harbour-filetug avec les droits de root … Si en plus /tmp/harbour-filetug n’est pas bien protégé en écriture, alors n’importe qui peut changer le contenu du script et faire ce qu’il veut sur la machine … Et ça, c’est bien pire que de croiser les effluves !

Les droits de commroot seront réglés en

# chown root:root  commroot : ainsi seul root peut intervenir dessus
# chmod 4550 commroot : ainsi même avec le setuid root, personne ne peut le modifier

les droits de harbour-filetug seront réglé en

# chown root:root  harbour-filetug
# chmod 550   harbour-filetug

Le but étant d’empêcher qu’un utilisateur lambda, et même nemo, ne puisse modifier le script et le programme qui élève ses droits.

2-4 j’ai pas de compilateur !

Seulement voilà, on a toujours pas eu de tuto sur la compilation croisée et pas grand monde ne doit avoir GCC d’installé sur son Jolla … Alors que faire ? Trouver un programme qui ferait déjà un truc similaire ! Pardi ! Vous allez me rétorquer que c’est peine perdue, que nous sommes entre gens raisonnables et que plus personne n’ose encore utiliser cette ‘astuce’ pour lancer un script avec les droits de root pour l’utilisateur nemo !

filetug

Plus personne ? Et bien ça c’est ce que l’on croit toujours avant de tomber dessus. Comptez sur l’inconséquence des autres ! Fouillez les stores ! Vous trouverez finalement chez open repos un paquet bigrement intrigant : StartAsRoot for Filetug. Que contient-il ? :

# wget https://openrepos.net/sites/default/files/packages/365/filetugroot-0.2-2.armv7hl.rpm
# rpm -qp --list ./filetugroot-0.2-2.armv7hl.rpm
/usr/share/applications/harbour-filetug-root.desktop
/usr/share/icons/hicolor/86x86/apps/harbour-filetug-root.png
/usr/share/openrepos-Filetugroot/start-root

Avec les instructions strings et file, intéressons nous à ce start-root, qui à le mérite d’être explicite :

# file start-root
start-root: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=295c67c897dc29fbfaf695f5cb5822ebec3aed35, not stripped
# strings start-root
/lib/ld-linux-armhf.so.3
__gmon_start__
libc.so.6
setuid
abort
system
__libc_start_main
GLIBC_2.4
/usr/bin/harbour-filetug

Ce qui a aussi le mérite d’être clair : ce programme exécute harbour-filetug (un file browser) avec les permissions de root (bande de cinglés) !!! Et on devine ce qui nous reste à faire :

2-5 un petit hack maison

Pour échanger le nom du programme, qui est appelé, par le nôtre. Mais c’est un binaire ! vi ou nano risquent de râler gravement ! Pour éditer du binaire, un petit hexedit fait l’affaire

# cp start-root SDAction
# hexedit SDAction

Et sous hexedit, /usr/bin/harbour-filetug est remplacé, au caractère prèt, par /usr/share/SD/SDAction.sh ;

hexedit1hexedit2

Effectivement, mon expression fait un caractère de plus que celle qui est remplacée, mais comme elle est suivie de quelques 00, tant qu’on tape dedans, ce n’est pas grave.

filetug2

 

 

 

Pour ceux qui n’ont pas hexedit sous la main, un petit sed suffira (mais toujours garder en mémoire que c’est au caractère prêt, lors de l’écriture de l’expression rationnelle) :

# sed 's/usr\/bin\/harbour-filetug./usr\/share\/SD\/SDAction.sh/' start-root >sdaction

Vérifions quand même :

# ls -l start-root sdaction SDAction 
-rwxr-xr-x 1 bandix400 bandix400 5423 avril 18 03:01 sdaction*
-rwxr-xr-x 1 bandix400 bandix400 5423 avril 18 02:44 SDAction*
-rwxr-xr-x 1 bandix400 bandix400 5423 févr. 19 11:31 start-root*
# md5sum start-root sdaction SDAction 
df5c93f54e57f68aca1965c569efd0bf  start-root
bc0f56be475df6811e4f99a78a426c61  sdaction
bc0f56be475df6811e4f99a78a426c61  SDAction

On voit très bien que si les 3 fichiers ont la même taille, le MD5sum de start-root est différent des 2 autres ; sdaction étant obtenu avec sed et SDAction avec hexedit, on constate qu’ils sont identiques … Mais fonctionnent-ils après cette agression ? Copions (ma linuxbox)SDAction dans (mon Jolla)/usr/share/SD, mettons les bons droits et testons en tant que « nemo » :

#chmod 4550 SDAction
# ls -l SDAction
-r-sr-x--- 1 root root 5423 Apr 18 03:10 SDAction
# exit
# ./SDAction
# ./SDAction
# ./SDAction
# ./SDAction

À chaque fois l’icone change, et un « df -h » me montre que les répertoires sont « bindés » ou « dé-bindés ».

Maintenant il faut mettre à jour le .desktop, tel que la ligne

Exec= »/usr/share/SD/SDAction.sh »

soit modifiée en

Exec= »/usr/share/SD/SDAction »

Et le tour est joué !

Voila c’est fini !

reste une question qui désormais nous taraude : si utiliser « commeroot.c » est à grandement déconseiller, existe-t-il une solution  Bien sûr, quil en existe une et vous l’utilisez très souvent :
Il suffit qu’un pop-up s’affiche et vous demande votre mot de passe ; le programme verifie que vous avez bien le droit d’exécuter l’action et si c’est le cas, s’exécute, par exemple GKSUDO …   Mais ça, c’est carrément une autre série d’articles 🙂

 

Maintenant il se peut que cette série vous pose plus de problèmes qu’elle n’en  a résolus ; venez  Forum_Lien sur les charmes insoupçonnés des µSD ; venez nous raconter jusqu’où c’est allé, trop ou pas assez loin. De plus, cette tri-tuto-rie vous a permis d’aborder de nombreux aspects de l’environnement de SailfishOS, et donc de Linux, que ce soit les scripts, les commandes avancées du shell (awk, sed, set, function, case, etc), sa grammaire (test, boucles, vatriables, opérations scalaires), ses limites, sa sécurité … Alors si ce sont plutôt les scripts ou la programmation qui vous interpellent, alors n’hésitez pas à ReagirdansLeForum qui est là.

Autrement si vous souhaitez carrément exécuter Android de la carte SD et libérer cette palce … Y-a moyen … Mais sous unix il n’existe pas de problèmes qu’une bonne in-direction ne puisse résoudre (y-a-toujours moyen) 😉 .

bandix400

bandix400

Auteur

Je suis passionné de génétique, d’informatique, de mécanique, et je m’arrête là car je manque déjà de temps pour tout faire ; autrement j’y rajouterais volontiers l’électronique, la musique, l’aquariophilie, le graphisme, le jeu Vidéo (simulation de conduite/FPS) et du ju-jitsu traditionnel.
bandix400

Les derniers articles par bandix400 (tout voir)

Un petit mod à 2 balles, enfin à moins de 6€
Activer le SSH user/root du N9