Haftungsausschluss: Ich bin Autor dieses Indikators und er wurde für diese spezielle Frage geschrieben
Update 23. Oktober 2008
Der Indikator unterstützt jetzt das Auflisten von Netzwerkfreigaben . Danke an mihaigalos
Update 29. Oktober 2016
Der Indikator verfügt jetzt über Funktionen zum Aufheben der Bereitstellung, und Aliase wurden eindeutig gemacht, indem auf die UUID jeder Partition verwiesen wurde, anstatt auf den Namen des Blockgeräts, z sda1
. Siehe den zugehörigen Fehlerbericht
Update, 8. Oktober 2016
Der Indikator ist jetzt in Version 2.0, hat einige Funktionen hinzugefügt und verfügt über eine eigene PPA.
Führen Sie zur Installation von PPA die folgenden Schritte im Terminal aus:
sudo apt-add-repository ppa:udisks-indicator-team/ppa
sudo bash -c 'apt-get update && apt-get install udisks-indicator'
Wie in den Versionshinweisen erwähnt, umfassen die Funktionen:
- Symbole für Menüeinträge: An jede Partition / jedes Gerät ist ein entsprechendes Symbol angehängt. Wenn es sich bei dem Gerät um eine USB-Festplatte handelt, wird das Symbol für Wechselmedien verwendet. Wenn es sich um ein ISO-Image handelt, wird das Symbol für die optische Festplatte verwendet, und offensichtlich haben Festplatten- / SSD-Partitionen Laufwerkssymbole.
- Die Verwendung wird jetzt in Prozent und für Menschen lesbaren Werten (Potenzen von 1024) angezeigt.
- Grafische Darstellung der Nutzung über die Nutzungsleiste (ein großes Dankeschön an Mateo Salta für die Idee)
- Dialogfeld "Einstellungen": Benutzer können bestimmte Felder deaktivieren, die sie nicht für jeden Menüeintrag sehen möchten. Auf diese Weise können Sie das Anzeigemenü sauber halten, wenn eine große Anzahl von Partitionen angeschlossen ist. (Dank Zacharees Bitte)
- Textabstand: Mit den Standardschriftarten Ubuntu und Monospace sind die Texteinträge gut verteilt, um ein saubereres Erscheinungsbild zu erzielen und die Lesbarkeit der Informationen zu verbessern.
- Benachrichtigungsblasen für den Fall, dass die Partition nicht bereitgestellt werden kann
Unten ist der Screenshot mit dem Standard-Ubuntu-Symbolthema:
Ubuntu Kylin Symbol Thema
Wenn alle optionalen Felder deaktiviert sind
Designentscheidungen und zusätzliche Gedanken:
Bei der Erstellung dieses Indikators hoffte ich auf ein Dienstprogramm, das sowohl für fortgeschrittene als auch für gelegentliche Benutzer geeignet ist. Ich habe versucht, einige der Probleme zu beheben, die den neuen Benutzern beim Umgang mit Befehlszeilentools aufgefallen sind. Darüber hinaus strebt das Dienstprogramm eine Mehrzweckfunktion an.
Im Dialogfeld "Einstellungen" können Sie den Indikator so komplex und / oder so einfach gestalten, wie es der Benutzer wünscht. Es war auch eine spezielle Designentscheidung, zu vermeiden, dass sich im oberen Bereich ein Etikett befindet, damit nicht zu viel Platz im oberen Bereich des Benutzers beansprucht wird. Darüber hinaus ist dieser Indikator ein Mehrzweckdienstprogramm, mit dem Partitionen gemountet und ihre jeweiligen Verzeichnisse geöffnet werden können. Dies kann nicht nur als Dienstprogramm zur Datenträgernutzung verwendet werden, sondern auch als Navigationsdienstprogramm zum schnellen Öffnen der Verzeichnisse.
Benutzer können auch bequem erkennen, welche Partition sich auf welcher Festplatte befindet, wodurch häufige Verwechslungen mit dem Mounten über Befehlszeilendienstprogramme wie z mount
. Stattdessen wird es udisksctl
für diesen Zweck verwendet (sowie das Abrufen der Informationen vom UDisks2
Daemon, daher die Benennung). Die einzige Aufgabe, die nicht ausgeführt wird, ist das Aufheben der Bereitstellung. Aus diesem Grund ist der Open Disks Utility
Menüeintrag enthalten.
Während ich ursprünglich versucht hatte, es dem iStat-Menulet ähnlich zu machen, weicht das Projekt von diesem Ziel ab - der Indikator ist in Design und Zweck einzigartig. Ich hoffe, es wird für viele Benutzer nützlich sein und ihre Ubuntu-Erfahrung viel angenehmer machen.
udisks-Indikator (ursprüngliche Antwort)
Anzeige für Ubuntu mit Unity-Desktop zur Anzeige der Festplattennutzung
Überblick
Dieser Indikator für Ubuntu mit Unity ermöglicht das einfache Anzeigen von Informationen zu Ihren bereitgestellten Partitionen. Es ist bestrebt, dem iStat Menu 3-Menulet von OS X optisch ähnlich zu sein.
Die Einträge sind in der Reihenfolge organisiert:
- Trennwand
- Alias (falls vom Benutzer festgelegt)
- Festplattenlaufwerk, zu dem die Partition gehört
- Mountpoint der Partition (Verzeichnis)
- % Verwendung
Durch Klicken auf jeden Partitionseintrag wird der Mountpunkt der Partition im Standarddateimanager geöffnet
Das Menü "Nicht gemountete Partitionen" listet alle Partitionen auf, die derzeit nicht vom System gemountet werden. Durch Klicken auf einen Eintrag in diesem Untermenü wird diese Partition automatisch bereitgestellt, normalerweise in einem /media/username/drive-id
Ordner
Der Indikator verwendet die im System enthaltenen Standardsymbole. Daher sollte sich das Symbol ändern, wenn Sie das Symbolthema mit dem Unity Tweak Tool oder anderen Methoden ändern
HINWEIS : Wenn Sie mehrere Aliase gleichzeitig hinzufügen möchten, anstatt nacheinander über die Option "Alias ~/.partition_aliases.json
erstellen ", können Sie dies durch Bearbeiten der Konfigurationsdatei tun . Das Format ist wie folgt:
{
"sda1": "Alias 1",
"sda2": "Alias 2",
"sdb1": "Alias 3"
}
Installation
PPA für eine einfache Installation ist in Kürze verfügbar. . .
In der Zwischenzeit sind hier alternative Schritte:
cd /tmp
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop
All diese Schritte können in ein nettes kleines Installationsskript eingefügt werden:
#!/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
Quellcode
Der Original-Quellcode (Version v1.0) mit den grundlegenden Funktionen dieses Indikators finden Sie unten. Die neuesten Funktionen finden Sie im GitHub-Repository für dieses Projekt . Bitte melden Sie alle Funktionsanfragen sowie Fehler auf GitHub.
Die /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()
Das /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
Zusätzliche Information:
Ubuntu Mate 16.04 Test:
Gnome-Benutzer benötigen eine Erweiterung (KStatusNotifierItem / AppIndicator-Unterstützung), damit sich der Indikator ordnungsgemäß verhält:
/dev/sdb1
und seine Verwendung direkt daneben? In Prozent oder tatsächlichen Gigabyte?