Indicateur d'utilisation du système de fichiers

10

Je n'arrive pas à trouver un utilitaire approprié pour simplement indiquer l'utilisation du système de fichiers (% d'espace libre pour les partitions) sur le panneau.

Et je ne suis pas impatient d'installer de mauvais types d'outils de gestion de bureau, mais un simple indicateur.

J'apprécie toutes vos suggestions.

Dinesh Kalidassan
la source
Cela peut être mis en œuvre. À quoi voulez-vous qu'il ressemble? Il suffit de partitionner le nom du périphérique comme /dev/sdb1et son utilisation juste à côté? En pourcentage ou en gigaoctets réels?
Sergiy Kolodyazhnyy
Je préférerais plutôt un nom personnalisé et% gratuit pour toutes les partitions du disque dur et lorsque je branche un disque dur externe ou un stockage USB.
Dinesh Kalidassan
Pouvez-vous expliquer ce que vous entendez par nom personnalisé? vous voulez également nommer les disques?
Sergiy Kolodyazhnyy
Je voudrais faire référence à / dev / sdb1 comme "Critique" ou "Divertissement" ou "Officiel" etc.,
Dinesh Kalidassan
2
Salut Dinesh, si l'une des réponses vous donne ce que vous cherchiez (en général), vous pouvez l' accepter. J'ai remarqué dans votre profil que vous n'aviez pas accepté de réponse auparavant, vous ne la connaissiez peut-être pas. Si (l'une ou l'autre) l'une des réponses résout votre problème, envisageriez-vous de l'accepter? (Cochez le grand V sous les flèches haut / bas à côté de la réponse).
Jacob Vlijm

Réponses:

19

ÉDITER:

1. NOUVELLE RÉPONSE

Bien que la réponse au bas de celle-ci puisse être utilisée (voir [2.]), elle conduit à une ppaversion avec des options supplémentaires, à définir dans une fenêtre de préférences.

entrez la description de l'image ici

entrez la description de l'image ici

Les options incluent:

  • Définition de tous les alias dans une seule fenêtre
  • Définition des couleurs de thème pour l'icône du panneau:

    entrez la description de l'image icientrez la description de l'image icientrez la description de l'image icientrez la description de l'image ici

  • Définition d'un seuil pour les avertissements
  • Afficher des informations sur les volumes nouvellement montés / connectés dans une notification:

    entrez la description de l'image ici

  • Exécuter au démarrage

En outre, l'indicateur comprend désormais une icône plus petite (largeur) définie pour d'autres distributions (comme xfce), qui sera automatiquement appliquée, selon le gestionnaire de fenêtres.

entrez la description de l'image ici

À installer:

sudo add-apt-repository ppa:vlijm/spaceview
sudo apt-get update
sudo apt-get install spaceview



2. ANCIENNE RÉPONSE

Le script ci-dessous est un indicateur qui répertorie vos appareils et montre leur utilisation. Les informations sont mises à jour (si nécessaire) une fois toutes les dix secondes.

entrez la description de l'image ici

en outre

  • Pendant que l'indicateur est en cours d'exécution, vous pouvez choisir un appareil à représenter dans l'icône. L'appareil sera mémorisé lors de la prochaine exécution de l'indicateur:

    entrez la description de l'image ici

    ! [entrez la description de l'image ici

    entrez la description de l'image ici

  • Pour un ou plusieurs (ou tous) périphériques, vous pouvez définir un autre nom ("nom personnalisé"), à définir dans la tête du script

    À titre d'exemple, ceci:

    alias = [
        ["sdc1", "stick"],
        ["sdb1", "External"],
        ["sda2", "root"],
        ["sda4", "ntfs1"],
        ["sda5", "ntfs2"],
        ["//192.168.0.104/media", "netwerk media"],
        ["//192.168.0.104/werkmap_documenten", "netwerk docs"],
        ]

    Montrera:

    entrez la description de l'image ici

  • Vous pouvez définir un seuil ; si l'espace libre de l'un de vos appareils est inférieur à celui-ci, vous recevrez un avertissement:

    entrez la description de l'image ici

  • Les appareils branchés / débranchés seront ajoutés / supprimés de la ménuliste dans les 10 secondes.

Le scénario

#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread

#--- set alias names below in the format [[device1, alias1], [device2, alias2]]
#--- just set alias = [] to have no custom naming
alias = []
#--- set the threshold to show a warning below 
#--- set to 0 to have no warning
threshold = 17
#---
currpath = os.path.dirname(os.path.realpath(__file__))
prefsfile = os.path.join(currpath, "showpreferred")

class ShowDevs():
    def __init__(self):
        self.default_dev = self.get_showfromfile()
        self.app = 'show_dev'
        iconpath = currpath+"/0.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("Starting up...", self.app)
        self.update = Thread(target=self.check_changes)
        self.update.setDaemon(True)
        self.update.start()

    def check_changes(self):
        state1 = None
        while True:
            self.state2 = self.read_devices()
            if self.state2 != state1:
                self.update_interface(self.state2)
            state1 = self.state2
            time.sleep(10)

    def update_interface(self, state):
        warning = False; self.newmenu = []
        for dev in state:
            mention = self.create_mention(dev)
            name = mention[0]; deci = mention[2]; n = mention[1]
            if n <= threshold:
                warning = True
            try:
                if self.default_dev in name:
                    newlabel = mention[3]
                    newicon = currpath+"/"+str(10-deci)+".png"
            except TypeError:
                pass
            self.newmenu.append(name+" "+str(n)+"% free")
        if warning:
            newlabel = "Check your disks!"
            newicon = currpath+"/10.png"
        try:
            self.update_indicator(newlabel, newicon)
        except UnboundLocalError:
            labeldata = self.create_mention(state[0])
            newlabel = labeldata[3]
            newicon = currpath+"/"+str(10-labeldata[2])+".png"
            self.update_indicator(newlabel, newicon)
        GObject.idle_add(self.set_new, 
            priority=GObject.PRIORITY_DEFAULT)  

    def update_indicator(self, newlabel, newicon):
        GObject.idle_add(self.indicator.set_label,
            newlabel, self.app,
            priority=GObject.PRIORITY_DEFAULT)   
        GObject.idle_add(self.indicator.set_icon,
            newicon,
            priority=GObject.PRIORITY_DEFAULT)

    def set_new(self):
        for i in self.initmenu.get_children():
            self.initmenu.remove(i)
        for item in self.newmenu:
            add = Gtk.MenuItem(item)
            add.connect('activate', self.change_show)
            self.initmenu.append(add) 
        menu_sep = Gtk.SeparatorMenuItem()
        self.initmenu.append(menu_sep)
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()

    def change_show(self, *args):
        index = self.initmenu.get_children().index(self.initmenu.get_active())
        self.default_dev = self.newmenu[index].split()[0]
        open(prefsfile, "wt").write(self.default_dev)
        self.update_interface(self.read_devices())

    def create_mention(self, dev):
        name = dev[1] if dev[1] else dev[0]
        n = dev[2]; deci = round(dev[2]/10)
        newlabel = name+" "+str(n)+"% free"
        return (name, n, deci, newlabel)        

    def create_menu(self):
        # create initial basic menu
        self.initmenu = Gtk.Menu()
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()
        return self.initmenu

    def read_devices(self):
        # read the devices, look up their alias and the free sapace
        devdata = []
        data = subprocess.check_output(["df", "-h"]).decode("utf-8").splitlines()
        relevant = [l for l in data if all([
                    any([l.startswith("/dev/"), l.startswith("//")]),
                    not "/loop" in l])
                    ]
        for dev in relevant:
            data = dev.split(); name = data[0]; pseudo = None       
            free = 100-int([s.strip("%") for s in data if "%" in s][0])
            for al in alias:
                if al[0] in name:
                    pseudo = al[1]
                    break
            devdata.append((name, pseudo, free)) 
        return devdata

    def get_showfromfile(self):
        # read the preferred default device from file
        try:
            defdev = open(prefsfile).read().strip()
        except FileNotFoundError:
            defdev = None
        return defdev

    def stop(self, source):
        Gtk.main_quit()

ShowDevs()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Les icônes

entrez la description de l'image ici 0.png

entrez la description de l'image ici 1.png

entrez la description de l'image ici 2.png

entrez la description de l'image ici 3.png

entrez la description de l'image ici 4.png

entrez la description de l'image ici 5.png

entrez la description de l'image ici 6.png

entrez la description de l'image ici 7.png

entrez la description de l'image ici 8.png

entrez la description de l'image ici 9.png

entrez la description de l'image ici 10.png

Mise en place

La configuration est simple:

  • Copiez le script dans un fichier vide, enregistrez-le sous showusage.py
  • Enregistrez les icônes ci-dessus, exactement nommées comme dans leur étiquette , dans un seul et même répertoire que le script (clic droit> Enregistrer sous)
  • Dans la section de tête du script, définissez des noms alternatifs (possibles) ( aliasses). Ci-dessous un exemple:

    alias = [
        ["sda2", "root"],
        ["sdb1", "External"]
        ]

    Si vous souhaitez afficher les appareils inchangés, utilisez:

    alias = []

    ... et si vous le souhaitez, modifiez le seuil pour afficher un avertissement:

    #--- set the threshold to show a warning below (% free, in steps of 10%)
    #--- set to 0 to have no warning
    threshold = 10

    C'est tout

L'exécuter

Pour utiliser l'indicateur, exécutez la commande:

python3 /path/to/showusage.py

Pour l'ajouter aux applications de démarrage, utilisez la commande:

/bin/bash -c "sleep 10 && python3 /path/to/showusage.py"

Choisissez Applications: Dash> Applications de démarrage> Ajouter, ajoutez la commande ci-dessus.

Jacob Vlijm
la source
16

Avertissement: je suis l'auteur de cet indicateur et il est écrit pour cette question spécifique

Mise à jour du 23 octobre 2018

L'indicateur prend désormais en charge la liste des partages réseau . Merci à mihaigalos

Mise à jour du 29 octobre 2016

L'indicateur dispose désormais d'une fonctionnalité de démontage et les alias ont été rendus uniques en faisant référence à l'UUID de chaque partition au lieu du nom du périphérique de bloc tel que sda1. Voir le rapport de bogue associé

Mise à jour, 8 octobre 2016

L'indicateur est maintenant dans la version 2.0, a ajouté quelques fonctionnalités et possède son propre PPA.

Pour installer à partir de PPA, utilisez les étapes suivantes dans le terminal:

  1. sudo apt-add-repository ppa:udisks-indicator-team/ppa
  2. sudo bash -c 'apt-get update && apt-get install udisks-indicator'

Comme mentionné dans les notes de version, les fonctionnalités incluent:

  • Icônes pour les entrées de menu: chaque partition / périphérique est associé à une icône appropriée. Si le périphérique est un disque USB, une icône de support amovible est utilisée, s'il s'agit d'une image iso - l'icône de disque optique est utilisée et, évidemment, les partitions de disque dur / SSD ont des icônes de lecteur.
  • L'utilisation est maintenant indiquée en pourcentage et en valeurs lisibles par l'homme (puissances de 1024).
  • Représentation graphique de l'utilisation via la barre d'utilisation (un grand merci à Mateo Salta pour l'idée)
  • Boîte de dialogue Préférences: les utilisateurs peuvent désactiver certains champs qu'ils ne souhaitent pas voir pour chaque entrée de menu. Cela permet de garder le menu indicateur propre s'il y a une grande quantité de partitions attachées. (Merci à la demande de Zacharee)
  • Espacement du texte: avec la police Ubuntu par défaut et les polices Monospace, les entrées de texte sont bien espacées pour avoir un aspect plus net et améliorer la lisibilité des informations.
  • Bulles de notification au cas où la partition ne peut pas être montée

Ci-dessous, la capture d'écran avec le thème d'icône Ubuntu par défaut: entrez la description de l'image ici

Thème d'icônes Ubuntu Kylin

entrez la description de l'image ici

Avec tous les champs facultatifs désactivés

entrez la description de l'image ici

Choix de conception et réflexions supplémentaires:

En créant cet indicateur, j'espérais obtenir un utilitaire qui conviendrait aux utilisateurs avancés et occasionnels. J'ai essayé de résoudre certains des problèmes que j'ai remarqués que les nouveaux utilisateurs peuvent avoir avec la gestion des outils de ligne de commande. De plus, l'utilitaire s'efforce d'être polyvalent.

La boîte de dialogue Préférences permet de rendre l'indicateur aussi complexe et / ou aussi simple que l'utilisateur le souhaite. C'était également une décision de conception spécifique pour éviter d'avoir une étiquette dans le panneau supérieur afin qu'elle n'occupe pas trop d'espace sur le panneau supérieur de l'utilisateur. De plus, cet indicateur s'efforce d'être un utilitaire polyvalent qui permet de monter des partitions ainsi que d'ouvrir leurs répertoires respectifs. Cela peut être utilisé non seulement comme utilitaire d'utilisation du disque, mais aussi comme utilitaire de navigation pour une ouverture rapide des répertoires.

Il est également pratique pour les utilisateurs de savoir quelle partition habite quel disque, évitant ainsi une confusion fréquente avec le montage via des utilitaires de ligne de commande tels que mount. Au lieu de cela, il utilise udisksctlà cette fin (ainsi que d'obtenir les informations du UDisks2démon, d'où la dénomination). La seule tâche qu'il n'effectue pas est le démontage, et c'est pourquoi l' Open Disks Utilityentrée de menu est incluse.

Alors qu'à l'origine, je m'efforçais de le rendre similaire à la menulet iStat, le projet a divergé de cet objectif - l'indicateur est unique dans sa conception et son objectif. J'espère que cela sera utile à de nombreux utilisateurs et rendra leur expérience Ubuntu beaucoup plus agréable.


udisks-indicator (réponse originale)

Indicateur pour Ubuntu avec le bureau Unity pour afficher l'utilisation du disque Exemple de capture d'écran

Aperçu

Cet indicateur pour Ubuntu avec Unity permet de visualiser facilement les informations sur vos partitions montées. Il s'efforce d'être visuellement similaire à la menulet iStat Menu 3 d'OS X.

Les inscriptions sont organisées dans l'ordre:

  • Cloison
  • Alias ​​(si défini par l'utilisateur)
  • Lecteur de disque auquel appartient la partition
  • Point de montage de la partition (répertoire)
  • % D'utilisation

Cliquer sur chaque entrée de partition ouvrira le point de montage de la partition dans le gestionnaire de fichiers par défaut

Le menu "Partitions non montées" répertorie toutes les partitions non actuellement montées par le système. Cliquer sur une entrée de ce sous-menu montera cette partition automatiquement, généralement pour/media/username/drive-id dossier

L'indicateur utilise les icônes par défaut fournies avec le système, donc l'icône doit changer lorsque vous modifiez le thème de l'icône à l'aide de l'outil Unity Tweak ou d'autres méthodes.

REMARQUE : si vous souhaitez ajouter plusieurs alias en même temps, au lieu d'un par un via l'option "Créer un alias", vous pouvez le faire en modifiant le ~/.partition_aliases.jsonfichier de configuration. Le format est le suivant:

{
    "sda1": "Alias 1",
    "sda2": "Alias 2",
    "sdb1": "Alias 3"
}

Installation

PPA pour une installation facile arrive bientôt. . .

En attendant, voici des étapes alternatives:

  1. cd /tmp
  2. wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
  3. unzip master.zip
  4. sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
  5. sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

Toutes ces étapes peuvent être mises dans un joli petit script d'installation:

#!/bin/bash

cd /tmp
rm master.zip*
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

Code source

Le code source d'origine (version v1.0) avec les fonctionnalités de base de cet indicateur se trouve ci-dessous. Pour les nouvelles fonctionnalités, consultez le référentiel GitHub pour ce projet . Veuillez signaler toutes les demandes de fonctionnalités ainsi que les erreurs sur GitHub.

Le /usr/bin/udisks-indicator:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#
# Author: Serg Kolo , contact: [email protected]
# Date: September 27 , 2016
# Purpose: appindicator for displaying mounted filesystem usage
# Tested on: Ubuntu 16.04 LTS
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import gi
gi.require_version('AppIndicator3', '0.1')
from gi.repository import GLib as glib
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Gtk as gtk
from os import statvfs
#from collections import OrderedDict
import subprocess
import shutil
import dbus
import json
import os

class UdisksIndicator(object):

    def __init__(self):
        self.app = appindicator.Indicator.new(
            'udisks-indicator', "drive-harddisk-symbolic.svg",
            appindicator.IndicatorCategory.HARDWARE
            )

        if not self.app.get_icon():
           self.app.set_icon("drive-harddisk-symbolic")

        self.app.set_status(appindicator.IndicatorStatus.ACTIVE)

        filename = '.partition_aliases.json'
        user_home = os.path.expanduser('~')
        self.config_file = os.path.join(user_home,filename)
        self.cache = self.get_partitions()
        self.make_menu()
        self.update()


    def update(self):
        timeout = 5
        glib.timeout_add_seconds(timeout,self.callback)

    def callback(self):
        if self.cache != self.get_partitions():
            self.make_menu()
        self.update()        

    def make_menu(self,*args):
        """ generates entries in the indicator"""
        if hasattr(self, 'app_menu'):
            for item in self.app_menu.get_children():
                self.app_menu.remove(item)

        self.app_menu = gtk.Menu()

        partitions = self.get_partitions()
        for i in partitions:

            part = "Partition: " + i[0]
            alias = self.find_alias(i[0])
            drive = "\nDrive: " + i[1]
            mount = "\nMountPoint: " + i[2]
            usage = "\n%Usage: " + i[3]

            item = part + drive + mount + usage
            if alias:
                alias = "\nAlias: " + alias
                item = part + alias + drive + mount + usage

            self.menu_item = gtk.MenuItem(item)
            self.menu_item.connect('activate',self.open_mountpoint,i[2])
            self.app_menu.append(self.menu_item)
            self.menu_item.show()

            self.separator = gtk.SeparatorMenuItem()
            self.app_menu.append(self.separator)
            self.separator.show()

        self.unmounted = gtk.MenuItem('Unmounted Partitions')
        self.unmounted_submenu = gtk.Menu()
        self.unmounted.set_submenu(self.unmounted_submenu)

        for i in self.get_unmounted_partitions():

            # TODO: add type checking, prevent swap

            part = "Partition: " + i[0]
            alias = self.find_alias(i[0])
            drive = "\nDrive: " + i[1]
            label = part + drive
            if alias: 
               alias = "\nAlias: " + alias
               label = part + alias + drive

            self.menu_item = gtk.MenuItem(label)
            self.menu_item.connect('activate',self.mount_partition,i[0])
            self.unmounted_submenu.append(self.menu_item)
            self.menu_item.show()

            self.separator = gtk.SeparatorMenuItem()
            self.unmounted_submenu.append(self.separator)
            self.separator.show()

        self.app_menu.append(self.unmounted)
        self.unmounted.show()


        self.separator = gtk.SeparatorMenuItem()
        self.app_menu.append(self.separator)
        self.separator.show()

        self.make_part_alias = gtk.MenuItem('Make Alias')
        self.make_part_alias.connect('activate',self.make_alias)
        self.app_menu.append(self.make_part_alias)
        self.make_part_alias.show()

        user_home = os.path.expanduser('~')
        desktop_file = '.config/autostart/udisks-indicator.desktop'
        full_path = os.path.join(user_home,desktop_file)

        label = 'Start Automatically' 
        if os.path.exists(full_path):
           label = label + ' \u2714'
        self.autostart = gtk.MenuItem(label)
        self.autostart.connect('activate',self.toggle_auto_startup)
        self.app_menu.append(self.autostart)
        self.autostart.show()

        self.open_gnome_disks = gtk.MenuItem('Open Disks Utility')
        self.open_gnome_disks.connect('activate',self.open_disks_utility)
        self.app_menu.append(self.open_gnome_disks)
        self.open_gnome_disks.show()

        self.quit_app = gtk.MenuItem('Quit')
        self.quit_app.connect('activate', self.quit)
        self.app_menu.append(self.quit_app)
        self.quit_app.show()

        self.app.set_menu(self.app_menu)

    def mount_partition(self,*args):
        # TODO: implement error checking for mounting
        return self.run_cmd(['udisksctl','mount','-b','/dev/' + args[-1]])

    def get_mountpoint_usage(self,mountpoint):
        fs = statvfs(mountpoint)
        usage = 100*(float(fs.f_blocks)-float(fs.f_bfree))/float(fs.f_blocks)
        return str("{0:.2f}".format(usage))

    def get_partitions(self):
        objects = self.get_dbus('system', 
                           'org.freedesktop.UDisks2', 
                           '/org/freedesktop/UDisks2', 
                           'org.freedesktop.DBus.ObjectManager',
                           'GetManagedObjects',
                           None)


        partitions = []
        for item in objects:
            try:
                if 'block_devices'  in str(item):


                       drive = self.get_dbus_property('system',
                                        'org.freedesktop.UDisks2',
                                        item,
                                        'org.freedesktop.UDisks2.Block',
                                        'Drive')
                       if drive == '/': continue

                       mountpoint = self.get_mountpoint(item)
                       if not mountpoint: continue
                       mountpoint = mountpoint.replace('\x00','')

                       drive = str(drive).split('/')[-1]
                       usage = self.get_mountpoint_usage(mountpoint)

                       part = str(item.split('/')[-1])
                       partitions.append((part,drive,mountpoint,usage))                       

            except Exception as e:
                #print(e)
                pass

        # returning list of tuples
        partitions.sort()
        return partitions

    def get_mountpoint(self,dev_path):
        try:
            data = self.get_dbus_property(
                             'system',
                             'org.freedesktop.UDisks2',
                             dev_path,
                             'org.freedesktop.UDisks2.Filesystem',
                             'MountPoints')[0]

        except Exception as e:
            #print(e)
            return None
        else:
            if len(data) > 0:
                return ''.join([ chr(byte) for byte in data])


    def get_unmounted_partitions(self):
        objects = self.get_dbus('system', 
                           'org.freedesktop.UDisks2', 
                           '/org/freedesktop/UDisks2', 
                           'org.freedesktop.DBus.ObjectManager',
                           'GetManagedObjects',
                           None)


        partitions = []
        for item in objects:
            try:
                if 'block_devices'  in str(item):
                       drive = self.get_dbus_property('system',
                                        'org.freedesktop.UDisks2',
                                        item,
                                        'org.freedesktop.UDisks2.Block',
                                        'Drive')
                       if drive == '/': continue

                       mountpoint = self.get_mountpoint(item)
                       if  mountpoint: continue

                       drive = str(drive).split('/')[-1]
                       part = str(item.split('/')[-1])
                       if not part[-1].isdigit(): continue
                       partitions.append((part,drive))                       
                       #print(partitions)

            except Exception as e:
                #print(e)
                pass

        partitions.sort()
        return partitions

    def get_dbus(self,bus_type,obj,path,interface,method,arg):
        if bus_type == "session":
            bus = dbus.SessionBus() 
        if bus_type == "system":
            bus = dbus.SystemBus()
        proxy = bus.get_object(obj,path)
        method = proxy.get_dbus_method(method,interface)
        if arg:
            return method(arg)
        else:
            return method()

    def get_dbus_property(self,bus_type,obj,path,iface,prop):

        if bus_type == "session":
           bus = dbus.SessionBus()
        if bus_type == "system":
           bus = dbus.SystemBus()
        proxy = bus.get_object(obj,path)
        aux = 'org.freedesktop.DBus.Properties'
        props_iface = dbus.Interface(proxy,aux)
        props = props_iface.Get(iface,prop)
        return props

    def make_alias(self,*args):
        partitions = [ i[0] for i in self.get_partitions() ]

        combo_values = '|'.join(partitions)
        #print(combo_values)
        command=[ 'zenity','--forms','--title','Make Alias',
                  '--add-combo','Partition','--combo-values',
                  combo_values,'--add-entry','Alias'    ]        
        user_input = self.run_cmd(command)
        if not user_input: return

        alias = user_input.decode().strip().split('|')

        existing_values = None

        if os.path.isfile(self.config_file):
            with open(self.config_file) as conf_file:
                try:
                    existing_values = json.load(conf_file)
                except ValueError:
                    pass


        with open(self.config_file,'w') as conf_file:
             if existing_values:
                 existing_values[alias[0]] = alias[1]
             else:
                 existing_values = {alias[0]:alias[1]}

             #print(existing_values)
             json.dump(existing_values,conf_file,indent=4,sort_keys=True)


    def find_alias(self,part):
        if os.path.isfile(self.config_file):
            with open(self.config_file) as conf_file:
                try:
                    aliases = json.load(conf_file)
                except ValueError:
                    pass
                else:
                    if part in aliases:
                       return aliases[part]
                    else:
                       return None

    def toggle_auto_startup(self,*args):
        user_home = os.path.expanduser('~')
        desktop_file = '.config/autostart/udisks-indicator.desktop'
        full_path = os.path.join(user_home,desktop_file)

        if os.path.exists(full_path):
           os.unlink(full_path)
        else:
           original = '/usr/share/applications/udisks-indicator.desktop'
           if os.path.exists(original):
               shutil.copyfile(original,full_path)

        self.make_menu()


    def open_mountpoint(self,*args):
        pid = subprocess.Popen(['xdg-open',args[-1]]).pid

    def open_disks_utility(self,*args):
        pid = subprocess.Popen(['gnome-disks']).pid

    def run_cmd(self, cmdlist):
        """ Reusable function for running external commands """
        new_env = dict(os.environ)
        new_env['LC_ALL'] = 'C'
        try:
            stdout = subprocess.check_output(cmdlist, env=new_env)
        except subprocess.CalledProcessError:
            pass
        else:
            if stdout:
                return stdout

    def run(self):
        """ Launches the indicator """
        try:
            gtk.main()
        except KeyboardInterrupt:
            pass

    def quit(self, data=None):
        """ closes indicator """
        gtk.main_quit()

def main():
    """ defines program entry point """
    indicator = UdisksIndicator()
    indicator.run()

if __name__ == '__main__':
    main()

le /usr/share/applications/udisks-indicator.desktop

[Desktop Entry]
Version=1.0
Name=Udisks Indicator
Comment=Indicator for reporting partition information
Exec=udisks-indicator
Type=Application
Icon=drive-harddisk-symbolic.svg
Terminal=false

Information additionnelle:

Test Ubuntu Mate 16.04:

entrez la description de l'image ici

Les utilisateurs de Gnome ont besoin d'une extension (prise en charge de KStatusNotifierItem / AppIndicator) pour que l'indicateur se comporte correctement:

entrez la description de l'image ici

Sergiy Kolodyazhnyy
la source
1
Peut confirmer. Cela fonctionne avec Xfce4. Bien fait! =)
Terrance
@Terrance au cas où vous voudriez récupérer la dernière version, voir la mise à jour de la réponse. Zach a déjà testé sur son Xfce aussi, a déclaré que cela fonctionne
Sergiy Kolodyazhnyy
Cool! Merci de me l'avoir dit. Je vais lui faire un tourbillon. =) Mise à jour: semble vraiment bien, et j'aime les changements d'icônes que vous y avez apportés. Bien joué! =)
Terrance
+1 mais devrait signaler que "le PPA arrive bientôt" pourrait être supprimé maintenant?
WinEunuuchs2Unix
@ WinEunuuchs2Unix Oui, peut être supprimé. Cette réponse et cet indicateur lui-même ont besoin d'une mise à jour géante, mais pas le temps pour cela récemment
Sergiy Kolodyazhnyy
4

Installez l' indicateur Sysmonitor :

sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor

et il a l'option "Espace disponible dans le système de fichiers".

Bernmeister
la source
1

Il existe une autre réponse en utilisant l' indicateur Sysmonitor de base, mais vous pouvez créer votre propre panneau personnalisé avec autant d'informations que vous le souhaitez.

Google (enfin cherchez au moins) est votre ami

La première étape consiste à comprendre comment calculer le pourcentage d'utilisation de la partition :

$ percentage=($(df -k --output=pcent /dev/sda1))
$ echo "${percentage[1]}"
13%

Créer un script bash pour faire écho au panneau

Voici un script bash à utiliser comme option "personnalisée" dans Sysmonitor Indicator . Il affichera le pourcentage utilisé sur les trois premières partitions sur /dev/sda:

#!/bin/bash
echo "sda1: "
percentage=($(df -k --output=pcent /dev/sda1))
echo "${percentage[1]}"
echo " | sda2: "
percentage=($(df -k --output=pcent /dev/sda2))
echo "${percentage[1]}"
echo " | sda3: "
percentage=($(df -k --output=pcent /dev/sda3))
echo "${percentage[1]}"

Exemple de sortie

Lors de l'exécution, il ressemblera à ceci:

indicateur systmonitor example.png

Installer et configurer des scripts personnalisés dans Sysmonitor Indicator

Pour obtenir des instructions détaillées sur l'installation de Sysmonitor Indicator et l'attribution d'un script personnalisé, consultez cette réponse: BASH peut-il s'afficher dans systray comme indicateur d'application?

WinEunuuchs2Unix
la source
Belle solution. Bien que cela puisse devenir long avec un grand nombre de partitions et de périphériques
Sergiy Kolodyazhnyy