Chỉ báo sử dụng hệ thống tệp


10

Tôi không thể tìm thấy một tiện ích phù hợp để chỉ ra việc sử dụng hệ thống tệp (% không gian trống cho các phân vùng) trên bảng điều khiển.

Và tôi không mong muốn cài đặt bất kỳ loại công cụ quản lý máy tính để bàn xấu nào, mà là một chỉ báo đơn giản.

Tôi đánh giá cao tất cả các đề xuất của bạn.


Điều đó có thể được thực hiện. Bạn muốn nó trông như thế nào? Chỉ cần phân vùng tên thiết bị như thế nào /dev/sdb1và sử dụng ngay bên cạnh nó? Trong phần trăm hoặc gigabyte thực tế?
Sergiy Kolodyazhnyy

Tôi thà thích một tên tùy chỉnh và% miễn phí cho tất cả các phân vùng của ổ cứng và khi tôi cắm plugin lưu trữ USB hoặc USB vĩnh cửu.
Dinesh Kalidassan

Bạn có thể giải thích những gì bạn có nghĩa là tên tùy chỉnh? Bạn cũng muốn đặt tên cho các ổ đĩa?
Sergiy Kolodyazhnyy

Tôi muốn gọi / dev / sdb1 là "Quan trọng" hoặc "Giải trí" hoặc "Chính thức", v.v.
Dinesh Kalidassan

2
Xin chào Dinesh, nếu bất kỳ câu trả lời nào cung cấp cho bạn những gì bạn đang tìm kiếm (nói chung), bạn có thể chấp nhận nó. Tôi nhận thấy trong hồ sơ của bạn, bạn không chấp nhận câu trả lời trước đây, bạn có thể không quen với nó. Nếu (một trong hai) câu trả lời giải quyết vấn đề của bạn, bạn có cân nhắc chấp nhận nó không? (Đánh dấu chữ V lớn bên dưới mũi tên lên / xuống bên cạnh câu trả lời).
Jacob Vlijm

Câu trả lời:


19

BIÊN TẬP:

1. TRẢ LỜI MỚI

Mặc dù câu trả lời ở dưới cùng của câu hỏi này có thể được sử dụng (xem [2.]), nó dẫn đến một sự đảo ngược ppavới các tùy chọn bổ sung, được đặt trong cửa sổ tùy chọn.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Các tùy chọn bao gồm:

  • Đặt tất cả các bí danh trong một cửa sổ
  • Đặt màu chủ đề cho biểu tượng bảng điều khiển:

    nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây

  • Đặt ngưỡng cho các cảnh báo
  • Hiển thị thông tin về khối lượng mới được gắn / kết nối trong thông báo:

    nhập mô tả hình ảnh ở đây

  • Chạy khi khởi động

Hơn nữa, chỉ báo hiện bao gồm một biểu tượng (chiều rộng) nhỏ hơn được đặt cho các bản phân phối khác (như xfce), sẽ được tự động áp dụng, tùy thuộc vào trình quản lý cửa sổ.

nhập mô tả hình ảnh ở đây

Để cài đặt:

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



2. TRẢ LỜI

Kịch bản dưới đây là một chỉ báo liệt kê các thiết bị của bạn và hiển thị mức độ sử dụng của chúng. Thông tin được cập nhật (nếu cần) một lần trong mười giây.

nhập mô tả hình ảnh ở đây

