ফাইল সিস্টেম ব্যবহার সূচক


10

প্যানেলে কেবলমাত্র ফাইল সিস্টেমের ব্যবহার (পার্টিশনের জন্য% স্থান ফাঁকা) ইঙ্গিত করার জন্য আমি একটি উপযুক্ত ইউটিলিটি খুঁজে পেতে অক্ষম।

এবং আমি কোনও খারাপ ধরণের ডেস্কটপ পরিচালনার সরঞ্জাম ইনস্টল করার অপেক্ষায় নেই, তবে একটি সাধারণ সূচক।

আমি আপনার সমস্ত পরামর্শ প্রশংসা করি।


তা বাস্তবায়ন করা যায়। আপনি এটি দেখতে চান কিভাবে? পার্টিশনটির মতো ডিভাইসের নাম /dev/sdb1এবং এর ঠিক পাশেই এর ব্যবহার? শতাংশে বা আসল গিগাবাইটে?
সের্গেই কলডিয়াজনি

আমি বরং কাস্টম নাম পছন্দ করি এবং এইচডিডি সমস্ত পার্টিশনের জন্য% বিনামূল্যে এবং যখন আমি এক্সটার্নাল এইচডিডি বা ইউএসবি স্টোরেজ প্লাগইন করি।
দিনেশ কালিদাসন

কাস্টম নামের দ্বারা আপনি কী বোঝাতে চান? আপনিও ড্রাইভের নাম বলতে চান?
সের্গেই কলডিয়াজনি

আমি / dev / sdb1 কে "সমালোচনামূলক" বা "বিনোদন" বা "অফিসিয়াল" ইত্যাদি হিসাবে উল্লেখ করতে চাই,
দিনেশ কালিদাসন

2
হাই দীনেশ, উত্তরগুলির মধ্যে যদি কোনও উত্তর দেয় যা আপনি যা খুঁজছিলেন (সাধারণভাবে), আপনি তা গ্রহণ করতে পারেন। আমি আপনার প্রোফাইলে লক্ষ্য করেছি আপনি এর আগে কোনও উত্তর গ্রহণ করেন নি, আপনি এটির সাথে অপরিচিত থাকতে পারেন। যদি (হয়) উত্তরের কোনও একটি আপনার সমস্যার সমাধান করে, আপনি কি তা গ্রহণ করার বিষয়টি বিবেচনা করবেন? (উত্তরের পাশে উপরে / ডাউন তীরগুলির নীচে বড় ভিকটি টিক করুন)।
জ্যাকব Vlijm

উত্তর:


19

সম্পাদনা করুন:

1. নতুন উত্তর

এইটির নীচের উত্তরটি ব্যবহার করা যেতে পারে (দেখুন [2.]), এটি ppaএকটি পছন্দ উইন্ডোতে সেট করার জন্য অতিরিক্ত বিকল্পগুলির সাথে একটি রূপান্তরকে বাড়ে।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

বিকল্পগুলির মধ্যে রয়েছে:

  • সমস্ত উইকেট একটি উইন্ডোতে সেট করা
  • প্যানেল আইকনটির জন্য থিমের রঙ নির্ধারণ:

    এখানে চিত্র বর্ণনা লিখুনএখানে চিত্র বর্ণনা লিখুনএখানে চিত্র বর্ণনা লিখুনএখানে চিত্র বর্ণনা লিখুন

  • সতর্কতার জন্য প্রান্তিক স্থাপন করা
  • একটি বিজ্ঞপ্তিতে নতুন মাউন্ট করা / সংযুক্ত ভলিউমের তথ্য দেখান:

    এখানে চিত্র বর্ণনা লিখুন

  • প্রারম্ভকালে চালানো

তদুপরি, সূচকটিতে এখন অন্য ডিস্ট্রোর (xfce এর মতো) জন্য একটি ছোট (প্রস্থ) আইকন সেট রয়েছে যা উইন্ডো ম্যানেজারের উপর নির্ভর করে স্বয়ংক্রিয়ভাবে প্রয়োগ করা হবে।

