Contenu | Rechercher | Menus

Annonce

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

À propos de l'équipe du forum.

#26 Le 26/02/2023, à 14:06

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Certains irréductibles n'utilisent pas systemd... tongue


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#27 Le 26/02/2023, à 14:07

Tawal

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Oui, mais ton spectre s'est élargi tout de même wink


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#28 Le 26/02/2023, à 14:15

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

*correction du jour --> j'avais omis '1' à la commande sleep

            echo "power on" | bluetoothctl # on active le bluetooth
            sleep

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#29 Le 26/02/2023, à 14:16

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Tawal a écrit :

Oui, mais ton spectre s'est élargi tout de même wink

ou, le champ des possibles s'est rétréci. big_smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#30 Le 26/02/2023, à 14:20

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

on peut faire

bluetoothctl <<<'power on'

?
ou simplement

bluetoothctl power on

???


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#31 Le 26/02/2023, à 14:26

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

C'est exact, on peut faire plus simple avec

bluetoothctl power on

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#32 Le 26/02/2023, à 14:36

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Même chose pour 'connect'

bluetooth connect $mac

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#33 Le 26/02/2023, à 15:21

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

isScreenLocked() {
    sessionIDs=( $(loginctl list-sessions --no-legend | cut -d ' '-f1) )
    for id in ${sessionIDs[@]} #<est-il vraiment nécessaire de vérifier tous les utilisateurs connectés ?
    do
        readarray -t < <(loginctl show-session $id --value -p Name -p User -p State -p Type -p Remote -p LockedHint)
        read user name remote type state locked < <(printf '%s ' "${MAPFILE[@]}")
    done
    [[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]] #<d'autant que seules les dernières assignations seront disponibles !
}

Dernière modification par Watael (Le 26/02/2023, à 15:22)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#34 Le 26/02/2023, à 15:29

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Watael a écrit :

est-il vraiment nécessaire de vérifier tous les utilisateurs connectés ?

En fait non, juste l'utilisateur de la session en cours.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#35 Le 26/02/2023, à 15:37

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Il y a un oubli d'espace dans ta commande entre ' ' et -f1

--no-legend | cut -d ' '-f1)

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#36 Le 26/02/2023, à 15:43

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

donc :

isScreenLocked() {
        readarray -t properties < <(loginctl show-session $XDG_SESSION_ID --value -p State -p Type -p Remote -p LockedHint)
        read remote type state locked < <(printf '%s ' "${properties[@]}") #<c'est juste pour avoir des noms; on pourrait utiliser ${properties[0]} à la place de $remote dans le test suivant
        [[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]]
}

Dernière modification par Watael (Le 26/02/2023, à 15:45)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#37 Le 26/02/2023, à 15:52

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

C'est normal que sur mon système, cette commande ne me renvoie rien ?

echo $XDG_SESSION_ID

Par contre

loginctl list-sessions --no-legend | cut -d ' ' -f1

me renvoie '2'


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#38 Le 26/02/2023, à 16:04

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

je ne sais pas.

pour être tranquille :

