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

10

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

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

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

Динеш Калидассан
источник
Это может быть реализовано. Как вы хотите, чтобы это выглядело? Просто разделить имя устройства, как /dev/sdb1и его использование прямо рядом с ним? В процентах или фактических гигабайтах?
Сергей Колодяжный
Я бы предпочел использовать произвольное имя и% free для всех разделов жесткого диска, а также при подключении внешнего жесткого диска или USB-накопителя.
Динеш Калидассан
Можете ли вы объяснить, что вы подразумеваете под нестандартным именем? ты тоже хочешь назвать диски?
Сергей Колодяжный
Я хотел бы обозначить / dev / sdb1 как «Критический», «Развлечения», «Официальный» и т. Д.,
Динеш Калидассан,
2
Привет Динеш, если любой из ответов даст вам то, что вы искали (в целом), вы можете принять это. Я заметил, что в вашем профиле вы не приняли ответ раньше, возможно, вы не знакомы с ним. Если (любой) один из ответов решит вашу проблему, вы бы приняли его? (Отметьте большой V под стрелками вверх / вниз рядом с ответом).
Джейкоб Влейм

Ответы:

19

РЕДАКТИРОВАТЬ:

1. НОВЫЙ ОТВЕТ

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

введите описание изображения здесь

введите описание изображения здесь

Варианты включают в себя:

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

    введите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесь

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

    введите описание изображения здесь

  • Выполняться при запуске

Кроме того, индикатор теперь включает в себя меньший (ширина) значок, установленный для других дистрибутивов (например, 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"],
        ]

    Покажет:

    введите описание изображения здесь

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

    введите описание изображения здесь

  • Подключенные / отключенные устройства будут добавлены / удалены из списка в течение 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
  • Сохраните значки выше, точно названные как на их ярлыке , в один и тот же каталог, что и скрипт (щелкните правой кнопкой мыши> Сохранить как)
  • В заголовке скрипта задайте (возможные) альтернативные имена ( 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

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

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

Выберите Applications: Dash> Startup Applications> Add, добавьте команду выше.

Якоб Влейм
источник
16

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

Обновление 23 октября 2016

Теперь индикатор поддерживает листинг сетевых акций . Благодаря Михайгалосу

Обновление 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 значок темы

введите описание изображения здесь

С выключенными всеми необязательными полями

введите описание изображения здесь

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

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

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

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

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


индикатор-индикатор (оригинальный ответ)

Индикатор для Ubuntu с рабочим столом Unity, показывающий использование диска Образец скриншота

обзор

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

Записи организованы в порядке:

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

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

В меню «Размонтированные разделы» перечислены все разделы, которые в данный момент не смонтированы системой. Нажав на любую запись в этом подменю, вы автоматически подключите этот раздел, как правило, к/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.

The /usr/bin/udisks-indicator:

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

#
# Author: Serg Kolo , contact: 1047481448@qq.com
# 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), чтобы индикатор работал правильно:

введите описание изображения здесь

Сергей Колодяжный
источник
1
Могу подтвердить. Это работает с Xfce4. Красиво сделано! =)
Терренс
@Terrance, если вы хотите получить самую новую версию, смотрите обновление к ответу. Зак уже тестировал на своем Xfce, сказал, что он работает
Сергей Колодяжный,
Прохладно! Спасибо, что сообщили мне об этом. Я приведу это в движение. =) Обновление: выглядит действительно хорошо, и мне нравятся изменения в иконках, которые вы внесли в него. Отлично сработано! =)
Терренс
+1, но следует отметить, что «PPA скоро появится» может быть удалено сейчас?
WinEunuuchs2Unix
@ WinEunuuchs2Unix Да, можно удалить. Этот ответ и сам индикатор нуждаются в гигантском обновлении, но в последнее время на это нет времени
Сергей Колодяжный
4

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

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

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

Bernmeister
источник
1

Есть другой ответ, использующий базовый индикатор Sysmonitor. но вы можете создать свою собственную панель с таким количеством информации, сколько захотите.

Google (по крайней мере, поиск) - ваш друг

Первый шаг - выяснить, как рассчитать процент использования раздела :

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

Создать скрипт bash для отображения на панели

Вот скрипт bash для использования в качестве «пользовательского» параметра в индикаторе Sysmonitor . Он покажет процент, использованный в первых трех разделах /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]}"

Образец вывода

При запуске это будет выглядеть так:

индикатор systmonitor example.png

Установите и настройте пользовательские скрипты в индикаторе Sysmonitor

Подробные инструкции по установке индикатора Sysmonitor и назначению пользовательского сценария см. В следующем ответе: может ли BASH отображаться в systray в качестве индикатора приложения?

WinEunuuchs2Unix
источник
Прекрасное решение. Хотя может быть
Сергей Колодяжный