web-dev-qa-db-fra.com

Script d'arrêt de la transmission pour plusieurs torrents?

J'ai écrit un script d'arrêt pour la transmission. Transmission appelle le script à la fin du téléchargement d'un torrent. Le script fonctionne parfaitement sur ma machine (Ubuntu 11.04 et 12.04).

#!/bin/bash
sleep 300s

# default display on current Host
DISPLAY=:0.0

# find out if monitor is on. Default timeout can be configured from screensaver/Power configuration.

STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
echo $STATUS

if [ "$STATUS" == "  Monitor is On" ]

###  Then check if  its still downloading a torrent. Couldn't figure out how.(May be) by monitoring network downstream activity? 

then

    notify-send "Downloads Complete" "Exiting  transmisssion now"
    pkill transmission

else
    notify-send "Downloads Complete" "Shutting Down Computer"
    dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

fi

exit 0

Le problème est que lorsque je télécharge plusieurs fichiers, lorsque le premier est terminé, la transmission exécute le script. J'aimerais le faire, mais une fois tous les téléchargements terminés.

Je veux mettre une seconde vérification (juste après la vérification du moniteur) s'il télécharge encore un autre torrent.

Est-ce qu'il y a un moyen de faire ça?

4
Khurshid Alam

Ces informations ne sont pas transmises aux scripts via les variables d'environnement. Vous devez donc interroger l'interface RPC de Transmission. Cela est parfois effectué par les bibliothèques clientes - par exemple, un script Python pourrait utiliser python transmissionrpc . Il existe d'autres interfaces de ce type répertoriées à l'adresse http://www.transmissionbt.com/resources/ .

Voici une approche rapide qui utilisera transmission-remote pour compter le nombre de téléchargements non inactifs:

transmission-remote yourhost:yourport -tall --info | grep "^  State:" | grep "Down" | wc --lines

Si vous souhaitez également inclure des téléchargements inactifs, vous pouvez essayer ceci:

transmission-remote yourhost:yourport -l | grep -v -e " 100% " -e "^Sum" -e "^ID" -e " Stopped " | wc --lines

Où "^ ID" et "^ Sum" enlèvent l'en-tête et le pied de page; "100%" bandes bandes complétées torrents; et "Stopped" arrête les torrents incomplets mais en pause. Cette approche n’est pas infaillible - par exemple, un torrent nommé "100% arrêté" la casserait.

5
user98677

J'ai créé un meilleur script (à partir des conseils de user98677) qui tire parti de l'interface RPC de la transmission.

Code:

Github Gist: https://Gist.github.com/khurshid-alam/6474227

Qu'est-ce qu'il fait?

  1. Mettre en pause ou supprimer les torrents terminés une fois qu'ils sont terminés.

  2. Envoyer une notification de transfert (avec curl) [facultatif]

  3. Envoyer une notification Twitter (requiert twidge) [facultatif]

  4. Suspendre/éteindre l'ordinateur OR le laisser tel quel.

Pushover Notification From Transmission

Capture d'écran


Configuration

Sur Ubuntu

Sudo apt-get install libnotify-bin
Sudo apt-get install transmission-cli

Sur Ubuntu> = 13.04 (pour la notification Twitter):

Sudo add-apt-repository ppa:moorhen-core/moorhen-apps
Sudo apt-get install twidge

Pour suspend action sur une distribution non-Ubuntu (Ubuntu utilise Upower), installez le paquet powermanagement-interface

Sudo apt-get install powermanagement-interface

Après l'installation:

  1. Obtenez le code de github-Gist & enregistrez le fichier sous le nom trsm n’importe où sur votre disque dur. Rendre le fichier exécutable chmod a+x trsm.

  2. Connectez-vous pour transférer et copier votre clé d'utilisateur . Collez-le sous user-key dans le script.

  3. Si vous souhaitez que les notifications soient envoyées avec l'icône Nice Looking Application (transmission), créez simplement une fausse application avec l'icône de transmission puis copiez la clé d'application (clé API/Token) et collez-la sous app-key dans le script.

  4. Pour la configuration de Twitter, voir la documentation de twidge.

  5. Transmission ouverte. Aller à préférence-> Web. Activez le client Web (port par défaut 9091) et activez l'authentification de l'utilisateur. Choisissez un nom d'utilisateur et mot de passe. Mettez ce nom d'utilisateur et mot de passe dans le script en tant que username & password respectivement.

  6. Cliquez sur open web-client pour vérifier s'il fonctionne correctement.

  7. Enfin, sauvegardez le script et allez dans l’onglet de téléchargement (dans les préférences de transmission) et cliquez sur call script when torrent is complete. Sélectionnez le script respectif.