isScreenLocked() {
    local XDG_SESSION_ID=${XDG_SESSION_ID:-$(loginctl list-sessions --no-legend | awk -v user=$LOGNAME '$3==user{print $1}')}
...

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#39 Le 26/02/2023, à 16:45

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Merci pour ton aide précieuse. J'ai édité le premier message pour intégrer les changements.

Sinon tu utilises quoi comme environnement parce que chez moi, la variable XDG_SESSION_ID n'existe que sous un TTY...


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#40 Le 26/02/2023, à 16:58

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

je démarre spectrwm avec startx, en effet.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#41 Le 26/02/2023, à 17:17

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Ah oui en effet ! C'est du lourd, enfin pas vraiment mais quand même.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#42 Le 27/02/2023, à 11:14

k3c

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

@lynn

merci pour ton script

c'est étonnant qu'il n'y ait pas depuis longtemps un soft "approuvé/officiel" qui fasse ça, c'est tellement pratique.


Archlinux sur Xiaomi Air 13

Hors ligne

#43 Le 27/02/2023, à 14:00

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

@k3c

Merci pour ton retour.

k3c a écrit :

c'est étonnant qu'il n'y ait pas depuis longtemps un soft "approuvé/officiel" qui fasse ça, c'est tellement pratique.

Logiquement, quand tu t'éloignes de ton pc, tu verrouilles ta session donc ce script n'a pas une utilité fondamentale. Je cherchais juste un système qui permette de palier un possible défaut de sécurisation de la session, ce dernier se situant entre la chaise et le clavier. ^^


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#44 Le 27/02/2023, à 15:07

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Je cherchais juste un système qui permette de palier un possible défaut de sécurisation de la session, ce dernier se situant entre la chaise et le clavier.

autant je pourrais le croire pour une montre connectée que je n'enlèverais que pour dormir, autant pour un portable que je laisse souvent à côté du clavier quand je vais boire un café, j'y crois moyen. wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#45 Le 27/02/2023, à 15:13

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

voici quelques suggestions et quelques questions :

#!/bin/bash

# Informations à remplir par l'utilisateur
mac="XX:XX:XX:XX:XX:XX"
device_name="Le  Nom du Smartphone"
seconds2lock="Nombre de secondes"

# ne rien modifier en-dessous de cette ligne.
TZ=UTC printf -v notify_time '%(%H heure(s) %M minute(s) %S seconde(s))T' $seconds2lock
notify="notify-send -i phone -u critical --hint=int:transient:1"
max_iterations=5
iterations=0

isPCbt() {
    case $1 in
    planeMode)  rfkill list | grep -qow "Soft blocked: yes"
    ;;
    powered) bluetoothctl show | grep -qw "Powered: yes"
    ;;
    *) exit 1
    ;;
    esac
}
isPhone() {
    case $1 in
    paired|connected) bluetoothctl info $mac | grep -qw "${1^}: yes"
    ;;
    *) exit 1
    ;;
    esac
}
isScreenLocked() {
    local XDG_SESSION_ID=${XDG_SESSION_ID:-$(loginctl list-sessions --no-legend | awk -v user=$LOGNAME '$3==user{print $1}')}
    readarray -t properties < <(loginctl show-session $XDG_SESSION_ID --value -p State -p Type -p Remote -p LockedHint)
    read remote type state locked < <(printf '%s ' "${properties[0]}") 
    [[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]]
}

while :
do  sleep 2 #<Pour quoi faire ? et pourquoi au début ?
    # si le mode avion pour le bluetooth est actif
    if isPCbt planeMode
    then 
        # on désactive le mode avion 
        rfkill unblock bluetooth
    #    sleep 1
        until ! isPCbt planeMode; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
    # autre si le bluetooth n'est pas activé ( /!\ différent du mode avion /!\ )
    elif ! isPCbt powered
    then 
        # on active le bluetooth
        bluetoothctl power on 
    #    sleep 1
        until isPCbt powered; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
    # autre si le smartphone n'est pas appairé
    elif ! isPhone paired
    then 
        # On appaire le smartphone ( /!\ partie intéractive à valider sur le smartphone et sur le PC /!\ ) 
        bluetoothctl pair $mac 
    #    sleep 1
        until isPhone paired; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
    # autre si le bluetooth du pc est actif ET le smartphone est appairé ET non connecté
    elif isPCbt powered && isPhone paired && ! isPhone connected
    then 
        # connexion au smartphone 
        bluetoothctl connect $mac 
    #    sleep 1
        until isPhone connected; do sleep .1; done
        ((iterations++))
        # tant qu' 'iterations' est supérieur ou égal à 'max_iterations' (5)
        while ((iterations>=max_iterations))
        do 
            # si l'écran n'est pas verrouillé
            if ! isScreenLocked
            then 
                # le temps restant est égal au temps avant verrouillage (300)
                time_left=$seconds2lock 
                # bulle de notification
                $notify "Le smartphone $device_name n'est pas connecté" "L'écran sera verrouillé dans :\n$notify_time" 
                # tant que le temps restant est plus grand que '0'
                while ((time_left > 0))
                do 
                    # si le smartphone n'est pas connecté
                    if ! isPhone connected
                    then 
                        sleep 1 #<Pourquoi ?
                        # à chaque itérations de la boucle, le temps restant sera égal au temps restant moins '1'
                        ((time_left--)) 
                        # si l'écran est verrouillé pendant la progression du compte à rebours
                        if isScreenLocked
                        then 
                            break
                        fi
                    else
                        break
                    fi
                done
                # si le smartphone n'est pas connecté et que l'écran n'est pas verrouillé
                if ! isPhone connected && ! isScreenLocked
                then 
                    # on verrouille l'écran
                    loginctl lock-session
                # si le smartphone est connecté et que l'écran est déverrouillé
                elif isPhone connected && ! isScreenLocked
                then 
                    # bulle de notification
                    $notify "Le smartphone $device_name est connecté" "Le verrouillage de l'écran est annulé" 
                    # la variable '$iterations' reprend comme valeur '0'
                    iterations=0 
                else
                    # la variable '$iterations' reprend comme valeur '0'
                    iterations=0 
                fi
            else
                # la variable '$iterations' reprend comme valeur '0'
                iterations=0 
                break
            fi
        done
    else
        # la variable '$iterations' reprend comme valeur '0'
        iterations=0 
    fi
