দাবি অস্বীকার: আমি এই সূচকটির লেখক এবং এটি এই নির্দিষ্ট প্রশ্নের জন্য লেখা হয়েছে
অক্টোবর 23,2018 আপডেট করুন
সূচক এখন নেটওয়ার্ক শেয়ারের তালিকা সমর্থন করে । মিহাইগালোসকে ধন্যবাদ
29 অক্টোবর, 2016 আপডেট করুন
সূচকটিতে এখন আনমাউন্টের কার্যকারিতা রয়েছে এবং ব্লক ডিভাইস নামের পরিবর্তে প্রতিটি পার্টিশনের ইউআইডি উল্লেখ করে উপকরণগুলি অনন্য করা হয়েছে sda1
। দেখুন এর সাথে সম্পর্কিত বাগ রিপোর্ট
আপডেট, অক্টোবর 8,2016
সূচকটি এখন 2.0 সংস্করণে রয়েছে, কয়েকটি বৈশিষ্ট্য যুক্ত করেছে এবং এর নিজস্ব পিপিএ রয়েছে।
পিপিএ থেকে ইনস্টল করতে, টার্মিনালে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:
sudo apt-add-repository ppa:udisks-indicator-team/ppa
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"
}
স্থাপন
সহজ ইনস্টলেশন জন্য পিপিএ শীঘ্রই আসছে। । ।
গড় সময়ে, এখানে বিকল্প পদক্ষেপগুলি রয়েছে:
cd /tmp
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop
এই সমস্ত পদক্ষেপগুলি একটি দুর্দান্ত সামান্য ইনস্টলেশন স্ক্রিপ্টে রাখা যেতে পারে:
#!/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 পরীক্ষা:
সূচকটি সঠিকভাবে আচরণ করতে জিনোম ব্যবহারকারীদের একটি এক্সটেনশন (কেস্ট্যাটাসনটিফায়ারআইটেম / অ্যাপেন্ডিকেশন সমর্থন) প্রয়োজন:
/dev/sdb1
এবং এর ঠিক পাশেই এর ব্যবহার? শতাংশে বা আসল গিগাবাইটে?