Script

#!/bin/bash


user-key=" "  #put your pushover user-key
app-key=" "  #put your pushover application-key
device=" "    #Your device name in pushover

username=" "  # Transmission remote username
password=" "   # Transmission remote password



sleep 100s

# default display on current Host
DISPLAY=:0.0

# authorize transmission
trsm="transmission-remote --auth $username:$password"

# find out number of torrent

TORRENTLIST=`$trsm --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=' ' --fields=1`

for TORRENTID in $TORRENTLIST
do
 echo "* * * * * Operations on torrent ID $TORRENTID starting. * * * * *"

 #echo $TORRENTID

 DL_COMPLETED=`$trsm --torrent $TORRENTID --info | grep "Percent Done: 100%"`

 #echo $DL_COMPLETED

# pause completed torrents & get those torrent names.

 if [ "$DL_COMPLETED" != "" ]; then
  $trsm --torrent $TORRENTID --stop
  trname=`$trsm --torrent $TORRENTID --info | grep "Name:" | awk -F: '{print $NF}'`

  # post an update to Twitter

  echo "$trname download was completed" | twidge update  # Put "#" if you don't need this.

  # Push update for pushover

  curl -s \
    -F "token=$user-key" \
    -F "user=$app-key" \
  # -F "device=$device" \  # uncomment, if you want to send notification to a particular device.
    -F "title=Download Finished" \
    -F "message=$trname download has completed." \
    http://api.pushover.net/1/messages > /dev/null

  # The following codes works assuming One take advantage of gnome-power-manager by setting "black screen after 2/5/10/.. minitues ". 
  # if monitor(Including laptop screen but EXCLUDING external monitor) is on, it will  just force blank the screen, if not, it will shutdown/suspend or leave it as it is.
  # Modify it as per your requirement.

  STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
  #echo $STATUS

  if [ "$STATUS" == "  Monitor is On" ]
  then
      notify-send "Downloads Complete" "turning off the screen now"
          xset dpms force off

  else
      notify-send "Downloads Complete" "$trname"

        # uncomment to shutdown the computer
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

        # uncomment to suspend (on ubuntu)
        #dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

        # uncomment to suspend (on Linux) (requires powermanagement-interface package)
        #pmi action suspend

 else
  echo "Torrent #$TORRENTID is not completed. Ignoring."
 fi

done
4
Khurshid Alam

Un script simple.

Merci à Khurshid Alam et à l'utilisateur98677 J'ai écrit ce script qui fonctionne très bien. Si l'affichage est activé (vous travaillez), la transmission se ferme et envoie une notification si l'ordinateur n'est pas arrêté.

  1. installer

    Sudo apt-get install transmission-cli libnotify-bin
    

    dans Ubuntu 16.04

    Sudo apt install transmission-cli libnotify-bin
    
  2. Transmission> Préférences> Distant> Cocher Autoriser l'accès à distance, assurez-vous que le port HTTP est défini sur 9091 et que seules les adresses IP autorisées sont 127.0.0.1 (par défaut).
  3. Copier coller le script donné, enregistrer sous le nom 'shutdown.sh' et le rendre exécutable.
  4. Transmission> Préférences> Téléchargement> Cochez la case "Appeler le script à la fin du téléchargement", accédez au script.
  5. Paramètres système> Alimentation> Luminosité de l'écran> Désactiver l'écran lorsqu'il est inactif pour> sélectionner une durée raisonnable.

    #!/bin/bash
    sleep 300s
    DISPLAY=:0.0
    STATUS=$(xset -display $DISPLAY -q | grep 'Monitor')
    STATE=$(transmission-remote 127.0.0.1:9091 -tall --info | grep "^  State:" | grep "Down" | wc --lines)
    if
        [ "$STATUS" == "  Monitor is On" ] && [ "$STATE" == "0" ]
    then
        notify-send "Downloads Complete" "Exiting  transmisssion now"
        pkill transmission
    Elif
         [ "$STATE" == "0" ]
    then
        #in Ubuntu 16,04
        shutdown -h now
        #in older versions use the following
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown
    fi
    exit 0
    
1
Vijay