Hơn nữa

  • Trong khi chỉ báo đang chạy, bạn có thể chọn một thiết bị được thể hiện trong biểu tượng. Thiết bị sẽ được ghi nhớ vào lần tiếp theo bạn chạy chỉ báo:

    nhập mô tả hình ảnh ở đây

    ! [nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

  • Đối với một hoặc nhiều (hoặc tất cả) thiết bị, bạn có thể đặt tên thay thế ("tên tùy chỉnh"), được đặt trong phần đầu của tập lệnh

    Ví dụ, điều này:

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

    Sẽ hiển thị:

    nhập mô tả hình ảnh ở đây

  • Bạn có thể thiết lập một ngưỡng ; nếu không gian trống của một trong các thiết bị của bạn ở dưới mức đó, bạn sẽ nhận được cảnh báo:

    nhập mô tả hình ảnh ở đây

  • Các thiết bị đã cắm / rút phích cắm sẽ được thêm / xóa khỏi bảng điều khiển trong vòng 10 giây.

Kịch bản

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

Các biểu tượng

nhập mô tả hình ảnh ở đây 0.png

nhập mô tả hình ảnh ở đây 1.png

nhập mô tả hình ảnh ở đây 2.png

nhập mô tả hình ảnh ở đây 3.png

nhập mô tả hình ảnh ở đây 4.png

nhập mô tả hình ảnh ở đây 5.png

nhập mô tả hình ảnh ở đây 6.png

nhập mô tả hình ảnh ở đây 7.png

nhập mô tả hình ảnh ở đây 8.png

nhập mô tả hình ảnh ở đây 9.png

nhập mô tả hình ảnh ở đây 10.png

Đang cài đặt

Thiết lập rất đơn giản:

  • Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng showusage.py
  • Lưu các biểu tượng ở trên, được đặt tên chính xác như trong nhãn của chúng , vào một và cùng thư mục với tập lệnh (nhấp chuột phải> Lưu dưới dạng)
  • Trong phần đầu của tập lệnh, đặt (có thể) tên thay thế ( aliasses). Dưới đây là một ví dụ:

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

    Nếu bạn muốn hiển thị các thiết bị không thay đổi, hãy sử dụng:

    alias = []

    ... Và nếu bạn muốn, hãy thay đổi ngưỡng để hiển thị cảnh báo:

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

    Đó là nó

Chạy nó

Để sử dụng chỉ báo, hãy chạy lệnh:

python3 /path/to/showusage.py

Để thêm nó vào Ứng dụng khởi động, hãy sử dụng lệnh:

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

Chọn Ứng dụng: Dấu gạch ngang> Ứng dụng khởi động> Thêm, thêm lệnh ở trên.


16

từ chối trách nhiệm: Tôi là tác giả của chỉ số này và nó được viết cho câu hỏi cụ thể này

Cập nhật ngày 23 tháng 10 năm 2018

Các chỉ số hiện hỗ trợ niêm yết mạng chia sẻ . Cảm ơn mihaigalos

Cập nhật ngày 29 tháng 10 năm 2016

Hiện tại chỉ báo có chức năng ngắt kết nối và các bí danh đã được tạo thành duy nhất bằng cách tham khảo UUID của từng phân vùng thay vì chặn tên thiết bị như sda1. Xem báo cáo lỗi liên quan

Cập nhật, tháng 8.2016

Chỉ báo này hiện ở phiên bản 2.0, đã thêm một vài tính năng và có PPA riêng.

Để cài đặt từ PPA, sử dụng các bước sau trong thiết bị đầu cuối:

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

Như đã đề cập trong bản phát hành, các tính năng bao gồm:

  • Các biểu tượng cho các mục menu: mỗi phân vùng / thiết bị có biểu tượng phù hợp kèm theo nó. Nếu thiết bị là đĩa usb, biểu tượng phương tiện di động được sử dụng, nếu đó là hình ảnh iso - biểu tượng đĩa quang được sử dụng và phân vùng ổ cứng / SSD rõ ràng có biểu tượng ổ đĩa.
  • Việc sử dụng hiện được hiển thị theo tỷ lệ phần trăm và giá trị có thể đọc được của con người (quyền hạn 1024).
  • Biểu diễn đồ họa của việc sử dụng thông qua thanh sử dụng (cảm ơn ý tưởng của Mateo Salta)
  • Hộp thoại tùy chọn: người dùng có thể tắt một số trường nhất định mà họ không muốn thấy trên mỗi mục nhập menu. Điều này cho phép giữ menu chỉ báo sạch nếu có một lượng lớn phân vùng kèm theo. (Cảm ơn yêu cầu của Zacharee)
  • Khoảng cách văn bản: với phông chữ Ubuntu và phông chữ Monospace mặc định, các mục nhập văn bản được đặt cách đều nhau để có giao diện rõ ràng hơn và tăng cường khả năng đọc thông tin.
  • Bong bóng thông báo trong trường hợp phân vùng không thể được gắn kết

Dưới đây là ảnh chụp màn hình với chủ đề biểu tượng Ubuntu mặc định: nhập mô tả hình ảnh ở đây

Chủ đề biểu tượng Ubuntu Kylin

nhập mô tả hình ảnh ở đây

Với tất cả các trường tùy chọn tắt

nhập mô tả hình ảnh ở đây

Lựa chọn thiết kế và suy nghĩ bổ sung:

Khi tạo ra chỉ số này, tôi hy vọng sẽ đạt được một tiện ích phù hợp cho cả người dùng cao cấp và người dùng thông thường. Tôi đã cố gắng giải quyết một số vấn đề mà tôi nhận thấy người dùng mới có thể gặp phải khi xử lý các công cụ dòng lệnh. Ngoài ra, tiện ích phấn đấu để được đa năng.

Hộp thoại Preferences cho phép làm cho chỉ báo trở nên phức tạp và / hoặc đơn giản như người dùng mong muốn. Đó cũng là một quyết định thiết kế cụ thể để tránh có nhãn trong bảng trên cùng để nó không chiếm quá nhiều không gian bảng trên cùng của người dùng. Ngoài ra, chỉ báo này cố gắng trở thành tiện ích đa năng cho phép gắn các phân vùng cũng như mở các thư mục tương ứng của chúng. Điều này có thể được sử dụng không chỉ là tiện ích sử dụng đĩa, mà còn là tiện ích điều hướng để mở nhanh các thư mục.

Nó cũng thuận tiện cho người dùng biết phân vùng nào sinh sống trên đĩa nào, do đó tránh sự nhầm lẫn thường xuyên với việc gắn kết thông qua các tiện ích dòng lệnh như mount. Thay vào đó, nó sử dụng udisksctlcho mục đích đó (cũng như có được thông tin từ UDisks2daemon, do đó việc đặt tên). Nhiệm vụ duy nhất mà nó không thực hiện là không đếm được, hoặc lý do Open Disks Utilitynày bao gồm các mục menu.

Mặc dù ban đầu tôi đã cố gắng làm cho nó giống với iStat menulet, dự án đã chuyển hướng khỏi mục tiêu này - chỉ số này là duy nhất trong thiết kế và mục đích của nó. Tôi hy vọng nó sẽ được tìm thấy hữu ích cho nhiều người dùng và làm cho trải nghiệm Ubuntu của họ dễ chịu hơn nhiều.


chỉ số udisks (câu trả lời gốc)

Chỉ báo cho Ubuntu với máy tính để bàn Unity để hiển thị mức sử dụng đĩa Ảnh chụp màn hình mẫu

Tổng quat

Chỉ báo này cho Ubuntu với Unity cho phép dễ dàng xem thông tin về các phân vùng được gắn kết của bạn. Nó phấn đấu tương tự như trực quan với menu iStat Menu 3 từ OS X.

Các mục được sắp xếp theo thứ tự:

  • Vách ngăn
  • Bí danh (nếu được đặt bởi người dùng)
  • Ổ đĩa thuộc phân vùng nào
  • Mountpoint của phân vùng (thư mục)
  • % Sử dụng

Nhấp vào từng mục phân vùng sẽ mở điểm gắn kết của phân vùng trong trình quản lý tệp mặc định

Menu "Unmounted Partitions" liệt kê tất cả các phân vùng hiện không được hệ thống gắn kết. Nhấp vào bất kỳ mục nào trong menu con đó sẽ tự động gắn phân vùng đó vào /media/username/drive-idthư mục

Chỉ báo sử dụng các biểu tượng mặc định được cung cấp cùng với hệ thống, vì vậy biểu tượng sẽ được thay đổi khi bạn thay đổi chủ đề biểu tượng bằng Unity Tweak Tool hoặc các phương thức khác

LƯU Ý : nếu bạn muốn thêm nhiều bí danh cùng một lúc, thay vì từng cái một thông qua tùy chọn "Tạo bí danh", bạn có thể làm như vậy thông qua chỉnh sửa ~/.partition_aliases.jsontệp cấu hình. Định dạng như sau:

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

Cài đặt

Sắp có PPA để dễ dàng cài đặt. . .

Trong lúc này, đây là các bước thay thế:

  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ất cả các bước này có thể được đưa vào một tập lệnh cài đặt nhỏ xinh:

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

Mã nguồn

Mã nguồn gốc (Phiên bản v1.0) với chức năng cơ bản của chỉ báo này có thể được tìm thấy bên dưới. Để biết các tính năng mới nhất, hãy kiểm tra kho GitHub cho dự án này . Vui lòng báo cáo bất kỳ yêu cầu tính năng cũng như lỗi trên GitHub.

các /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()

Các /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

Thông tin bổ sung:

Thử nghiệm Ubuntu Mate 16.04:

nhập mô tả hình ảnh ở đây

Người dùng Gnome cần một tiện ích mở rộng (Hỗ trợ KStatusNotifierItem / AppIndicator) để làm cho chỉ báo hoạt động đúng:

nhập mô tả hình ảnh ở đây


1
Có thể xác nhận. Điều này hoạt động với Xfce4. Làm tốt lắm! =)
Terrance

