Avertissement: je suis l'auteur de cet indicateur et il est écrit pour cette question spécifique
Mise à jour du 23 octobre 2018
L'indicateur prend désormais en charge la liste des partages réseau . Merci à mihaigalos
Mise à jour du 29 octobre 2016
L'indicateur dispose désormais d'une fonctionnalité de démontage et les alias ont été rendus uniques en faisant référence à l'UUID de chaque partition au lieu du nom du périphérique de bloc tel que sda1
. Voir le rapport de bogue associé
Mise à jour, 8 octobre 2016
L'indicateur est maintenant dans la version 2.0, a ajouté quelques fonctionnalités et possède son propre PPA.
Pour installer à partir de PPA, utilisez les étapes suivantes dans le terminal:
sudo apt-add-repository ppa:udisks-indicator-team/ppa
sudo bash -c 'apt-get update && apt-get install udisks-indicator'
Comme mentionné dans les notes de version, les fonctionnalités incluent:
- Icônes pour les entrées de menu: chaque partition / périphérique est associé à une icône appropriée. Si le périphérique est un disque USB, une icône de support amovible est utilisée, s'il s'agit d'une image iso - l'icône de disque optique est utilisée et, évidemment, les partitions de disque dur / SSD ont des icônes de lecteur.
- L'utilisation est maintenant indiquée en pourcentage et en valeurs lisibles par l'homme (puissances de 1024).
- Représentation graphique de l'utilisation via la barre d'utilisation (un grand merci à Mateo Salta pour l'idée)
- Boîte de dialogue Préférences: les utilisateurs peuvent désactiver certains champs qu'ils ne souhaitent pas voir pour chaque entrée de menu. Cela permet de garder le menu indicateur propre s'il y a une grande quantité de partitions attachées. (Merci à la demande de Zacharee)
- Espacement du texte: avec la police Ubuntu par défaut et les polices Monospace, les entrées de texte sont bien espacées pour avoir un aspect plus net et améliorer la lisibilité des informations.
- Bulles de notification au cas où la partition ne peut pas être montée
Ci-dessous, la capture d'écran avec le thème d'icône Ubuntu par défaut:
Thème d'icônes Ubuntu Kylin
Avec tous les champs facultatifs désactivés
Choix de conception et réflexions supplémentaires:
En créant cet indicateur, j'espérais obtenir un utilitaire qui conviendrait aux utilisateurs avancés et occasionnels. J'ai essayé de résoudre certains des problèmes que j'ai remarqués que les nouveaux utilisateurs peuvent avoir avec la gestion des outils de ligne de commande. De plus, l'utilitaire s'efforce d'être polyvalent.
La boîte de dialogue Préférences permet de rendre l'indicateur aussi complexe et / ou aussi simple que l'utilisateur le souhaite. C'était également une décision de conception spécifique pour éviter d'avoir une étiquette dans le panneau supérieur afin qu'elle n'occupe pas trop d'espace sur le panneau supérieur de l'utilisateur. De plus, cet indicateur s'efforce d'être un utilitaire polyvalent qui permet de monter des partitions ainsi que d'ouvrir leurs répertoires respectifs. Cela peut être utilisé non seulement comme utilitaire d'utilisation du disque, mais aussi comme utilitaire de navigation pour une ouverture rapide des répertoires.
Il est également pratique pour les utilisateurs de savoir quelle partition habite quel disque, évitant ainsi une confusion fréquente avec le montage via des utilitaires de ligne de commande tels que mount
. Au lieu de cela, il utilise udisksctl
à cette fin (ainsi que d'obtenir les informations du UDisks2
démon, d'où la dénomination). La seule tâche qu'il n'effectue pas est le démontage, et c'est pourquoi l' Open Disks Utility
entrée de menu est incluse.
Alors qu'à l'origine, je m'efforçais de le rendre similaire à la menulet iStat, le projet a divergé de cet objectif - l'indicateur est unique dans sa conception et son objectif. J'espère que cela sera utile à de nombreux utilisateurs et rendra leur expérience Ubuntu beaucoup plus agréable.
udisks-indicator (réponse originale)
Indicateur pour Ubuntu avec le bureau Unity pour afficher l'utilisation du disque
Aperçu
Cet indicateur pour Ubuntu avec Unity permet de visualiser facilement les informations sur vos partitions montées. Il s'efforce d'être visuellement similaire à la menulet iStat Menu 3 d'OS X.
Les inscriptions sont organisées dans l'ordre:
- Cloison
- Alias (si défini par l'utilisateur)
- Lecteur de disque auquel appartient la partition
- Point de montage de la partition (répertoire)
- % D'utilisation
Cliquer sur chaque entrée de partition ouvrira le point de montage de la partition dans le gestionnaire de fichiers par défaut
Le menu "Partitions non montées" répertorie toutes les partitions non actuellement montées par le système. Cliquer sur une entrée de ce sous-menu montera cette partition automatiquement, généralement pour/media/username/drive-id
dossier
L'indicateur utilise les icônes par défaut fournies avec le système, donc l'icône doit changer lorsque vous modifiez le thème de l'icône à l'aide de l'outil Unity Tweak ou d'autres méthodes.
REMARQUE : si vous souhaitez ajouter plusieurs alias en même temps, au lieu d'un par un via l'option "Créer un alias", vous pouvez le faire en modifiant le ~/.partition_aliases.json
fichier de configuration. Le format est le suivant:
{
"sda1": "Alias 1",
"sda2": "Alias 2",
"sdb1": "Alias 3"
}
Installation
PPA pour une installation facile arrive bientôt. . .
En attendant, voici des étapes alternatives:
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
Toutes ces étapes peuvent être mises dans un joli petit script d'installation:
#!/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
Code source
Le code source d'origine (version v1.0) avec les fonctionnalités de base de cet indicateur se trouve ci-dessous. Pour les nouvelles fonctionnalités, consultez le référentiel GitHub pour ce projet . Veuillez signaler toutes les demandes de fonctionnalités ainsi que les erreurs sur GitHub.
Le /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()
le /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
Information additionnelle:
Test Ubuntu Mate 16.04:
Les utilisateurs de Gnome ont besoin d'une extension (prise en charge de KStatusNotifierItem / AppIndicator) pour que l'indicateur se comporte correctement:
/dev/sdb1
et son utilisation juste à côté? En pourcentage ou en gigaoctets réels?