web-dev-qa-db-fra.com

Aide à la création d'une notification de boîte de message avec des options oui / non avant l'exécution d'une application

J'ai commencé à utiliser Ubuntu aux côtés de Windows il y a environ 2 mois. J'ai lentement ajouté tous les programmes que j'utilise régulièrement à Ubuntu, afin que je puisse finalement faire tout ce que je pourrais faire sur Ubuntu sur ma machine Windows.

L'une des dernières choses sur lesquelles je dois migrer est Popcorn Time. J'ai enfin installé l'application sur Ubuntu et j'ai enfin installé VPNAutoConnect. Cependant, sous Windows, j'ai une précaution supplémentaire: une boîte de message qui apparaît lorsque l'utilisateur clique sur l'icône Popcorn Time, qui demande si le VPN est connecté ou non. Si Oui est cliqué, l'application s'exécutera. Si Non est cliqué, il demande si l'utilisateur sait ce qu'est un VPN et leur demande ensuite de le connecter ou de descendre de mon ordinateur (cela était utile car mon colocataire et ma petite amie regardaient parfois des films lorsque je n'étais pas à la maison, donc c'était une garantie supplémentaire pour vous assurer qu'ils ont vérifié).

Je veux créer la même boîte de message dans Ubuntu. Voici le script que j'ai utilisé dans Windows:

returnvalue=msgbox("Is the VPN connected?",4,"VPN Authentification")

If returnvalue=6 Then

    Dim objShell
    Set objShell = WScript.CreateObject( "WScript.Shell" )
    objShell.Run("""C:\Users\*********\Downloads\Popcorn-Time\Popcorn-Time.exe""")
    Set objShell = Nothing

Else If returnvalue=7 Then

    returnvalue=msgbox("Do you know what the VPN is?",4,"VPN Authentification")

        If returnvalue=6 Then 
        x=msgbox("Please connect to the VPN",0,"VPN Authentification")

        Else If returnvalue=7 Then 
        x=msgbox("Please get off my computer",0,"VPN Authentification")

        End if    

    End if

End if

End if

Comment pourrais-je créer ce même type de script dans Ubuntu?

1
Nicomachus

Je vous ai également répondu sur Reddit, mais c'est plus facile.

La façon dont je le ferais est de vérifier la sortie de la commande ifconfig pour l'existence d'une interface tun ou tap. Très probablement, l'un d'eux sera créé lorsque vous vous connecterez au VPN.

#!/usr/bin/env bash
if ifconfig -s | grep -qE "(tun|tap)[0-9]+"; then
    # Run popcorn time
else
    zenity --error --text "VPN is not running."
fi

ifconfig est utilisé pour configurer les interfaces réseau. Si vous ne fournissez aucun argument, il renverra toutes les interfaces réseau disponibles avec un tas d'informations à leur sujet. Le -s L'indicateur ne produit qu'une petite liste des interfaces. Ma ifconfig -s lorsqu'il est connecté à un VPN ressemble à ceci:

➜  ~  ifconfig -s
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0   5302413      0      0 0       1971869      0      0      0 BMRU
lo        65536 0    323789      0      0 0        323789      0      0      0 LRU
tun0       1500 0         0      0      0 0            15      0      0      0 MOPRU

Comme vous pouvez le voir, sur la dernière ligne, il y a une interface appelée "tun0", qui est l'interface que ma connexion VPN utilise. Depuis qu'il est là, je sais que je suis connecté à mon VPN. Si vous souhaitez en savoir plus sur ifconfig, consultez man ifconfig.

Le | (pipe) caractère "pipes" (envoie) la sortie de la première commande dans la deuxième commande - grep.

La commande grep recherche dans le texte d'entrée tout ce qui correspond à un modèle. Le -E le drapeau lui indique que le modèle est une "expression régulière étendue". Ce que c'est un peu trop à expliquer, mais si vous êtes curieux, vous pouvez lire man grep. Le modèle que j'ai fourni, (tun|tap)[0-9]+ recherchera une chaîne commençant par "tun" ou "tap", suivie d'au moins un chiffre. Le -q flag indique à grep que je ne veux pas qu'il affiche le texte réel qu'il a trouvé, je suis simplement intéressé de savoir s'il a trouvé quelque chose ou non.

En mettant cela dans l'instruction if, la condition sera vraie si grep trouve une chaîne correspondante, donc le code dans la clause then sera exécuté. S'il ne parvient pas à trouver une chaîne correspondante, le code de la clause else s'exécutera.

Lignes commençant par # sont des commentaires - code ignoré et non exécuté. Comme je ne sais pas où Popcorn Time est installé, je ne sais pas comment l'exécuter, vous devrez donc le remplir vous-même.

La première ligne, commençant par #! est appelé le "Shebang". Cette ligne indique simplement à votre Shell (la chose que vous utilisez pour exécuter le script) avec quel programme il doit utiliser pour exécuter le script. Dans ce cas, nous souhaitons probablement qu'il utilise bash.


Quelqu'un dans les commentaires a suggéré que vous regardiez la sortie de la commande route, ce qui pourrait être bon, mais quand je l'ai essayé, c'était assez lent. Si vous aviez plusieurs connexions VPN et que vous vouliez vérifier qu'une connexion spécifique était active, la commande route serait bien meilleure (car vous pourriez rechercher une adresse IP spécifique), mais pour le cas d'utilisation simple , Je ne pense pas que ce soit nécessaire.

1
Tommy Brunn

Une approche consisterait à utiliser Zenity. Par exemple:

#!/usr/bin/env bash

if zenity --question --text="What do you choose?"; then
    zenity --info --text="You pressed \"Yes\"!"
else
    zenity --info --text="You pressed \"No\"!"
fi
2
kraxor

Vous devrez probablement utiliser xmessage

Par exemple: xmessage -center -buttons yes,no Are you connected to the VPN?

Exemple de script:

#!/bin/bash

xmessage -center -buttons yes,no Are you connected to the VPN?

ans="$?"

if [[ "$ans" == 101 ]]; then
        #command to connect to VPN
        notify-send "Connecting"
else
    notify-send "Not Connecting"
fi
1
Tim