done

je ne suis pas certain que tout fonctionne : je ne peux pas tester. tongue

EDIT: remplacer tous les until... par un appel à la fonction exitOnFailed2much :

exitOnFailed2much() {
    local n=0
    if test "$1" = "not"
    then
        shift
        until ! $@ || ((++n>10)) 
        do
            sleep .1
        done
    else
        until $@ || ((++n>10))
        do
            sleep .1
        done
    fi
    ((n>=10)) && exit 1
}

par exemple : exitOnFailed2much not isPCbt planeMode, ou exitOnFailed2much isPCbt powered.

Dernière modification par Watael (Le 27/02/2023, à 15:48)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#46 Le 27/02/2023, à 16:36

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

C'est l'habitude de mettre un sleep quelque chose quand je fais partir une boucle... c'est plus pratique pour arrêter en cas d'emballement du truc, un oubli, une erreur. Mais c'est vrai qu'on peut l'enlever. Pour les autres, dans le doute, je laisse un délai pour l'exécution des commandes mais ce n'est certainement pas nécessaire non plus...

Pour les exitOnFailed2much, pourquoi pas; mais dans ce cas, il n'y a pas besoin de délai. Dans le cas du mode avion, si la désactivation ne fonctionne pas, c'est peut-être qu'il n'y pas de service bluetooth qui tourne ou alors un admin en herbe a joué avec sa configuration. tongue


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#47 Le 27/02/2023, à 19:29

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

J'ai modifié le script dans le premier message en reprenant certains éléments de ce tu m'as proposé. Pour le exitOnFailed2much, je ne l'ai pas encore intégré. Pour en revenir au sleep, le premier après le while, en fait il est bien utile car ça évite de faire monter la charge du système de façon excessive.
Pour le deuxième sleep, il correspond au compte à rebours des 300 secondes... si on l'enlève, bah le temps passe beaucoup plus vite d'un coup... ^^


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#48 Le 27/02/2023, à 21:05

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

je parlais bien du sleep 2 et des sleep 1.

mais pour le sleep 2, je ne comprends pas : "la montée en charge" n'est que repoussée, de deux secondes ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#49 Le 27/02/2023, à 21:19

lynn

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

Note la différence dans ce graphe... Sur la partie de gauche, la charge normale est située entre 0 et 20% environ et une fois le sleep 1 enlevé, ça se situe entre 20 et 40% environ.
1677528828.png


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#50 Le 27/02/2023, à 22:00

Watael

Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth

il faut un temps de pause pour que la boucle infinie (while :) ne mouline pas, bien sûr.

de toute façon, quand tu auras inscrit le script dans la crontab (ou autre systemctl périodique), cette boucle infinie n'auras plus de raison d'être.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne