733 lines
30 KiB
Python
733 lines
30 KiB
Python
#!/usr/local/bin/python
|
|
"""
|
|
Copyright (c) 2010-2017, GhostBSD. All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
1. Redistribution's of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. Redistribution's in binary form must reproduce the above
|
|
copyright notice,this list of conditions and the following
|
|
disclaimer in the documentation and/or other materials provided
|
|
with the distribution.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING,
|
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGE.
|
|
"""
|
|
#
|
|
# partition.py v 1.3 Friday, January 17 2014 Eric Turgeon
|
|
#
|
|
# auto_partition.py create and delete partition slice for GhostBSD installer
|
|
import gi
|
|
gi.require_version('Gtk', '3.0')
|
|
from gi.repository import Gtk, Gdk
|
|
import os
|
|
import shutil
|
|
from db_partition import partition_repos, disk_query, Delete_partition
|
|
from db_partition import partition_query, label_query, bios_or_uefi
|
|
from db_partition import autoDiskPartition, autoFreeSpace, first_is_free
|
|
from db_partition import createLabel, scheme_query, how_partition
|
|
from db_partition import diskSchemeChanger, createSlice, createPartition
|
|
from db_partition import efi_exist
|
|
|
|
|
|
# Folder use pr the installer.
|
|
tmp = "/tmp/.gbinstall/"
|
|
installer = "/usr/local/lib/gbinstall/"
|
|
query = "sh /usr/local/lib/gbinstall/backend-query/"
|
|
if not os.path.exists(tmp):
|
|
os.makedirs(tmp)
|
|
|
|
add_part = 'gpart add'
|
|
disk_part = '%sdisk-part.sh' % query
|
|
disk_label = '%sdisk-label.sh' % query
|
|
detect_sheme = '%sdetect-sheme.sh' % query
|
|
|
|
part = '%sdisk-part.sh' % query
|
|
memory = 'sysctl hw.physmem'
|
|
disk_list = '%sdisk-list.sh' % query
|
|
disk_info = '%sdisk-info.sh' % query
|
|
disk_label = '%sdisk-label.sh' % query
|
|
disk_schem = '%sscheme' % tmp
|
|
disk_file = '%sdisk' % tmp
|
|
psize = '%spart_size' % tmp
|
|
logo = "/usr/local/lib/gbi/logo.png"
|
|
Part_label = '%spartlabel' % tmp
|
|
part_schem = '%sscheme' % tmp
|
|
partitiondb = "%spartitiondb/" % tmp
|
|
boot_file = "%sboot" % tmp
|
|
ufs_Partiton_list = []
|
|
|
|
|
|
cssProvider = Gtk.CssProvider()
|
|
# if os.path.exists(rcconfgbsd):
|
|
# print(True)
|
|
cssProvider.load_from_path('/usr/local/lib/gbinstall/ghostbsd-style.css')
|
|
# elif os.path.exists(rcconfdbsd):
|
|
# cssProvider.load_from_path('/usr/local/lib/gbi/desktopbsd-style.css')
|
|
screen = Gdk.Screen.get_default()
|
|
styleContext = Gtk.StyleContext()
|
|
styleContext.add_provider_for_screen(screen, cssProvider,
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
|
|
|
|
|
|
class Partitions():
|
|
|
|
def on_fs(self, widget):
|
|
self.fs = widget.get_active_text()
|
|
|
|
def on_label(self, widget):
|
|
self.label = widget.get_active_text()
|
|
|
|
def save_selection(self):
|
|
pass
|
|
|
|
def on_add_label(self, widget, entry, inumb, path, create):
|
|
if self.fs == '' or self.label == '':
|
|
pass
|
|
else:
|
|
fs = self.fs
|
|
lb = self.label
|
|
cnumb = entry.get_value_as_int()
|
|
lnumb = inumb - cnumb
|
|
createLabel(path, lnumb, cnumb, lb, fs, create)
|
|
self.window.hide()
|
|
self.update()
|
|
|
|
def on_add_partition(self, widget, entry, inumb, path, create):
|
|
if self.fs == '' or self.label == '':
|
|
pass
|
|
else:
|
|
fs = self.fs
|
|
lb = self.label
|
|
cnumb = entry.get_value_as_int()
|
|
lnumb = inumb - cnumb
|
|
createPartition(path, lnumb, inumb, cnumb, lb, fs, create)
|
|
self.window.hide()
|
|
self.update()
|
|
|
|
def cancel(self, widget):
|
|
self.window.hide()
|
|
|
|
def labelEditor(self, path, pslice, size, scheme, modify):
|
|
numb = int(size)
|
|
self.window = Gtk.Window()
|
|
self.window.set_title("Add Partition")
|
|
self.window.set_border_width(0)
|
|
self.window.set_size_request(480, 200)
|
|
self.window.set_icon_from_file(logo)
|
|
box1 = Gtk.VBox(False, 0)
|
|
self.window.add(box1)
|
|
box1.show()
|
|
box2 = Gtk.VBox(False, 10)
|
|
box2.set_border_width(10)
|
|
box1.pack_start(box2, True, True, 0)
|
|
box2.show()
|
|
# create label
|
|
# label0 = Gtk.Label("Create Partition Label")
|
|
table = Gtk.Table(1, 2, True)
|
|
label1 = Gtk.Label("Type:")
|
|
label2 = Gtk.Label("Size(MB):")
|
|
label3 = Gtk.Label("Mount point:")
|
|
self.fstype = Gtk.ComboBoxText()
|
|
self.fstype.append_text('UFS')
|
|
self.fstype.append_text('UFS+S')
|
|
self.fstype.append_text('UFS+J')
|
|
self.fstype.append_text('UFS+SUJ')
|
|
self.fstype.append_text('SWAP')
|
|
if scheme == 'GPT':
|
|
if bios_or_uefi() == "UEFI":
|
|
self.fstype.append_text("UEFI")
|
|
self.fs = "UEFI"
|
|
else:
|
|
self.fstype.append_text("BOOT")
|
|
self.fs = "BOOT"
|
|
if self.fs == "UEFI" and efi_exist(self.disk) is False:
|
|
if not os.path.exists(Part_label):
|
|
self.fstype.set_active(5)
|
|
elif len(self.prttn) == 0:
|
|
self.fstype.set_active(5)
|
|
elif self.fs == "BOOT":
|
|
if not os.path.exists(Part_label):
|
|
self.fstype.set_active(5)
|
|
elif len(self.prttn) == 0:
|
|
self.fstype.set_active(5)
|
|
elif self.lablebehind == "/":
|
|
self.fstype.set_active(4)
|
|
self.fs = "SWAP"
|
|
else:
|
|
self.fstype.set_active(3)
|
|
self.fs = "UFS+SUJ"
|
|
self.fstype.connect("changed", self.on_fs)
|
|
adj = Gtk.Adjustment(numb, 0, numb, 1, 100, 0)
|
|
self.entry = Gtk.SpinButton(adjustment=adj)
|
|
if modify is True:
|
|
self.entry.set_editable(False)
|
|
else:
|
|
self.entry.set_editable(True)
|
|
self.mountpoint = Gtk.ComboBoxText()
|
|
# self.mountpoint.append_text('select labels')
|
|
self.label = "none"
|
|
self.mountpoint.append_text('none')
|
|
# The space for root '/ ' is to recognise / from the file.
|
|
self.mountpoint.append_text('/')
|
|
if os.path.exists(Part_label):
|
|
if scheme == 'GPT' and len(self.prttn) == 1:
|
|
self.mountpoint.append_text('/boot')
|
|
elif scheme == 'MBR' and len(self.prttn) == 0:
|
|
self.mountpoint.append_text('/boot')
|
|
elif scheme == 'MBR' and not os.path.exists(Part_label):
|
|
self.mountpoint.append_text('/boot')
|
|
self.mountpoint.append_text('/etc')
|
|
self.mountpoint.append_text('/root')
|
|
self.mountpoint.append_text('/tmp')
|
|
self.mountpoint.append_text('/usr')
|
|
self.mountpoint.append_text('/usr/home')
|
|
self.mountpoint.append_text('/var')
|
|
self.mountpoint.set_active(0)
|
|
self.mountpoint.connect("changed", self.on_label)
|
|
# table.attach(label0, 0, 2, 0, 1)
|
|
table.attach(label1, 0, 1, 1, 2)
|
|
table.attach(self.fstype, 1, 2, 1, 2)
|
|
table.attach(label2, 0, 1, 2, 3)
|
|
table.attach(self.entry, 1, 2, 2, 3)
|
|
table.attach(label3, 0, 1, 3, 4)
|
|
table.attach(self.mountpoint, 1, 2, 3, 4)
|
|
box2.pack_start(table, False, False, 0)
|
|
box2 = Gtk.HBox(False, 10)
|
|
box2.set_border_width(5)
|
|
box1.pack_start(box2, False, True, 0)
|
|
box2.show()
|
|
# Add button
|
|
bbox = Gtk.HButtonBox()
|
|
bbox.set_border_width(5)
|
|
bbox.set_spacing(10)
|
|
button = Gtk.Button(stock=Gtk.STOCK_CANCEL)
|
|
button.connect("clicked", self.cancel)
|
|
bbox.add(button)
|
|
button = Gtk.Button(stock=Gtk.STOCK_ADD)
|
|
if modify is False:
|
|
if scheme == 'MBR':
|
|
button.connect("clicked", self.on_add_label, self.entry,
|
|
numb, path, True)
|
|
elif scheme == 'GPT' and self.fs == 'BOOT':
|
|
button.connect("clicked", self.on_add_partition, self.entry,
|
|
numb, path, True)
|
|
elif scheme == 'GPT' and self.fs == 'UEFI' and efi_exist(self.disk) is False:
|
|
button.connect("clicked", self.on_add_partition, self.entry,
|
|
numb, path, True)
|
|
else:
|
|
button.connect("clicked", self.on_add_partition, self.entry,
|
|
numb, path, False)
|
|
else:
|
|
if scheme == 'MBR':
|
|
button.connect("clicked", self.on_add_label, self.entry, numb,
|
|
path, False)
|
|
elif scheme == 'GPT':
|
|
button.connect("clicked", self.on_add_partition, self.entry,
|
|
numb, path, False)
|
|
bbox.add(button)
|
|
box2.pack_end(bbox, True, True, 5)
|
|
self.window.show_all()
|
|
|
|
def sheme_selection(self, combobox):
|
|
model = combobox.get_model()
|
|
index = combobox.get_active()
|
|
data = model[index][0]
|
|
value = data.partition(':')[0]
|
|
self.scheme = value
|
|
|
|
def add_gpt_mbr(self, widget, data):
|
|
diskSchemeChanger(self.scheme, self.path, self.slice, self.size)
|
|
self.update()
|
|
self.window.hide()
|
|
if data is False:
|
|
if scheme_query(self.path) == "MBR" and self.path[1] < 4:
|
|
self.sliceEditor()
|
|
elif scheme_query(self.path) == "GPT":
|
|
self.labelEditor(self.path, self.slice, self.size, 'GPT', False)
|
|
|
|
def autoSchemePartition(self, widget):
|
|
diskSchemeChanger(self.scheme, self.path, self.slice, self.size)
|
|
self.update()
|
|
autoDiskPartition(self.slice, self.size, self.scheme)
|
|
self.update()
|
|
self.window.hide()
|
|
|
|
def schemeEditor(self, data):
|
|
self.window = Gtk.Window()
|
|
self.window.set_title("Partition Scheme")
|
|
self.window.set_border_width(0)
|
|
self.window.set_size_request(400, 150)
|
|
self.window.set_icon_from_file("/usr/local/lib/gbi/logo.png")
|
|
box1 = Gtk.VBox(False, 0)
|
|
self.window.add(box1)
|
|
box1.show()
|
|
box2 = Gtk.VBox(False, 10)
|
|
box2.set_border_width(10)
|
|
box1.pack_start(box2, True, True, 0)
|
|
box2.show()
|
|
# Creating MBR or GPT drive
|
|
label = Gtk.Label('<b>Select a partition scheme for this drive:</b>')
|
|
label.set_use_markup(True)
|
|
# Adding a combo box to selecting MBR or GPT sheme.
|
|
self.scheme = 'GPT'
|
|
shemebox = Gtk.ComboBoxText()
|
|
shemebox.append_text("GPT: GUID Partition Table")
|
|
shemebox.append_text("MBR: DOS Partition")
|
|
shemebox.connect('changed', self.sheme_selection)
|
|
shemebox.set_active(0)
|
|
table = Gtk.Table(1, 2, True)
|
|
table.attach(label, 0, 2, 0, 1)
|
|
table.attach(shemebox, 0, 2, 1, 2)
|
|
box2.pack_start(table, False, False, 0)
|
|
box2 = Gtk.HBox(False, 10)
|
|
box2.set_border_width(5)
|
|
box1.pack_start(box2, False, True, 0)
|
|
box2.show()
|
|
# Add create_scheme button
|
|
bbox = Gtk.HButtonBox()
|
|
bbox.set_border_width(5)
|
|
bbox.set_spacing(10)
|
|
button = Gtk.Button(stock=Gtk.STOCK_ADD)
|
|
if data is None:
|
|
button.connect("clicked", self.autoSchemePartition)
|
|
else:
|
|
button.connect("clicked", self.add_gpt_mbr, data)
|
|
bbox.add(button)
|
|
box2.pack_end(bbox, True, True, 5)
|
|
self.window.show_all()
|
|
|
|
def get_value(self, widget, entry):
|
|
psize = int(entry.get_value_as_int())
|
|
rs = int(self.size) - psize
|
|
createSlice(psize, rs, self.path)
|
|
self.update()
|
|
self.window.hide()
|
|
|
|
def sliceEditor(self):
|
|
numb = int(self.size)
|
|
self.window = Gtk.Window()
|
|
self.window.set_title("Add Partition")
|
|
self.window.set_border_width(0)
|
|
self.window.set_size_request(400, 150)
|
|
self.window.set_icon_from_file("/usr/local/lib/gbi/logo.png")
|
|
box1 = Gtk.VBox(False, 0)
|
|
self.window.add(box1)
|
|
box1.show()
|
|
box2 = Gtk.VBox(False, 10)
|
|
box2.set_border_width(10)
|
|
box1.pack_start(box2, True, True, 0)
|
|
box2.show()
|
|
# create Partition slice
|
|
# label = Gtk.Label('<b>Create a New Partition Slice</b>')
|
|
# label.set_use_markup(True)
|
|
# label.set_alignment(0, .5)
|
|
table = Gtk.Table(1, 2, True)
|
|
label1 = Gtk.Label("Size(MB):")
|
|
adj = Gtk.Adjustment(numb, 0, numb, 1, 100, 0)
|
|
self.entry = Gtk.SpinButton(adjustment=adj)
|
|
self.entry.set_numeric(True)
|
|
# table.attach(label, 0, 2, 0, 1)
|
|
table.attach(label1, 0, 1, 1, 2)
|
|
table.attach(self.entry, 1, 2, 1, 2)
|
|
box2.pack_start(table, False, False, 0)
|
|
box2 = Gtk.HBox(False, 10)
|
|
box2.set_border_width(5)
|
|
box1.pack_start(box2, False, True, 0)
|
|
box2.show()
|
|
# Add button
|
|
bbox = Gtk.HButtonBox()
|
|
bbox.set_border_width(5)
|
|
bbox.set_spacing(10)
|
|
button = Gtk.Button(stock=Gtk.STOCK_CANCEL)
|
|
button.connect("clicked", self.cancel)
|
|
bbox.add(button)
|
|
button = Gtk.Button(stock=Gtk.STOCK_ADD)
|
|
button.connect("clicked", self.get_value, self.entry)
|
|
bbox.add(button)
|
|
box2.pack_end(bbox, True, True, 5)
|
|
self.window.show_all()
|
|
|
|
def update(self):
|
|
oldpath = self.path
|
|
self.Tree_Store()
|
|
self.treeview.expand_all()
|
|
self.treeview.row_activated(oldpath, self.treeview.get_columns()[0])
|
|
self.treeview.set_cursor(oldpath)
|
|
|
|
def delete_partition(self, widget):
|
|
part = self.slice
|
|
Delete_partition(part, self.path)
|
|
self.update()
|
|
|
|
def delete_create_button(self):
|
|
bbox = Gtk.HButtonBox()
|
|
bbox.set_border_width(5)
|
|
bbox.set_spacing(10)
|
|
self.create_bt = Gtk.Button("Create")
|
|
self.create_bt.connect("clicked", self.create_partition)
|
|
bbox.add(self.create_bt)
|
|
self.delete_bt = Gtk.Button("Delete")
|
|
self.delete_bt.connect("clicked", self.delete_partition)
|
|
bbox.add(self.delete_bt)
|
|
self.modifi_bt = Gtk.Button("Modify")
|
|
self.modifi_bt.connect("clicked", self.modify_partition)
|
|
# bbox.add(self.modifi_bt)
|
|
self.revert_bt = Gtk.Button("Revert")
|
|
self.revert_bt.connect("clicked", self.revertChange)
|
|
bbox.add(self.revert_bt)
|
|
self.auto_bt = Gtk.Button("Auto")
|
|
self.auto_bt.connect("clicked", self.autoPartition)
|
|
bbox.add(self.auto_bt)
|
|
return bbox
|
|
|
|
def modify_partition(self, widget):
|
|
if len(self.path) == 3:
|
|
if self.slice != 'freespace':
|
|
self.labelEditor(self.path, self.slice, self.size, 'MBR', True)
|
|
elif len(self.path) == 2 and self.slice != 'freespace':
|
|
if scheme_query(self.path) == "GPT":
|
|
self.labelEditor(self.path, self.slice, self.size, 'GPT', True)
|
|
|
|
def autoPartition(self, widget):
|
|
if len(self.path) == 3:
|
|
pass
|
|
# elif len(self.path) == 1 and self.scheme is None:
|
|
# self.schemeEditor(None)
|
|
# self.update()
|
|
# elif len(self.path) == 1:
|
|
# autoDiskPartition(self.slice, self.size, self.scheme)
|
|
# self.Tree_Store()
|
|
# self.treeview.expand_all()
|
|
# self.treeview.set_cursor(self.path)
|
|
elif self.slice == 'freespace':
|
|
autoFreeSpace(self.path, self.size)
|
|
self.Tree_Store()
|
|
self.treeview.expand_all()
|
|
self.treeview.set_cursor(self.path)
|
|
elif len(self.path) == 2:
|
|
pass
|
|
else:
|
|
pass
|
|
self.update()
|
|
|
|
def revertChange(self, widget):
|
|
if os.path.exists(partitiondb):
|
|
shutil.rmtree(partitiondb)
|
|
if os.path.exists(tmp + 'create'):
|
|
os.remove(tmp + 'create')
|
|
if os.path.exists(tmp + 'delete'):
|
|
os.remove(tmp + 'delete')
|
|
if os.path.exists(tmp + 'destroy'):
|
|
os.remove(tmp + 'destroy')
|
|
if os.path.exists(Part_label):
|
|
os.remove(Part_label)
|
|
partition_repos()
|
|
self.Tree_Store()
|
|
self.treeview.expand_all()
|
|
|
|
def create_partition(self, widget):
|
|
if len(self.path) == 2 and how_partition(self.path) == 1 and self.slice == 'freespace':
|
|
self.schemeEditor(False)
|
|
elif len(self.path) == 3:
|
|
if self.slice == 'freespace':
|
|
self.labelEditor(self.path, self.slice, self.size, 'MBR', False)
|
|
elif len(self.path) == 2 and self.slice == 'freespace':
|
|
if scheme_query(self.path) == "MBR" and self.path[1] < 4:
|
|
self.sliceEditor()
|
|
elif scheme_query(self.path) == "GPT":
|
|
self.labelEditor(self.path, self.slice, self.size, 'GPT', False)
|
|
else:
|
|
if how_partition(self.path) == 1:
|
|
self.schemeEditor(True)
|
|
elif how_partition(self.path) == 0:
|
|
self.schemeEditor(True)
|
|
else:
|
|
pass
|
|
|
|
def partition_selection(self, widget):
|
|
model, self.iter, = widget.get_selected()
|
|
if self.iter is not None:
|
|
self.path = model.get_path(self.iter)
|
|
tree_iter3 = model.get_iter(self.path[0])
|
|
self.scheme = model.get_value(tree_iter3, 3)
|
|
self.disk = model.get_value(tree_iter3, 0)
|
|
tree_iter = model.get_iter(self.path)
|
|
self.slice = model.get_value(tree_iter, 0)
|
|
self.size = model.get_value(tree_iter, 1)
|
|
if len(self.path) == 2 and self.path[1] > 0 and self.scheme == "MBR":
|
|
pathbehind = str(self.path[0]) + ":" + str(int(self.path[1] - 1))
|
|
tree_iter2 = model.get_iter(pathbehind)
|
|
self.slicebehind = model.get_value(tree_iter2, 0)
|
|
sl = int(self.path[1]) + 1
|
|
if 'freespace' in self.slicebehind:
|
|
slbehind = self.path[1]
|
|
else:
|
|
slbehind = int(self.slicebehind.partition('s')[2])
|
|
elif len(self.path) == 2 and self.path[1] > 0 and self.scheme == "GPT":
|
|
pathbehind = str(self.path[0]) + ":" + str(int(self.path[1] - 1))
|
|
tree_iter2 = model.get_iter(pathbehind)
|
|
self.slicebehind = model.get_value(tree_iter2, 0)
|
|
self.lablebehind = model.get_value(tree_iter2, 2)
|
|
sl = int(self.path[1]) + 1
|
|
if 'freespace' in self.slicebehind:
|
|
slbehind = self.path[1]
|
|
else:
|
|
slbehind = int(self.slicebehind.partition('p')[2])
|
|
elif len(self.path) == 3 and self.path[2] > 0 and self.scheme == "MBR":
|
|
if self.path[1] > 0:
|
|
pathbehind1 = str(self.path[0]) + ":" + str(int(self.path[1] - 1))
|
|
tree_iter2 = model.get_iter(pathbehind1)
|
|
self.slicebehind = model.get_value(tree_iter2, 0)
|
|
else:
|
|
self.slicebehind = None
|
|
pathbehind2 = str(self.path[0]) + ":" + str(self.path[1]) + ":" + str(int(self.path[2] - 1))
|
|
tree_iter3 = model.get_iter(pathbehind2)
|
|
self.lablebehind = model.get_value(tree_iter3, 2)
|
|
sl = int(self.path[1]) + 1
|
|
if self.slicebehind is None:
|
|
slbehind = self.path[1]
|
|
elif 'freespace' in self.slicebehind:
|
|
slbehind = self.path[1]
|
|
else:
|
|
slbehind = int(self.slicebehind.partition('s')[2])
|
|
else:
|
|
self.slicebehind = None
|
|
self.lablebehind = None
|
|
sl = 1
|
|
slbehind = 0
|
|
if 'freespace' in self.slice:
|
|
if self.path[1] > 3 and self.scheme == "MBR":
|
|
self.create_bt.set_sensitive(False)
|
|
elif self.slicebehind is None:
|
|
self.create_bt.set_sensitive(True)
|
|
elif sl == slbehind:
|
|
self.create_bt.set_sensitive(False)
|
|
elif slbehind > 4:
|
|
self.create_bt.set_sensitive(False)
|
|
else:
|
|
self.create_bt.set_sensitive(True)
|
|
self.delete_bt.set_sensitive(False)
|
|
self.modifi_bt.set_sensitive(False)
|
|
self.auto_bt.set_sensitive(True)
|
|
elif 's' in self.slice:
|
|
self.create_bt.set_sensitive(False)
|
|
self.delete_bt.set_sensitive(True)
|
|
# self.modifi_bt.set_sensitive(True)
|
|
self.auto_bt.set_sensitive(False)
|
|
elif 'p' in self.slice:
|
|
self.create_bt.set_sensitive(False)
|
|
self.delete_bt.set_sensitive(True)
|
|
# self.modifi_bt.set_sensitive(True)
|
|
self.auto_bt.set_sensitive(False)
|
|
else:
|
|
self.delete_bt.set_sensitive(False)
|
|
self.modifi_bt.set_sensitive(False)
|
|
self.auto_bt.set_sensitive(False)
|
|
how_many_prt = how_partition(self.path)
|
|
firstisfree = first_is_free(self.path)
|
|
if how_many_prt == 1 and firstisfree == 'freespace':
|
|
self.create_bt.set_sensitive(False)
|
|
elif how_partition(self.path) == 0:
|
|
self.create_bt.set_sensitive(True)
|
|
else:
|
|
self.create_bt.set_sensitive(False)
|
|
if os.path.exists(Part_label):
|
|
rd = open(Part_label, 'r')
|
|
self.prttn = rd.readlines()
|
|
rtbt = False
|
|
for line in self.prttn:
|
|
if "/boot\n" in line:
|
|
rtbt = True
|
|
break
|
|
# If Find GPT scheme.
|
|
if os.path.exists(disk_schem):
|
|
rschm = open(disk_schem, 'r')
|
|
schm = rschm.readlines()[0]
|
|
efi = efi_exist(self.disk)
|
|
if 'GPT' in schm:
|
|
if len(self.prttn) >= 2:
|
|
if 'BOOT' in self.prttn[0]:
|
|
if rtbt is True and "/boot\n" not in self.prttn[1]:
|
|
self.button3.set_sensitive(False)
|
|
elif "/boot\n" in self.prttn[1]:
|
|
if len(self.prttn) >= 3:
|
|
if '/\n' in self.prttn[2]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif '/\n' in self.prttn[1]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif 'UEFI' in self.prttn[0] and efi is False:
|
|
if rtbt is True and "/boot\n" not in self.prttn[1]:
|
|
self.button3.set_sensitive(False)
|
|
elif "/boot\n" in self.prttn[1]:
|
|
if len(self.prttn) >= 3:
|
|
if '/\n' in self.prttn[2]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif '/\n' in self.prttn[1]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif rtbt is True and "/boot\n" not in self.prttn[1]:
|
|
self.button3.set_sensitive(False)
|
|
elif "/boot\n" in self.prttn[0] and efi is True:
|
|
if len(self.prttn) >= 2:
|
|
if '/\n' in self.prttn[1]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif '/\n' in self.prttn[0] and efi is True:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
if len(self.prttn) >= 1:
|
|
if "/boot\n" in self.prttn[0]:
|
|
if len(self.prttn) >= 2:
|
|
if '/\n' in self.prttn[1]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
elif '/\n' in self.prttn[0]:
|
|
self.button3.set_sensitive(True)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
else:
|
|
self.button3.set_sensitive(False)
|
|
|
|
def __init__(self, button3):
|
|
self.button3 = button3
|
|
self.vbox1 = Gtk.VBox(False, 0)
|
|
self.vbox1.show()
|
|
# Title
|
|
label = Gtk.Label("UFS Partition Editor", name="Header")
|
|
label.set_property("height-request", 40)
|
|
self.vbox1.pack_start(label, False, False, 0)
|
|
|
|
# Choosing disk to Select Create or delete partition.
|
|
label = Gtk.Label("<b>Select a drive:</b>")
|
|
label.set_use_markup(True)
|
|
|
|
sw = Gtk.ScrolledWindow(hexpand=True, vexpand=True)
|
|
sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
|
|
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
|
|
self.store = Gtk.TreeStore(str, str, str, str, 'gboolean')
|
|
self.Tree_Store()
|
|
self.treeview = Gtk.TreeView(self.store)
|
|
self.treeview.set_model(self.store)
|
|
self.treeview.set_rules_hint(True)
|
|
cell = Gtk.CellRendererText()
|
|
column = Gtk.TreeViewColumn(None, cell, text=0)
|
|
column_header = Gtk.Label('Partition')
|
|
column_header.set_use_markup(True)
|
|
column_header.show()
|
|
column.set_widget(column_header)
|
|
column.set_sort_column_id(0)
|
|
cell2 = Gtk.CellRendererText()
|
|
column2 = Gtk.TreeViewColumn(None, cell2, text=0)
|
|
column_header2 = Gtk.Label('Size(MB)')
|
|
column_header2.set_use_markup(True)
|
|
column_header2.show()
|
|
column2.set_widget(column_header2)
|
|
cell3 = Gtk.CellRendererText()
|
|
column3 = Gtk.TreeViewColumn(None, cell3, text=0)
|
|
column_header3 = Gtk.Label('Mount Point')
|
|
column_header3.set_use_markup(True)
|
|
column_header3.show()
|
|
column3.set_widget(column_header3)
|
|
cell4 = Gtk.CellRendererText()
|
|
column4 = Gtk.TreeViewColumn(None, cell4, text=0)
|
|
column_header4 = Gtk.Label('System/Type')
|
|
column_header4.set_use_markup(True)
|
|
column_header4.show()
|
|
column4.set_widget(column_header4)
|
|
column.set_attributes(cell, text=0)
|
|
column2.set_attributes(cell2, text=1)
|
|
column3.set_attributes(cell3, text=2)
|
|
column4.set_attributes(cell4, text=3)
|
|
self.treeview.append_column(column)
|
|
self.treeview.append_column(column2)
|
|
self.treeview.append_column(column3)
|
|
self.treeview.append_column(column4)
|
|
self.treeview.set_reorderable(True)
|
|
self.treeview.expand_all()
|
|
self.tree_selection = self.treeview.get_selection()
|
|
self.tree_selection.set_mode(Gtk.SelectionMode.SINGLE)
|
|
self.tree_selection.connect("changed", self.partition_selection)
|
|
sw.add(self.treeview)
|
|
sw.show()
|
|
|
|
box2 = Gtk.VBox(False, 10)
|
|
box2.set_border_width(10)
|
|
self.vbox1.pack_start(box2, True, True, 0)
|
|
box2.show()
|
|
box2.pack_start(sw, True, True, 0)
|
|
|
|
box2 = Gtk.HBox(False, 10)
|
|
box2.set_border_width(0)
|
|
self.vbox1.pack_start(box2, False, False, 0)
|
|
box2.show()
|
|
self.scheme = 'GPT'
|
|
box2.pack_start(self.delete_create_button(),
|
|
False, False, 10)
|
|
return
|
|
|
|
def Tree_Store(self):
|
|
self.store.clear()
|
|
for disk in disk_query():
|
|
shem = disk[-1]
|
|
piter = self.store.append(None, [disk[0], str(disk[1]),
|
|
disk[2], disk[3], True])
|
|
if shem == "GPT":
|
|
for pi in partition_query(disk[0]):
|
|
self.store.append(piter, [pi[0], str(pi[1]), pi[2],
|
|
pi[3], True])
|
|
elif shem == "MBR":
|
|
for pi in partition_query(disk[0]):
|
|
piter1 = self.store.append(piter, [pi[0], str(pi[1]),
|
|
pi[2], pi[3], True])
|
|
if pi[0] == 'freespace':
|
|
pass
|
|
else:
|
|
for li in label_query(pi[0]):
|
|
self.store.append(piter1, [li[0], str(li[1]),
|
|
li[2], li[3], True])
|
|
return self.store
|
|
|
|
def get_model(self):
|
|
self.tree_selection.select_path(0)
|
|
return self.vbox1
|