এখানে চিত্র বর্ণনা লিখুন

স্থাপন করা:

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



২. পুরানো উত্তর

নীচের স্ক্রিপ্টটি এমন একটি সূচক যা আপনার ডিভাইসগুলি তালিকাভুক্ত করে এবং তাদের ব্যবহার দেখায়। তথ্য প্রতি সেকেন্ডে একবার আপডেট করা (প্রয়োজনে)।

এখানে চিত্র বর্ণনা লিখুন

তদ্ব্যতীত

  • সূচক চলমান অবস্থায়, আপনি আইকনটিতে প্রতিনিধিত্ব করার জন্য একটি ডিভাইস চয়ন করতে পারেন। আপনি পরের বার সূচকটি চালানোর সময় ডিভাইসটি মনে থাকবে:

    এখানে চিত্র বর্ণনা লিখুন

    ! [চিত্রের বিবরণ এখানে প্রবেশ করান

    এখানে চিত্র বর্ণনা লিখুন

  • এক বা একাধিক (বা সমস্ত) ডিভাইসের জন্য, আপনি কোনও বিকল্প নাম ("কাস্টম নাম") সেট করতে পারেন, স্ক্রিপ্টের মাথায় সেট করতে পারেন

    উদাহরণ হিসাবে, এটি:

    alias = [
        ["sdc1", "stick"],
        ["sdb1", "External"],
        ["sda2", "root"],
        ["sda4", "ntfs1"],
        ["sda5", "ntfs2"],
        ["//192.168.0.104/media", "netwerk media"],
        ["//192.168.0.104/werkmap_documenten", "netwerk docs"],
        ]

    প্রদর্শন করা হবে:

    এখানে চিত্র বর্ণনা লিখুন

  • আপনি একটি থ্রেশহোল্ড সেট করতে পারেন ; যদি আপনার কোনও একটির ডিভাইসের ফ্রি স্পেস এর নীচে থাকে তবে আপনি একটি সতর্কতা পাবেন:

    এখানে চিত্র বর্ণনা লিখুন

  • প্লাগড / প্লাগযুক্ত ডিভাইসগুলি 10 সেকেন্ডের মধ্যে মেন্যুলিস্ট থেকে যুক্ত / সরানো হবে।

এই পান্ডুলিপি

#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread

#--- set alias names below in the format [[device1, alias1], [device2, alias2]]
#--- just set alias = [] to have no custom naming
alias = []
#--- set the threshold to show a warning below 
#--- set to 0 to have no warning
threshold = 17
#---
currpath = os.path.dirname(os.path.realpath(__file__))
prefsfile = os.path.join(currpath, "showpreferred")

class ShowDevs():
    def __init__(self):
        self.default_dev = self.get_showfromfile()
        self.app = 'show_dev'
        iconpath = currpath+"/0.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("Starting up...", self.app)
        self.update = Thread(target=self.check_changes)
        self.update.setDaemon(True)
        self.update.start()

    def check_changes(self):
        state1 = None
        while True:
            self.state2 = self.read_devices()
            if self.state2 != state1:
                self.update_interface(self.state2)
            state1 = self.state2
            time.sleep(10)

    def update_interface(self, state):
        warning = False; self.newmenu = []
        for dev in state:
            mention = self.create_mention(dev)
            name = mention[0]; deci = mention[2]; n = mention[1]
            if n <= threshold:
                warning = True
            try:
                if self.default_dev in name:
                    newlabel = mention[3]
                    newicon = currpath+"/"+str(10-deci)+".png"
            except TypeError:
                pass
            self.newmenu.append(name+" "+str(n)+"% free")
        if warning:
            newlabel = "Check your disks!"
            newicon = currpath+"/10.png"
        try:
            self.update_indicator(newlabel, newicon)
        except UnboundLocalError:
            labeldata = self.create_mention(state[0])
            newlabel = labeldata[3]
            newicon = currpath+"/"+str(10-labeldata[2])+".png"
            self.update_indicator(newlabel, newicon)
        GObject.idle_add(self.set_new, 
            priority=GObject.PRIORITY_DEFAULT)  

    def update_indicator(self, newlabel, newicon):
        GObject.idle_add(self.indicator.set_label,
            newlabel, self.app,
            priority=GObject.PRIORITY_DEFAULT)   
        GObject.idle_add(self.indicator.set_icon,
            newicon,
            priority=GObject.PRIORITY_DEFAULT)

    def set_new(self):
        for i in self.initmenu.get_children():
            self.initmenu.remove(i)
        for item in self.newmenu:
            add = Gtk.MenuItem(item)
            add.connect('activate', self.change_show)
            self.initmenu.append(add) 
        menu_sep = Gtk.SeparatorMenuItem()
        self.initmenu.append(menu_sep)
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()

    def change_show(self, *args):
        index = self.initmenu.get_children().index(self.initmenu.get_active())
        self.default_dev = self.newmenu[index].split()[0]
        open(prefsfile, "wt").write(self.default_dev)
        self.update_interface(self.read_devices())

    def create_mention(self, dev):
        name = dev[1] if dev[1] else dev[0]
        n = dev[2]; deci = round(dev[2]/10)
        newlabel = name+" "+str(n)+"% free"
        return (name, n, deci, newlabel)        

    def create_menu(self):
        # create initial basic menu
        self.initmenu = Gtk.Menu()
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()
        return self.initmenu

    def read_devices(self):
        # read the devices, look up their alias and the free sapace
        devdata = []
        data = subprocess.check_output(["df", "-h"]).decode("utf-8").splitlines()
        relevant = [l for l in data if all([
                    any([l.startswith("/dev/"), l.startswith("//")]),
                    not "/loop" in l])
                    ]
        for dev in relevant:
            data = dev.split(); name = data[0]; pseudo = None       
            free = 100-int([s.strip("%") for s in data if "%" in s][0])
            for al in alias:
                if al[0] in name:
                    pseudo = al[1]
                    break
            devdata.append((name, pseudo, free)) 
        return devdata

    def get_showfromfile(self):
        # read the preferred default device from file
        try:
            defdev = open(prefsfile).read().strip()
        except FileNotFoundError:
            defdev = None
        return defdev

    def stop(self, source):
        Gtk.main_quit()

ShowDevs()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

আইকনগুলি

এখানে চিত্র বর্ণনা লিখুন 0.png

এখানে চিত্র বর্ণনা লিখুন 1.png

এখানে চিত্র বর্ণনা লিখুন 2.png

এখানে চিত্র বর্ণনা লিখুন 3.png

এখানে চিত্র বর্ণনা লিখুন 4.png

এখানে চিত্র বর্ণনা লিখুন 5.png

এখানে চিত্র বর্ণনা লিখুন 6.png

এখানে চিত্র বর্ণনা লিখুন 7.png

এখানে চিত্র বর্ণনা লিখুন 8.png

এখানে চিত্র বর্ণনা লিখুন 9.png

এখানে চিত্র বর্ণনা লিখুন 10.png

ঠিককরা

সেট আপ করা সহজ:

  • একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন showusage.py
  • উপরের আইকনগুলি ঠিক ঠিক যেমন তাদের লেবেলে দেওয়া হয়েছে ঠিক তেমন একটিতে এবং স্ক্রিপ্টের মতো একই ডিরেক্টরিতে সংরক্ষণ করুন (ডান ক্লিক করুন> সংরক্ষণ করুন)
  • স্ক্রিপ্টের শিরোনামে, বিকল্পের নামগুলি (সম্ভব) সেট করুন aliasses। উদাহরণের নীচে:

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

    আপনি যদি অপরিবর্তিত ডিভাইসগুলি প্রদর্শন করতে চান তবে ব্যবহার করুন:

    alias = []

    ... এবং যদি আপনি চান, সতর্কতা দেখানোর জন্য প্রান্তিক পরিবর্তন করুন:

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

    এটাই

এটি চলছে

সূচকটি ব্যবহার করতে, কমান্ডটি চালান:

python3 /path/to/showusage.py

এটি স্টার্টআপ অ্যাপ্লিকেশনগুলিতে যুক্ত করতে, কমান্ডটি ব্যবহার করুন:

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

অ্যাপ্লিকেশনগুলি চয়ন করুন: ড্যাশ> প্রারম্ভিক অ্যাপ্লিকেশনগুলি> উপরে কমান্ড যুক্ত করুন, যুক্ত করুন।


16

দাবি অস্বীকার: আমি এই সূচকটির লেখক এবং এটি এই নির্দিষ্ট প্রশ্নের জন্য লেখা হয়েছে

অক্টোবর 23,2018 আপডেট করুন

সূচক এখন নেটওয়ার্ক শেয়ারের তালিকা সমর্থন করেমিহাইগালোসকে ধন্যবাদ

29 অক্টোবর, 2016 আপডেট করুন

সূচকটিতে এখন আনমাউন্টের কার্যকারিতা রয়েছে এবং ব্লক ডিভাইস নামের পরিবর্তে প্রতিটি পার্টিশনের ইউআইডি উল্লেখ করে উপকরণগুলি অনন্য করা হয়েছে sda1। দেখুন এর সাথে সম্পর্কিত বাগ রিপোর্ট

আপডেট, অক্টোবর 8,2016

সূচকটি এখন 2.0 সংস্করণে রয়েছে, কয়েকটি বৈশিষ্ট্য যুক্ত করেছে এবং এর নিজস্ব পিপিএ রয়েছে।

পিপিএ থেকে ইনস্টল করতে, টার্মিনালে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:

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

হিসাবে উল্লেখ রিলিজ নোট বৈশিষ্ট্যগুলির মধ্যে রয়েছে:

  • মেনু এন্ট্রিগুলির জন্য আইকন: প্রতিটি পার্টিশন / ডিভাইসের সাথে এটির সাথে উপযুক্ত আইকন সংযুক্ত থাকে। ডিভাইসটি যদি ইউএসবি ডিস্ক হয় তবে অপসারণযোগ্য মিডিয়া আইকন ব্যবহার করা হয়, এটি আইসো ইমেজ থাকলে - অপটিকাল ডিস্ক আইকন ব্যবহৃত হয় এবং স্পষ্টতই হার্ড ড্রাইভ / এসএসডি পার্টিশনে ড্রাইভ আইকন রয়েছে।
  • ব্যবহার এখন শতাংশ এবং মানব-পঠনযোগ্য মানগুলিতে (1024 এর শক্তি) দেখানো হয়েছে।
  • ব্যবহারের বারের মাধ্যমে ব্যবহারের গ্রাফিকাল উপস্থাপনা (ধারণাটির জন্য মেটেও সাল্টাকে অনেক ধন্যবাদ)
  • পছন্দসমূহ ডায়ালগ: ব্যবহারকারীরা নির্দিষ্ট মেনুতে প্রতিটি মেনু এন্ট্রি দেখতে চান না এমন ক্ষেত্রগুলি বন্ধ করতে পারেন। বিপুল পরিমাণে পার্টিশন সংযুক্ত থাকলে এটি সূচক মেনু পরিষ্কার রাখতে দেয়। (জাকারির অনুরোধের জন্য ধন্যবাদ)
  • পাঠ্য ব্যবধান: ডিফল্ট উবুন্টু ফন্ট এবং মনোস্পেস ফন্টের সাহায্যে, পাঠ্য এন্ট্রিগুলি পরিষ্কার পরিচ্ছন্ন চেহারা এবং তথ্যের পাঠযোগ্যতা বাড়ানোর জন্য স্পষ্টভাবে স্থানযুক্ত।
  • পার্টিশনের ক্ষেত্রে বিজ্ঞপ্তি বুদবুদগুলি মাউন্ট করা যায় না

নীচে ডিফল্ট উবুন্টু আইকন থিম সহ স্ক্রিনশট রয়েছে: এখানে চিত্র বর্ণনা লিখুন

উবুন্টু কাইলিন আইকন থিম

এখানে চিত্র বর্ণনা লিখুন

সমস্ত alচ্ছিক ক্ষেত্র বন্ধ আছে

এখানে চিত্র বর্ণনা লিখুন

নকশা পছন্দ এবং অতিরিক্ত চিন্তা:

এই সূচকটি তৈরিতে, আমি এমন একটি ইউটিলিটি অর্জন করার আশাবাদী যা উন্নত এবং নৈমিত্তিক ব্যবহারকারীদের জন্য উপযুক্ত। নতুন ব্যবহারকারীদের কমান্ড লাইন সরঞ্জাম হ্যান্ডলিংয়ের সাথে আমি যে কয়েকটি সমস্যার মুখোমুখি হতে পেরেছি তা আমি সমাধান করার চেষ্টা করেছি। এছাড়াও, ইউটিলিটি বহুমুখী হতে চেষ্টা করে।

পছন্দসমূহ ডায়ালগটি সূচকটিকে জটিল এবং / অথবা ব্যবহারকারীর ইচ্ছার মতো সহজতর করে তোলে। শীর্ষ প্যানেলে লেবেল থাকা এড়াতে এটি একটি নির্দিষ্ট নকশার সিদ্ধান্ত ছিল যাতে এটি ব্যবহারকারীর শীর্ষ প্যানেলের স্থানটি খুব বেশি না নেয়। এছাড়াও, এই সূচকটি বহুমুখী ইউটিলিটি হতে চেষ্টা করে যা মাউন্ট করা পার্টিশনগুলির পাশাপাশি তাদের নিজ নিজ ডিরেক্টরিগুলি খোলার অনুমতি দেয়। এটি কেবল ডিস্ক ব্যবহারের ইউটিলিটি হিসাবে নয়, ডিরেক্টরিগুলি দ্রুত খোলার জন্য নেভিগেশন ইউটিলিটি হিসাবেও ব্যবহার করা যেতে পারে।

ব্যবহারকারীদের পক্ষে এটি জানার জন্য সুবিধাজনক যে কোন পার্টিশনটি কোন ডিস্কে বাস করে, যেমন কমান্ড লাইন ব্যবহারের মাধ্যমে মাউন্ট দিয়ে ঘন ঘন বিভ্রান্তি এড়ানো যায় mount। পরিবর্তে এটি udisksctlসেই উদ্দেশ্যে (পাশাপাশি UDisks2ডেমন থেকে তথ্য প্রাপ্তির জন্য নামকরণ) নিয়োগ করে। এটি সম্পাদন করে না এমন একমাত্র কাজ হ'ল আনমাউন্টিং এবং এবং এই কারণে Open Disks Utilityমেনু এন্ট্রি অন্তর্ভুক্ত করা হয়।

মূলত আমি এটিকে আইস্ট্যাট মেন্যুলেটের মতো করার চেষ্টা করেছি, প্রকল্পটি এই লক্ষ্য থেকে সরিয়ে নিয়েছে - নির্দেশকটি এর নকশা এবং উদ্দেশ্যটিতে অনন্য in আমি আশা করি এটি অনেক ব্যবহারকারীর জন্য উপকারী হিসাবে পাওয়া যাবে এবং তাদের উবুন্টু অভিজ্ঞতাটি আরও সুখকর করে তুলবে।


udisks- সূচক (মূল উত্তর)

ডিস্কের ব্যবহার দেখানোর জন্য ইউনিটি ডেস্কটপ সহ উবুন্টুর নির্দেশক নমুনা স্ক্রিনশট

সংক্ষিপ্ত বিবরণ

উবুন্টু উইথ ইউনিটির জন্য এই সূচকটি আপনার মাউন্ট করা পার্টিশনগুলি সম্পর্কে সহজেই তথ্য দেখতে দেয়। এটি ওএস এক্স থেকে আইস্ট্যাট মেনু 3 মেন্যুলেটের সাথে দৃশ্যমান অনুরূপ হতে চেষ্টা করে

এন্ট্রিগুলি সাজানো হয়:

  • পার্টিশন
  • উপনাম (ব্যবহারকারী দ্বারা সেট করা থাকলে)
  • ডিস্ক ড্রাইভটি কোন পার্টিশনের অন্তর্ভুক্ত
  • পার্টিশনের মাউন্টপয়েন্ট (ডিরেক্টরি)
  • % ব্যবহার

প্রতিটি পার্টিশন এন্ট্রিতে ক্লিক করা হলে ডিফল্ট ফাইল ম্যানেজারে পার্টিশনের মাউন্টপয়েন্ট খুলবে

"আনমাউন্ট করা পার্টিশন" মেনুতে সিস্টেম দ্বারা বর্তমানে মাউন্ট করা সমস্ত পার্টিশন তালিকাভুক্ত করা হয়েছে। সেই সাবমেনুতে যে কোনও এন্ট্রি ক্লিক করা হলে সেই পার্টিশনটি স্বয়ংক্রিয়ভাবে মাউন্ট হবে, সাধারণত /media/username/drive-idফোল্ডারে

সূচকটি সিস্টেমের সাথে প্রদত্ত ডিফল্ট আইকনগুলি ব্যবহার করে, সুতরাং Unক্য তাত্পকরণ সরঞ্জাম বা অন্যান্য পদ্ধতি ব্যবহার করে আইকন থিম পরিবর্তন করার সাথে সাথে আইকনটি পরিবর্তন করা উচিত

দ্রষ্টব্য : আপনি যদি একই সময়ে "মেক এলিয়াস" বিকল্পের মাধ্যমে একের পরিবর্তে একাধিক উপকরণ যুক্ত করতে চান তবে আপনি ~/.partition_aliases.jsonকনফিগারেশন ফাইল সম্পাদনা করার মাধ্যমে এটি করতে পারেন । ফর্ম্যাটটি নিম্নরূপ:

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

স্থাপন

সহজ ইনস্টলেশন জন্য পিপিএ শীঘ্রই আসছে। । ।

গড় সময়ে, এখানে বিকল্প পদক্ষেপগুলি রয়েছে:

  1. cd /tmp
  2. wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
  3. unzip master.zip
  4. sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
  5. sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

এই সমস্ত পদক্ষেপগুলি একটি দুর্দান্ত সামান্য ইনস্টলেশন স্ক্রিপ্টে রাখা যেতে পারে:

#!/bin/bash

cd /tmp
rm master.zip*
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

সোর্স কোড

এই সূচকটির মূল কার্যকারিতা সহ মূল উত্স কোড (সংস্করণ ভি 1.0) নীচে পাওয়া যাবে। নতুন বৈশিষ্ট্যগুলির জন্য, এই প্রকল্পের জন্য গিটহাব সংগ্রহস্থলটি পরীক্ষা করুন । গিটহাবের ত্রুটিগুলির পাশাপাশি যেকোন বৈশিষ্ট্য অনুরোধের প্রতিবেদন করুন।

দ্য /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

অতিরিক্ত তথ্য:

উবুন্টু সাথ 16.04 পরীক্ষা:

এখানে চিত্র বর্ণনা লিখুন

সূচকটি সঠিকভাবে আচরণ করতে জিনোম ব্যবহারকারীদের একটি এক্সটেনশন (কেস্ট্যাটাসনটিফায়ারআইটেম / অ্যাপেন্ডিকেশন সমর্থন) প্রয়োজন:

এখানে চিত্র বর্ণনা লিখুন


1
নিশ্চিত করতে পারেন. এটি এক্সফেস 4 এর সাথে কাজ করে। সুন্দরভাবে সম্পন্ন! =)
স্থপতি

@ টেরেন্স আপনি সর্বাধিক নতুন সংস্করণটি দখল করতে চাইলে, উত্তরের আপডেটটি দেখুন। জ্যাচ ইতিমধ্যে তার এক্সএফসিতেও পরীক্ষা করেছেন, বলেছেন এটি কাজ করে
সের্গেই কোলডিয়াজহনি

শান্ত! আমাকে অবগত করার জন্য ধন্যবাদ. আমি এটিকে ঘূর্ণি দেব। =) আপডেট: দেখতে দেখতে বেশ ভালো লাগছে এবং আপনি যে আইকনটিতে পরিবর্তন করেছেন তা আমার পছন্দ হয়। সাবাশ! =)
টর্নেস

+1 কিন্তু চিহ্নিত করা উচিত "পিপিএ শীঘ্রই আসছে" এখন কি সরানো যেতে পারে?
WinEunuuchs2Unix

@ WinEunuuchs2 ইউনিক্স হ্যাঁ, সরানো যেতে পারে। এই উত্তর এবং সূচক নিজেই একটি বিশাল আপডেট প্রয়োজন তবে ইদানীং এর জন্য কোনও সময় নেই
সের্গেই কোলডিয়াজহনি

4

সিসমনিটর সূচক ইনস্টল করুন :

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

এবং এটিতে "ফাইল সিস্টেমে উপলভ্য স্থান" বিকল্প রয়েছে।


1

বেসিক সিসমনিটর ইন্ডিকেটর ব্যবহার করে আরও একটি উত্তর রয়েছে তবে আপনি নিজের পছন্দমতো তথ্য দিয়ে নিজস্ব কাস্টম প্যানেল তৈরি করতে পারেন।

গুগল (কমপক্ষে ভাল অনুসন্ধান করুন) আপনার বন্ধু

প্রথম পদক্ষেপটি পার্টিশন ব্যবহারের শতাংশের গণনা কীভাবে করা যায় তা নির্ধারণ করা :

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

প্যানেলে প্রতিধ্বনিত করতে বাশ স্ক্রিপ্ট তৈরি করুন

সিসমনিটর সূচকটিতে "কাস্টম" বিকল্প হিসাবে ব্যবহার করতে এখানে একটি বাশ স্ক্রিপ্ট রয়েছে । এটি এতে প্রথম তিনটি পার্টিশনে ব্যবহৃত শতাংশটি দেখায় /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]}"

নমুনা আউটপুট

দৌড়ানোর সময় এটির মতো দেখতে পাবেন:

সূচক সিনস্টোনিটার উদাহরণ.png

সিসমনিটর সূচকটিতে কাস্টম স্ক্রিপ্টগুলি ইনস্টল এবং কনফিগার করুন

সিজনমিটার ইন্ডিকেটর ইনস্টল এবং কাস্টম স্ক্রিপ্ট নির্ধারণের বিষয়ে বিস্তারিত নির্দেশাবলীর জন্য এই উত্তরটি দেখুন: অ্যাপ্লিকেশন ইন্ডিকেটর হিসাবে সিস্টেমে বাশ প্রদর্শন করতে পারে?


সুন্দর সমাধান। যদিও বিশাল সংখ্যক পার্টিশন এবং ডিভাইসগুলির দ্বারা দীর্ঘতর হতে পারে
সের্গি কলডিয়াজহনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.