Индикатор использования файловой системы

10

Я не могу найти подходящую утилиту, чтобы просто указать использование файловой системы (% свободного пространства для разделов) на панели.

И я не ожидаю установки каких-либо плохих видов инструментов управления рабочим столом, но простой индикатор.

Я ценю все ваши предложения.

    
задан Dinesh Kalidassan 26.09.2016 в 06:18
источник

3 ответа

18

EDIT:

1. NEW ANSWER

В то время как ответ в нижней части этого может быть использован (см. [2.] ), это приведет к ppa -версии с дополнительными параметрами, которые будут установлены в окне настроек.

Параметры включают:

  • Настройка всех псевдонимов в одном окне
  • Настройка цвета темы для значка панели:

    < a href="https://i.stack.imgur.com/t3jTm.png">

  • Установочный порог для предупреждений
  • Показывать информацию о вновь смонтированных / подключенных томах в уведомлении:

  • Запуск при запуске

Кроме того, индикатор теперь включает в себя меньший (ширина) значок, установленный для других дистрибутивов (например, xfce), который будет автоматически применяться в зависимости от диспетчера окон.

Для установки:

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


2. СТАРЫЙ ОТВЕТ

Ниже приведен скрипт, который показывает ваши устройства и показывает их использование. Информация обновляется (если необходимо) один раз в десять секунд.

Далее

  • Пока индикатор работает, вы можете выбрать устройство, которое будет представлено в значке. Устройство будет запоминаться при следующем запуске индикатора:

  • Для одного или нескольких (или всех) устройств вы можете установить альтернативное имя («настраиваемое имя»), которое должно быть установлено в начале скрипта

    В качестве примера:

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

    Покажет:

  • Вы можете установить threshhold ; если свободное место на одном из ваших устройств ниже этого, вы получите предупреждение:

  • Подключаемые / не подключенные устройства будут добавлены / удалены из меню в течение 10 секунд.

Скрипт

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

Значки

0.png

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

Настройка

Настройка проста:

  • Скопируйте сценарий в пустой файл, сохраните его как showusage.py
  • Сохраните значки выше, , точно названные как в их метке , в один и тот же каталог, что и скрипт (щелкните правой кнопкой мыши & gt; Сохранить как)
  • В headset скрипта установите (возможно) альтернативные имена ( aliasses ). Ниже пример:

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

    Если вы хотите отображать устройства без изменений, используйте:

    alias = []
    

    ...и если вы хотите, измените порог, чтобы показать предупреждение:

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

    Это он

Запуск

Чтобы использовать индикатор, запустите команду:

python3 /path/to/showusage.py

Чтобы добавить его в приложения для запуска, используйте команду:

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

Выберите Приложения: Dash & gt; Приложения для запуска & gt; Добавьте, добавьте команду выше.

    
ответ дан Jacob Vlijm 26.09.2016 в 18:17
источник
13

отказ от ответственности: я являюсь автором этого показателя, и он написан для этого конкретного вопроса

Обновление 29 октября 2016 г.

Теперь индикатор имеет функцию размонтирования, а псевдонимы были сделаны уникальными, обратившись к UUID каждого раздела, а не к имени блока устройства, например, sda1 . См. отчет об ошибках

Обновление, октябрь 8,2016

Индикатор теперь находится в версии 2.0, добавил несколько функций и имеет свой собственный PPA.

Чтобы установить из PPA, выполните следующие шаги в терминале:

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

Как упоминалось в примечаниях к выпуску , функции включают в себя:

  • Значки для записей меню: каждый раздел / устройство имеет соответствующий значок, прикрепленный к нему. Если устройство является USB-диском, используется значок съемного носителя, если это iso-образ - используется значок оптического диска, и, очевидно, на жестком диске / SSD-разделах есть значки дисков.
  • Теперь использование показано в процентах и ​​значениях для чтения человеком (мощность 1024).
  • Графическое представление использования через панель использования (большое спасибо Mateo Salta за идею)
  • Диалог настроек: пользователи могут отключать определенные поля, которые они не хотят видеть по каждой записи в меню. Это позволяет сохранять меню индикаторов в чистоте, если имеется большое количество разделов. (По просьбе Захари)
  • Интервал между текстами: с шрифтами шрифта Ubuntu по умолчанию и шрифтами Monospace, текстовые записи прекрасно расположены, чтобы иметь более чистый вид и улучшать читаемость информации.
  • Буферы уведомлений в случае невозможности установки раздела

Ниже приведен скриншот с иконок по умолчанию Ubuntu:

Тема иконок Ubuntu Kylin

При выключении всех необязательных полей

Выбор дизайна и дополнительные мысли:

При создании этого индикатора я надеялся достичь полезности, которая была бы подходящей как для продвинутых, так и для случайных пользователей. Я попытался решить некоторые из проблем, которые, как я заметил, могут иметь новые пользователи с обработкой инструментов командной строки. Кроме того, утилита стремится быть многофункциональной.

Диалоговое окно «Настройки» позволяет сделать индикатор сложным и / или простым, как пожелает пользователь. Это было также конкретное дизайнерское решение, чтобы избежать ярлыка на верхней панели, чтобы он не занимал слишком много места на верхней панели пользователя. Кроме того, этот показатель стремится быть многофункциональной утилитой, которая позволяет устанавливать разделы, а также открывать их соответствующие каталоги. Это можно использовать не только как утилиту для использования диска, но и как навигационную утилиту для быстрого открытия каталогов.

Также пользователям удобнее знать, какой раздел занимает этот диск, что позволяет избежать частых путаниц с установкой с помощью утилит командной строки, таких как mount . Вместо этого для этой цели используется udisksctl (а также получение информации от UDisks2 daemon, следовательно, именование). Единственная задача, которую он не выполняет, - это размонтировать, и по этой причине включена запись меню Open Disks Utility .

В то время как первоначально я стремился сделать его похожим на iStat menulet, проект отклонился от этой цели - индикатор уникален в своем дизайне и цели. Я надеюсь, что это будет полезно для многих пользователей и сделает их Ubuntu намного приятнее.

udisks-indicator (исходный ответ)

Индикатор для Ubuntu с рабочим столом Unity для демонстрации использования диска

Обзор

Этот индикатор для Ubuntu с Unity позволяет легко просматривать информацию о ваших смонтированных разделах. Он стремится быть визуально подобным меню iStat Menu 3 из OS X.

Записи упорядочены по порядку:

  • Раздел
  • Псевдоним (если он установлен пользователем)
  • Дисковод, к которому принадлежит раздел
  • Точка монтирования раздела (каталога)
  • % Использование

Щелчок по каждой записи раздела откроет точку монтирования раздела в файловом менеджере по умолчанию

В меню «Unmounted Partitions» перечислены все разделы, которые в данный момент не установлены системой.Щелчок по любой записи в этом подменю автоматически установит этот раздел, обычно в папку /media/username/drive-id

Индикатор использует значки по умолчанию, поставляемые с системой, поэтому значок должен меняться при изменении темы значка с помощью инструмента Unity Tweak Tool или других методов.

ПРИМЕЧАНИЕ . Если вы хотите добавить несколько псевдонимов одновременно, а не один за другим с помощью опции «Сделать псевдоним», вы можете сделать это, отредактировав файл конфигурации ~/.partition_aliases.json . Формат выглядит следующим образом:

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

Установка

PPA для легкой установки скоро появится. , .

В то же время, вот альтернативные шаги:

  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

Все эти шаги можно поместить в красивый небольшой скрипт установки:     

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

Исходный код

Оригинальный исходный код (версия v1.0) с базовыми функциями этого индикатора можно найти ниже. Для новейших функций проверьте репозиторий GitHub для этого проекта . Сообщайте о любых запросах на функции, а также о ошибках в GitHub.

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

/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

Дополнительная информация:

Тест Ubuntu Mate 16.04:

Пользователям Gnome необходимо расширение (KStatusNotifierItem / AppIndicator Support), чтобы индикатор корректно отображался:

    

ответ дан Sergiy Kolodyazhnyy 28.09.2016 в 01:00
4

Установите Индикатор Sysmonitor :

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

, и у него есть опция «Доступное пространство в файловой системе».

    
ответ дан Bernmeister 26.09.2016 в 12:56