@Terrance trong trường hợp bạn muốn lấy phiên bản mới nhất, hãy xem bản cập nhật để trả lời. Zach cũng đã thử nghiệm trên Xfce của mình, cho biết nó hoạt động
Sergiy Kolodyazhnyy

Mát mẻ! Cảm ơn bạn đã cho tôi biết. Tôi sẽ cho nó một vòng xoáy. =) Cập nhật: Có vẻ rất tốt và tôi thích biểu tượng bạn đã thay đổi. Làm tốt! =)
Terrance

+1 nhưng có nên chỉ ra "PPA sắp ra mắt" có thể được gỡ bỏ ngay bây giờ không?
WinEunuuchs2Unix

@ WinEunuuchs2Unix Có, có thể xóa. Bản thân câu trả lời và chỉ báo này cần một bản cập nhật khổng lồ nhưng không có thời gian cho điều đó gần đây
Sergiy Kolodyazhnyy

4

Cài đặt chỉ báo Sysmonitor :

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

và nó có tùy chọn "Dung lượng trống trong hệ thống tệp".


1

Có một câu trả lời khác bằng cách sử dụng Chỉ báo Sysmonitor cơ bản nhưng bạn có thể tạo bảng tùy chỉnh của riêng mình với bao nhiêu thông tin tùy thích.

Google (ít nhất là tìm kiếm) là bạn của bạn

Bước đầu tiên là tìm ra cách tính tỷ lệ sử dụng phân vùng :

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

Tạo tập lệnh bash để lặp lại bảng điều khiển

Dưới đây là tập lệnh bash để sử dụng làm tùy chọn "tùy chỉnh" trong Chỉ báo Sysmonitor . Nó sẽ hiển thị tỷ lệ phần trăm được sử dụng trên ba phân vùng đầu tiên trên /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]}"

Sản lượng mẫu

Khi chạy nó sẽ như thế này:

chỉ số systmonitor example.png

Cài đặt và cấu hình các tập lệnh tùy chỉnh trong Sysmonitor Indicator

Để biết hướng dẫn chi tiết về cách cài đặt Chỉ báo Sysmonitor và gán tập lệnh tùy chỉnh, hãy xem câu trả lời này: BASH có thể hiển thị trong systray làm chỉ báo ứng dụng không?


Giải pháp đáng yêu. Mặc dù có thể trở nên dài dòng với số lượng lớn các phân vùng và thiết bị
Sergiy Kolodyazhnyy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.