Indicador de uso del sistema de archivos

10

No puedo encontrar una utilidad adecuada que solo indique el uso del sistema de archivos (% de espacio libre para particiones) en el panel.

Y no tengo ganas de instalar ningún tipo malo de herramienta de administración de escritorio, sino un simple indicador.

Agradezco todas tus sugerencias.

Dinesh Kalidassan
fuente
Eso se puede implementar. ¿Cómo quieres que se vea? ¿Solo dividir el nombre del dispositivo como /dev/sdb1y su uso justo al lado? ¿En porcentaje o gigabytes reales?
Sergiy Kolodyazhnyy
Preferiría un nombre personalizado y% gratis para todas las particiones del disco duro y cuando conecte el disco duro externo o el almacenamiento usb.
Dinesh Kalidassan
¿Puedes explicar qué quieres decir con nombre personalizado? también quieres nombrar las unidades?
Sergiy Kolodyazhnyy
Me gustaría referirme a / dev / sdb1 como "Crítico" o "Entretenimiento" u "Oficial", etc.,
Dinesh Kalidassan,
2
Hola Dinesh, si alguna de las respuestas que da lo que estaba buscando (en general), que podría aceptarlo. Noté en tu perfil que no aceptaste una respuesta antes, es posible que no estés familiarizado con ella. Si (cualquiera) de las respuestas resuelve su problema, ¿consideraría aceptarlo? (Marque la V grande debajo de las flechas arriba / abajo al lado de la respuesta).
Jacob Vlijm el

Respuestas:

19

EDITAR:

1. NUEVA RESPUESTA

Si bien la respuesta en la parte inferior de esta se puede usar (ver [2.]), conduce a una ppaversión con opciones adicionales, que se configurará en una ventana de preferencias.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Las opciones incluyen:

  • Establecer todos los alias en una ventana
  • Establecer colores de tema para el icono del panel:

    ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquíingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

  • Establecer umbral para advertencias
  • Mostrar información sobre volúmenes recién montados / conectados en una notificación:

    ingrese la descripción de la imagen aquí

  • Corre al empezar

Además, el indicador ahora incluye un conjunto de iconos más pequeño (ancho) para otras distribuciones (como xfce), que se aplicará automáticamente, dependiendo del administrador de ventanas.

ingrese la descripción de la imagen aquí

Instalar:

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



2. ANTIGUA RESPUESTA

El siguiente script es un indicador que enumera sus dispositivos y muestra su uso. La información se actualiza (si es necesario) una vez cada diez segundos.

ingrese la descripción de la imagen aquí

además

  • Mientras el indicador se está ejecutando, puede elegir un dispositivo para representarlo en el icono. El dispositivo será recordado la próxima vez que ejecute el indicador:

    ingrese la descripción de la imagen aquí

    ! [ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

  • Para uno o más (o todos) dispositivos, puede establecer un nombre alternativo ("nombre personalizado"), que se establecerá en el encabezado del script

    Como ejemplo, esto:

    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"],
        ]

    Mostrará:

    ingrese la descripción de la imagen aquí

  • Puedes establecer un umbral ; si el espacio libre de cualquiera de sus dispositivos está por debajo de eso, recibirá una advertencia:

    ingrese la descripción de la imagen aquí

  • Los dispositivos conectados / desconectados se agregarán / eliminarán del menú en 10 segundos.

La secuencia de comandos

#!/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()

Los iconos

ingrese la descripción de la imagen aquí 0.png

ingrese la descripción de la imagen aquí 1.png

ingrese la descripción de la imagen aquí 2.png

ingrese la descripción de la imagen aquí 3.png

ingrese la descripción de la imagen aquí 4.png

ingrese la descripción de la imagen aquí 5.png

ingrese la descripción de la imagen aquí 6.png

ingrese la descripción de la imagen aquí 7.png

ingrese la descripción de la imagen aquí 8.png

ingrese la descripción de la imagen aquí 9.png

ingrese la descripción de la imagen aquí 10.png

Configuración

