forked from vmware/photon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathselectdisk.py
executable file
·140 lines (116 loc) · 5.8 KB
/
selectdisk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#
# Copyright (C) 2015 vmware inc.
#
# Author: Mahmoud Bassiouny <[email protected]>
from device import Device
from window import Window
from actionresult import ActionResult
from menu import Menu
from confirmwindow import ConfirmWindow
import modules.commons
from progressbar import ProgressBar
class SelectDisk(object):
def __init__(self, maxy, maxx, install_config):
self.install_config = install_config
self.menu_items = []
self.maxx = maxx
self.maxy = maxy
self.win_width = 70
self.win_height = 16
self.win_starty = (self.maxy - self.win_height) // 2
self.win_startx = (self.maxx - self.win_width) // 2
self.menu_starty = self.win_starty + 6
self.menu_height = 5
self.progress_padding = 5
self.progress_width = self.win_width - self.progress_padding
self.progress_bar = ProgressBar(self.win_starty + 6,
self.win_startx + (self.progress_padding // 2),
self.progress_width, new_win=True)
self.disk_buttom_items = []
self.disk_buttom_items.append(('<Custom>', self.custom_function, False))
self.disk_buttom_items.append(('<Auto>', self.auto_function, False))
self.window = Window(self.win_height, self.win_width, self.maxy, self.maxx,
'Select a disk', True,
items=self.disk_buttom_items, menu_helper=self.save_index,
position=2, tab_enabled=False)
self.partition_window = Window(self.win_height, self.win_width, self.maxy,
self.maxx, 'Partition', True)
self.devices = Device.refresh_devices()
def guided_partitions(self, params):
if not 'diskindex' in self.install_config:
return ActionResult(False, None)
device_index = self.install_config['diskindex']
menu_height = 9
menu_width = 40
menu_starty = (self.maxy - menu_height) // 2 + 5
self.install_config['delete_partition'] = True
confrim_window = ConfirmWindow(menu_height, menu_width, self.maxy,
self.maxx, menu_starty,
'This will erase the disk.\nAre you sure?')
confirmed = confrim_window.do_action().result['yes']
if confirmed == False:
self.install_config['skipPrevs'] = True
return ActionResult(False, {'goBack':True})
self.install_config['skipPrevs'] = False
self.progress_bar.initialize('Partitioning...')
self.progress_bar.show()
self.progress_bar.show_loading('Partitioning')
# Do the partitioning
if 'partitionsnumber' in self.install_config:
if int(self.install_config['partitionsnumber']) == 0:
partitions_data = modules.commons.partition_disk(
self.devices[device_index].path, modules.commons.default_partitions)
else:
partitions = []
for i in range(int(self.install_config['partitionsnumber'])):
if len(self.install_config[str(i)+'partition_info'+str(0)]) == 0:
sizedata = 0
else:
sizedata = int(self.install_config[str(i) + 'partition_info' + str(0)])
mtdata = self.install_config[str(i) + 'partition_info' + str(2)]
typedata = self.install_config[str(i) + 'partition_info'+str(1)]
partitions = partitions + [{"mountpoint": mtdata,
"size": sizedata,
"filesystem": typedata},]
partitions_data = modules.commons.partition_disk(
self.devices[device_index].path, partitions)
else:
partitions_data = modules.commons.partition_disk(
self.devices[device_index].path, modules.commons.default_partitions)
if partitions_data == None:
self.partition_window.adderror('Partitioning failed, you may try again')
else:
self.install_config['disk'] = partitions_data
self.progress_bar.hide()
return ActionResult(partitions_data != None, None)
def display(self, params):
if 'skipPrevs' in self.install_config:
self.install_config['skipPrevs'] = False
self.window.addstr(0, 0, 'Please select a disk and a method how to partition it:\n' +
'Auto - single partition for /, no swap partition.\n' +
'Custom - for customized partitioning')
self.disk_menu_items = []
# Fill in the menu items
for index, device in enumerate(self.devices):
#if index > 0:
self.disk_menu_items.append(
(
'{2} - {1} @ {0}'.format(device.path, device.size, device.model),
self.save_index,
index
))
self.disk_menu = Menu(self.menu_starty, self.maxx, self.disk_menu_items,
self.menu_height, tab_enable=False)
self.disk_menu.can_save_sel(True)
self.window.set_action_panel(self.disk_menu)
return self.window.do_action()
def save_index(self, device_index):
self.install_config['diskindex'] = device_index
return ActionResult(True, None)
def auto_function(self, params): #default is no partition
self.install_config['autopartition'] = True
self.install_config['partitionsnumber'] = 0
return ActionResult(True, None)
def custom_function(self, params): #custom minimize partition number is 1
self.install_config['autopartition'] = False
return ActionResult(True, None)