Індикатор використання файлової системи


10

Я не можу знайти відповідну утиліту, щоб просто вказати на використання файлової системи (% вільного місця для розділів) на панелі.

І я не з нетерпінням чекаю встановлення будь-яких поганих інструментів управління робочим столом, а простого показника.

Я ціную всі ваші пропозиції.


Це можна реалізувати. Як ви хочете, щоб це виглядало? Просто назва пристрою розділу /dev/sdb1та його використання прямо поруч із ним? У відсотках чи фактичних гігабайти?
Сергій Колодяжний

Я б більше віддав перевагу власному імені та% free для всіх розділів жорсткого диска та коли я підключаю xternal HDD або usb storage.
Дінеш Калідасан

Чи можете ви пояснити, що ви маєте на увазі під власною назвою? Ви також хочете назвати накопичувачі?
Сергій Колодяжний

Мені хотілося б позначити / 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

Щоб додати його до програм запуску, скористайтеся командою:

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

Виберіть Програми: тире> програми запуску> Додати, додайте команду вище.


16

відмова від відповідальності: Я є автором цього показника, і він написаний для цього конкретного питання

Оновлення 23 жовтня 2018 року

Індикатор тепер підтримує лістинг акції мережі . Завдяки mihaigalos

Оновлення 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-диск, використовується значок знімного носія, якщо це ізо-зображення - використовується значок оптичного диска, і, очевидно, на розділах жорсткого диска / SSD є піктограми накопичувача.
  • Тепер використання показано у відсотковому та читаному для людини значеннях (потужність 1024).
  • Графічне зображення використання за допомогою панелі використання (велике спасибі Матео Сальті за ідею)
  • Діалогове вікно налаштувань: користувачі можуть вимкнути певні поля, які вони не хочуть бачити для кожної записи меню. Це дозволяє підтримувати меню індикатора в чистоті, якщо додається велика кількість розділів. (Завдяки проханню Захарі)
  • Текстовий інтервал: з шрифтом Ubuntu за замовчуванням та шрифтами Monospace, текстові записи добре розташовані, щоб мати більш чистий вигляд та підвищити читабельність інформації.
  • Пухирці повідомлень у випадку, якщо перегородку неможливо встановити

Нижче наведено скріншот із темою значка Ubuntu за замовчуванням: введіть тут опис зображення

Тема значка Ubuntu Kylin

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

Якщо всі необов’язкові поля вимкнено

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

Вибір дизайну та додаткові думки:

Створюючи цей показник, я сподівався досягти утиліти, яка б підходила як для досвідчених, так і для випадкових користувачів. Я спробував вирішити деякі проблеми, які я помітив у нових користувачів, можливо, в роботі з інструментами командного рядка. Крім того, утиліта прагне бути багатоцільовою.

Діалогове вікно "Налаштування" дозволяє зробити індикатор таким же складним та / або таким же простим, як бажає користувач. Це також було конкретним дизайнерським рішенням, щоб уникнути наявності етикетки на верхній панелі, щоб вона не займала занадто багато місця на верхній панелі користувача. Крім того, цей індикатор прагне бути багатоцільовою утилітою, яка дозволяє монтувати розділи, а також відкривати відповідні каталоги. Це може використовуватися не тільки як утиліта використання диска, але і як утиліта навігації для швидкого відкриття каталогів.

Користувачам також зручно знати, який розділ мешкає на якому диску, тим самим уникаючи частого плутанини з монтажем через утиліти командного рядка, такі як mount. Натомість він використовує udisksctlдля цієї мети (а також отримання інформації від UDisks2демона, звідси і названня). Єдине завдання, яке воно не виконує, - це відключення, або через Open Disks Utilityце включена запис у меню.

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


удиски-індикатор (оригінальна відповідь)

Індикатор для Ubuntu з робочим столом Unity для показу використання диска Знімок екрана

Огляд

Цей показник для Ubuntu з Unity дозволяє легко переглядати інформацію про встановлені розділи. Він прагне бути візуально схожим на меню iStat Menu 3 меню OS X.

Записи організовані в порядку:

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

Натиснувши на кожен запис розділу, ви відкриєте точку кріплення розділу в файловому менеджері за замовчуванням

У меню "Відключені розділи" перелічені всі розділи, які наразі не змонтовані системою. Натиснувши на будь-який запис у цьому підменю, автоматично підключите цей розділ, як правило, у /media/username/drive-idпапку

Індикатор використовує піктограми за замовчуванням, що надаються в системі, тому піктограму слід змінювати, змінюючи тему піктограми за допомогою інструменту "Інструмент настроювання"

ПРИМІТКА . Якщо ви хочете додати одночасно кілька псевдонімів, замість одного за одним за допомогою опції "Зробити псевдонім", це можна зробити за допомогою редагування ~/.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()

The /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), щоб індикатор поводився належним чином:

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


1
Можна підтвердити. Це працює з Xfce4. Чудово зроблено! =)
Терранс

@Terrance у випадку, якщо ви хочете схопити нову версію, дивіться оновлення відповіді. Зах вже тестував свій Xfce, сказав, що це працює
Сергій Колодяжний

Класно! Дякую, що повідомили. Я дам йому кружляння. =) Оновлення: виглядає дуже добре, і мені подобаються зміни, які ви внесли до цього значка. Молодці! =)
Терранс

+1, але чи слід зазначити, що "PPA незабаром" може бути видалено зараз?
WinEunuuchs2Unix

@ WinEunuuchs2Unix Так, можна видалити. Ця відповідь і індикатор потребують великого оновлення, але останнім часом для цього немає часу
Сергій Колодяжний


1

Є ще одна відповідь, використовуючи базовий індикатор Sysmonitor, але ви можете створити власну власну панель з якомога більше інформації.

Google (добре шукайте хоча б) - ваш друг

Перший крок - з’ясувати, як обчислити відсоток використання розділів :

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

Створіть bash-скрипт, щоб відлуння на панелі

Ось сценарій bash, який слід використовувати як "нестандартний" варіант в Sysmonitor Indicator . Він покаже відсоток, використаний у перших трьох розділах на /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]}"

Вибірка зразка

Під час запуску це буде виглядати приблизно так:

індикатор систмонітора example.png

Встановити та налаштувати власні сценарії в Індикатор Sysmonitor

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


Прекрасне рішення. Хоча, можливо, буде багато часу з великою кількістю розділів і пристроїв
Сергій Колодяжний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.