La configuración es simple:

  • Copie el script en un archivo vacío, guárdelo como showusage.py
  • Guarde los iconos de arriba, exactamente nombrados como en su etiqueta , en uno y el mismo directorio que el script (clic derecho> Guardar como)
  • En la sección principal del script, establezca (posibles) nombres alternativos ( aliasses). Debajo de un ejemplo:

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

    Si desea mostrar los dispositivos sin cambios, use:

    alias = []

    ... y si lo desea, cambie el umbral para mostrar una advertencia:

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

    Eso es

Corriendo

Para usar el indicador, ejecute el comando:

python3 /path/to/showusage.py

Para agregarlo a las aplicaciones de inicio, use el comando:

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

Elija Aplicaciones: Tablero> Aplicaciones de inicio> Agregar, agregue el comando anterior.

Jacob Vlijm
fuente
16

descargo de responsabilidad: soy autor de este indicador y está escrito para esta pregunta específica

Actualización oct 23,2018

El indicador ahora admite el listado de recursos compartidos de red . Gracias a mihaigalos

Actualización 29 de octubre de 2016

El indicador ahora tiene una funcionalidad desmontable y los alias se han hecho únicos al referirse al UUID de cada partición en lugar del nombre del dispositivo de bloque como sda1. Ver el informe de error relacionado

Actualización, Oct 8,2016

El indicador ahora está en la versión 2.0, ha agregado algunas características y tiene su propio PPA.

Para instalar desde PPA, siga los siguientes pasos en la terminal:

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

Como se menciona en las notas de la versión, las características incluyen:

  • Iconos para entradas de menú: cada partición / dispositivo tiene un icono apropiado adjunto. Si el dispositivo es un disco usb, se usa un ícono de medios extraíbles, si es una imagen iso, se usa el ícono del disco óptico y obviamente las particiones del disco duro / SSD tienen íconos de unidad.
  • El uso ahora se muestra en porcentajes y valores legibles por humanos (potencias de 1024).
  • Representación gráfica del uso a través de la barra de uso (muchas gracias a Mateo Salta por la idea)
  • Diálogo de preferencias: los usuarios pueden desactivar ciertos campos que no desean ver por cada entrada de menú. Esto permite mantener limpio el menú del indicador si hay una gran cantidad de particiones adjuntas. (Gracias a la solicitud de Zacharee)
  • Espaciado de texto: con la fuente predeterminada de Ubuntu y las fuentes Monospace, las entradas de texto están bien espaciadas para tener un aspecto más limpio y mejorar la legibilidad de la información.
  • Las burbujas de notificación en caso de que la partición no se pueda montar

A continuación se muestra la captura de pantalla con el tema de icono predeterminado de Ubuntu: ingrese la descripción de la imagen aquí

Tema del icono de Ubuntu Kylin

ingrese la descripción de la imagen aquí

Con todos los campos opcionales desactivados

ingrese la descripción de la imagen aquí

Opciones de diseño y pensamientos adicionales:

Al hacer este indicador, esperaba lograr una utilidad que fuera adecuada tanto para usuarios avanzados como para usuarios casuales. Traté de abordar algunos de los problemas que noté que los nuevos usuarios pueden tener al manejar las herramientas de línea de comandos. Además, la utilidad se esfuerza por ser multipropósito.

El cuadro de diálogo Preferencias permite hacer que el indicador sea tan complejo y / o tan simple como lo desee el usuario. También fue una decisión de diseño específica evitar tener una etiqueta en el panel superior para que no ocupe demasiado espacio del panel superior del usuario. Además, este indicador se esfuerza por ser una utilidad multipropósito que permite montar particiones y abrir sus respectivos directorios. Esto puede usarse no solo como utilidad de uso del disco, sino también como utilidad de navegación para abrir rápidamente los directorios.

También es conveniente para los usuarios saber qué partición habita en qué disco, evitando así la confusión frecuente con el montaje a través de utilidades de línea de comandos como mount. En su lugar, emplea udisksctlpara ese propósito (además de obtener la información del UDisks2demonio, de ahí el nombre). La única tarea que no realiza es desmontar y, por este motivo Open Disks Utility, se incluye la entrada del menú.

Si bien originalmente me esforcé por hacerlo similar al menúlet de iStat, el proyecto se apartó de este objetivo: el indicador es único en su diseño y propósito. Espero que sea útil para muchos usuarios y que su experiencia con Ubuntu sea mucho más placentera.


