Dosya Sistemi Kullanım Göstergesi


10

Paneldeki dosya sistemi kullanımını (bölümler için% boş alan) belirtmek için uygun bir yardımcı program bulamıyorum.

Ve herhangi bir kötü tür masaüstü yönetim aracı yüklemek için sabırsızlanıyorum, ama basit bir gösterge.

Tüm önerilerinizi takdir ediyorum.


Bu uygulanabilir. Nasıl görünmesini istersiniz? Cihaz adı gibi bölüntüler /dev/sdb1ve kullanımı hemen yanında mı? Yüzde veya gerçek gigabayt olarak mı?
Sergiy Kolodyazhnyy

HDD'nin tüm bölümleri için ve xternal HDD veya usb depolama eklediğimde özel bir ad ve% ücretsiz tercih ederim.
Dinesh Kalidassan

Özel adla ne demek istediğinizi açıklayabilir misiniz? ayrıca sürücüleri adlandırmak ister misiniz?
Sergiy Kolodyazhnyy

/ Dev / sdb1'i "Kritik" veya "Eğlence" veya "Resmi" vb.
Olarak belirtmek istiyorum

2
Cevapların hiçbirinde sen (genel olarak) aradığını sizi verirse Merhaba Dinesh, sen olabilir bunu kabul edin. Profilinizde daha önce bir yanıtı kabul etmediğinizi fark ettim, bilmiyor olabilirsiniz. Yanıtlardan biri (biri) sorununuzu çözerse, kabul etmeyi düşünür müsünüz? (Cevabın yanındaki yukarı / aşağı okların altındaki büyük V'yi işaretleyin).
Jacob Vlijm

Yanıtlar:


19

DÜZENLE:

1. YENİ CEVAP

Bunun altındaki cevap kullanılabilirken (bkz. [2.]), ppaBir tercihler penceresinde ayarlanacak ek seçeneklerle bir- sürümüne yol açar.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Seçenekler şunları içerir:

  • Tüm takma adları tek bir pencerede ayarlama
  • Panel simgesi için tema renklerini ayarlama:

    resim açıklamasını buraya girinresim açıklamasını buraya girinresim açıklamasını buraya girinresim açıklamasını buraya girin

  • Uyarılar için eşik ayarlama
  • Bir bildirimde yeni bağlanan / bağlanan birimler hakkındaki bilgileri göster:

    resim açıklamasını buraya girin

  • Başlangıçta Çalıştır

Ayrıca, gösterge artık pencere yöneticisine bağlı olarak otomatik olarak uygulanacak olan diğer dağıtımlar (xfce gibi) için ayarlanmış daha küçük bir (genişlik) simge içerir.

resim açıklamasını buraya girin

Yüklemek:

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



2. ESKİ CEVAP

Aşağıdaki komut dosyası, cihazlarınızı listeleyen ve kullanımlarını gösteren bir göstergedir. Bilgiler (gerekirse) on saniyede bir güncellenir.

resim açıklamasını buraya girin

ayrıca

  • Gösterge çalışırken, simgede temsil edilecek bir cihaz seçebilirsiniz. Göstergeyi bir sonraki çalıştırışınızda cihaz hatırlanacaktır:

    resim açıklamasını buraya girin

    ! [resim açıklamasını buraya girin

    resim açıklamasını buraya girin

  • Bir veya daha fazla (veya tümü) cihaz için, komut dosyasının başında ayarlanacak alternatif bir ad ("özel ad") ayarlayabilirsiniz

    Örnek olarak, bu:

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

    Gösterecek:

    resim açıklamasını buraya girin

  • Bir harman ayarlayabilirsiniz ; cihazlarınızdan birinin boş alanı bunun altındaysa bir uyarı alırsınız:

    resim açıklamasını buraya girin

  • Takılı / çıkarılmış cihazlar 10 saniye içinde menüliste eklenir / çıkarılır.

Senaryo

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

Simgeler

resim açıklamasını buraya girin 0.png

resim açıklamasını buraya girin 1.png

resim açıklamasını buraya girin 2.png

resim açıklamasını buraya girin 3.png

resim açıklamasını buraya girin 4.png

resim açıklamasını buraya girin 5.png

resim açıklamasını buraya girin 6.png

resim açıklamasını buraya girin 7.png

resim açıklamasını buraya girin 8.png

resim açıklamasını buraya girin 9.png

resim açıklamasını buraya girin 10.png

Kurulum

Kurulumu basit:

  • Komut dosyasını boş bir dosyaya kopyalayın, showusage.py
  • Yukarıdaki simgeleri, tam olarak etiketlerinde olduğu gibi, komut dosyasıyla bir ve aynı dizine kaydedin (sağ tıklayın> Farklı kaydet)
  • Komut dosyasının başlığında alternatif adları ( aliasses) ayarlayın (olası ). Bir örnek aşağıda:

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

    Cihazları değişmeden görüntülemek istiyorsanız, şunu kullanın:

    alias = []

    ... ve isterseniz bir uyarı göstermek için eşiği değiştirin:

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

    Bu kadar

Çalıştırmak

Göstergeyi kullanmak için şu komutu çalıştırın:

python3 /path/to/showusage.py

Başlangıç ​​Uygulamalarına eklemek için şu komutu kullanın:

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

Uygulamalar: Çizgi> Başlangıç ​​Uygulamaları> Ekle'yi seçin, yukarıdaki komutu ekleyin.


16

yasal uyarı: Ben bu göstergenin yazarı ve bu özel soru için yazılmıştır

Güncelleme Ekim 23,2018

Gösterge artık ağ paylaşımlarının listelenmesini destekliyor . Mihaigalos'a teşekkürler

Güncelleme 29 Eki 2016

Göstergenin şimdi sökme işlevi vardır ve takma adlar, her bir bölümün UUID'si gibi blok cihaz adı yerine referans alınarak benzersiz hale getirilmiştir sda1. İlgili hata raporuna bakın

Güncelleme, Eki 8,2016

Gösterge şimdi sürüm 2.0'da, birkaç özellik ekledi ve kendi PPA'sına sahip.

PPA'dan kurmak için terminalde aşağıdaki adımları kullanın:

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

Bahsedildiği gibi sürüm notları özellikleri şunlardır:

  • Menü girişleri için simgeler: her bölüm / aygıtta eklenmiş uygun simge bulunur. Aygıt usb disk ise, çıkarılabilir medya simgesi kullanılır, iso görüntüsü ise - optik disk simgesi kullanılır ve açıkçası sabit sürücü / SSD bölümlerinde sürücü simgeleri bulunur.
  • Kullanım artık yüzde ve okunabilir değerlerle (1024'ün gücü) gösterilir.
  • Kullanım çubuğuyla kullanımın grafiksel gösterimi (fikir için Mateo Salta'ya büyük teşekkürler)
  • Tercihler iletişim kutusu: kullanıcılar her menü girişi için görmek istemedikleri belirli alanları kapatabilir. Bu, büyük miktarda bölüm varsa gösterge menüsünün temiz tutulmasını sağlar. (Zacharee'nin isteği sayesinde)
  • Metin aralığı: varsayılan Ubuntu yazı tipi ve Monospace yazı tipleri ile metin girişleri, daha temiz bir görünüme sahip olmak ve bilgilerin okunabilirliğini artırmak için aralıklıdır.
  • Bölümün monte edilememesi durumunda bildirim balonları

Aşağıda varsayılan Ubuntu simge temalı ekran görüntüsü verilmiştir: resim açıklamasını buraya girin

Ubuntu Kylin icon teması

resim açıklamasını buraya girin

Tüm isteğe bağlı alanlar kapalıyken

resim açıklamasını buraya girin

Tasarım seçenekleri ve ek düşünceler:

Bu göstergenin hazırlanmasında, hem ileri hem de sıradan kullanıcılar için uygun bir yardımcı program elde etmeyi umdum. Komut satırı araçlarını işlemekle yeni kullanıcıların sahip olabileceğini fark ettiğim bazı sorunları çözmeye çalıştım. Ayrıca, yardımcı program çok amaçlı olmaya çalışmaktadır.

Tercihler iletişim kutusu göstergeyi kullanıcının istediği kadar karmaşık ve / veya basit hale getirir. Ayrıca, üst panelde etiket bulundurmaktan kaçınmak, böylece kullanıcının üst panel alanından çok fazla yer almaması için özel bir tasarım kararıdır. Buna ek olarak, bu gösterge, bölümleri monte etmenin yanı sıra ilgili dizinlerini açmaya izin veren çok amaçlı bir yardımcı programdır. Bu sadece disk kullanım yardımcı programı olarak değil, aynı zamanda dizinlerin hızlı açılması için navigasyon yardımcı programı olarak da kullanılabilir.

Ayrıca, kullanıcıların hangi disk bölümünün hangi diskte yaşadığını bilmesi, böylelikle komut satırı yardımcı programları aracılığıyla montaj ile sık sık karışıklıktan kaçınmak için de uygundur mount. Bunun yerine bu udisksctlamaç için kullanılır (aynı zamanda daemon'dan bilgi almanın yanı sıra UDisks2adlandırma). Gerçekleştirmediği tek görev bağlantıyı kesmektir ve bu nedenle Open Disks Utilitymenü girişi eklenir.

Başlangıçta iStat menületine benzer hale getirmeye çalışırken, proje bu amaçtan saptı - gösterge tasarım ve amaç bakımından benzersizdir. Umarım birçok kullanıcı için yararlı bulunur ve Ubuntu deneyimlerini çok daha keyifli hale getirir.


udisks-göstergesi (orijinal cevap)

Disk kullanımını göstermek için Unity masaüstüne sahip Ubuntu göstergesi Örnek Ekran Görüntüsü

genel bakış

Unity özellikli Ubuntu için bu gösterge, monte edilmiş bölümleriniz hakkındaki bilgileri kolayca görüntülemenizi sağlar. OS X'ten iStat Menu 3 menületine görsel olarak benzer olmaya çalışır.

Girişler sırasıyla düzenlenir:

  • bölme
  • Takma ad (kullanıcı tarafından ayarlanırsa)
  • Bölümün ait olduğu Disk Sürücüsü
  • Bölümün bağlama noktası (dizin)
  • % Kullanım

Her bölüm girişine tıklamak, bölümün bağlama noktasını varsayılan dosya yöneticisinde açar

"Monte Edilmemiş Bölümler" menüsü, sistem tarafından şu anda monte edilmemiş tüm bölümleri listeler. Bu alt menüdeki herhangi bir giriş tıklandığında, bu bölüm otomatik olarak, genellikle /media/username/drive-idklasöre bağlanır

Gösterge sistemle birlikte verilen varsayılan simgeleri kullanır, bu nedenle Unity Tweak Tool veya diğer yöntemleri kullanarak simge temasını değiştirdiğinizde simgenin değişmesi gerekir

NOT : "Takma Ad Oluştur" seçeneği ile aynı anda birden çok takma ad eklemek istiyorsanız, bunu ~/.partition_aliases.jsonyapılandırma dosyasını düzenleyerek yapabilirsiniz . Biçim aşağıdaki gibidir:

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

Kurulum

Kolay kurulum için PPA yakında geliyor. . .

Bu arada, alternatif adımlar şunlardır:

  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

Tüm bu adımlar güzel bir küçük kurulum komut dosyasına yerleştirilebilir:

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

Kaynak kodu

Bu göstergenin temel işlevlerine sahip orijinal kaynak kodu (Sürüm v1.0) aşağıda bulunabilir. En yeni özellikler için bu proje için GitHub deposunu kontrol edin . Lütfen özellik isteklerini ve GitHub'daki hataları bildirin.

/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

İlave bilgi:

Ubuntu Mate 16.04 testi:

resim açıklamasını buraya girin

Gnome kullanıcılarının, göstergenin düzgün davranması için bir uzantıya (KStatusNotifierItem / AppIndicator Desteği) ihtiyacı vardır:

resim açıklamasını buraya girin


1
Onaylayabilir. Bu Xfce4 ile çalışır. Güzel yapılmış! =)
Terrance

@ En yeni sürümü almak istediğinizde, yanıtın güncellemesine bakın. Zach zaten Xfce'de de test edildi, işe yaradığını söyledi
Sergiy Kolodyazhnyy

Güzel! Bana bildirdiğiniz için teşekkür ederim. Ben bir koşuşturma vereceğim. =) Güncelleme: Gerçekten iyi görünüyor ve üzerinde yaptığınız simge değişikliklerini seviyorum. Aferin! =)
Terrance

+1 ancak "PPA çok yakında geliyor" ifadesinin kaldırılabileceğini mi belirtmelisiniz?
WinEunuuchs2Unix

@ WinEunuuchs2Unix Evet, kaldırılabilir. Bu cevap ve göstergenin kendisi dev bir güncellemeye ihtiyaç duyuyor, ancak son zamanlarda bunun için zaman yok
Sergiy Kolodyazhnyy

4

Sismonitor Göstergesini takın :

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

ve "Dosya Sisteminde Kullanılabilir Alan" seçeneğine sahiptir.


1

Temel Sysmonitor Göstergesi kullanılarak başka bir yanıt daha vardır, ancak istediğiniz kadar bilgi içeren kendi özel panelinizi oluşturabilirsiniz.

Google (en azından iyi arama) arkadaşın

İlk adım bölüm kullanım yüzdesinin nasıl hesaplanacağını bulmaktır :

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

Panele yansıtacak bash betiği oluşturma

İşte Sysmonitor Indicator'da "custom" seçeneği olarak kullanılacak bir bash betiği . Aşağıdaki ilk üç bölümde kullanılan yüzdeyi gösterecektir /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]}"

Örnek çıktı

Çalıştırırken şöyle görünecektir:

gösterge sistmonitor örneği.png

Sysmonitor Göstergesi'nde özel komut dosyaları yükleme ve yapılandırma

Sysmonitor Indicator'ı yükleme ve özel bir komut dosyası atama hakkında ayrıntılı talimatlar için şu yanıta bakın: BASH, uygulama göstergesi olarak sistemde görüntülenebilir mi?


Güzel çözüm. Çok sayıda bölüm ve cihazla uzun
sürebilir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.