indicador de udiscos (respuesta original)

Indicador para Ubuntu con escritorio de Unity para mostrar el uso del disco Captura de pantalla de muestra

Visión de conjunto

Este indicador para Ubuntu con Unity permite ver fácilmente información sobre sus particiones montadas. Se esfuerza por ser visualmente similar al menúlet iStat Menú 3 de OS X.

Las entradas se organizan en orden:

  • Dividir
  • Alias ​​(si lo establece el usuario)
  • Unidad de disco a la que pertenece la partición
  • Punto de montaje de la partición (directorio)
  • % De uso

Al hacer clic en cada entrada de partición, se abrirá el punto de montaje de la partición en el administrador de archivos predeterminado

El menú "Particiones desmontadas" enumera todas las particiones no montadas actualmente por el sistema. Al hacer clic en cualquier entrada de ese submenú, la partición se montará automáticamente, generalmente en la /media/username/drive-idcarpeta

El indicador utiliza íconos predeterminados provistos con el sistema, por lo que el ícono debería cambiar a medida que cambia el tema del ícono utilizando la herramienta Unity Tweak Tool u otros métodos

NOTA : si desea agregar varios alias al mismo tiempo, en lugar de uno por uno a través de la opción "Crear alias", puede hacerlo editando el ~/.partition_aliases.jsonarchivo de configuración. El formato es el siguiente:

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

Instalación

PPA para una fácil instalación próximamente. . .

Mientras tanto, aquí hay pasos alternativos:

  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

Todos estos pasos se pueden poner en un pequeño script de instalación:

#!/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

Código fuente

El código fuente original (Versión v1.0) con la funcionalidad básica de este indicador se puede encontrar a continuación. Para conocer las funciones más recientes, consulte el repositorio de GitHub para este proyecto . Informe cualquier solicitud de función, así como errores en GitHub.

El /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()

los /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

Información adicional:

Prueba de Ubuntu Mate 16.04:

ingrese la descripción de la imagen aquí

Los usuarios de Gnome necesitan una extensión (KStatusNotifierItem / AppIndicator Support) para que el indicador se comporte correctamente:

ingrese la descripción de la imagen aquí

Sergiy Kolodyazhnyy
fuente
1
Puede confirmar. Esto funciona con Xfce4. ¡Bien hecho! =)
Terrance
@Terrance en caso de que desee obtener la versión más reciente, consulte la actualización de la respuesta. Zach ya probó en su Xfce también, dijo que funciona
Sergiy Kolodyazhnyy, el
¡Frio! Gracias por hacérmelo saber. Le daré un giro. =) Actualización: se ve muy bien y me gustan los cambios en el icono que le hiciste. ¡Bien hecho! =)
Terrance
¿+1 pero debería señalar que "PPA viene pronto" podría eliminarse ahora?
WinEunuuchs2Unix
@ WinEunuuchs2Unix Sí, se puede eliminar. Esta respuesta e indicador en sí necesitan una actualización gigante, pero no hay tiempo para eso últimamente
Sergiy Kolodyazhnyy,
4

Instale el indicador de Sysmonitor :

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

y tiene la opción "Espacio disponible en el sistema de archivos".

Bernmeister
fuente
1

Hay otra respuesta usando el indicador básico de Sysmonitor, pero puede crear su propio panel personalizado con toda la información que desee.

Google (al menos, busca) es tu amigo

El primer paso es descubrir cómo calcular el porcentaje de uso de la partición :

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

Crear script bash para hacer eco al panel

Aquí hay un script bash para usar como opción "personalizada" en Sysmonitor Indicator . Mostrará el porcentaje utilizado en las primeras tres particiones en /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]}"

Salida de muestra

Cuando se ejecute se verá así:

indicador systmonitor example.png

Instalar y configurar scripts personalizados en Sysmonitor Indicator

Para obtener instrucciones detalladas sobre cómo instalar Sysmonitor Indicator y asignar un script personalizado, consulte esta respuesta: ¿Puede BASH mostrarse en la bandeja del sistema como indicador de la aplicación?

WinEunuuchs2Unix
fuente
Solución encantadora. Aunque podría alargarse con una gran cantidad de particiones y dispositivos
Sergiy Kolodyazhnyy