2013-06-27 00:11:09 +02:00
|
|
|
from base import Task
|
|
|
|
from common import phases
|
2013-07-01 22:06:42 +02:00
|
|
|
from common.tools import log_check_call
|
2013-08-11 18:00:19 +02:00
|
|
|
from bootstrap import Bootstrap
|
2013-09-15 13:19:45 +02:00
|
|
|
import volume
|
2013-06-27 00:11:09 +02:00
|
|
|
|
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
class Format(Task):
|
2013-06-27 00:11:09 +02:00
|
|
|
description = 'Formatting the volume'
|
|
|
|
phase = phases.volume_preparation
|
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-22 21:20:09 +02:00
|
|
|
for partition in info.volume.partition_map.partitions:
|
|
|
|
partition.format()
|
2013-06-27 00:11:09 +02:00
|
|
|
|
|
|
|
|
|
|
|
class TuneVolumeFS(Task):
|
|
|
|
description = 'Tuning the bootstrap volume filesystem'
|
|
|
|
phase = phases.volume_preparation
|
2013-11-21 15:54:42 +01:00
|
|
|
predecessors = [Format]
|
2013-06-27 00:11:09 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-15 13:19:45 +02:00
|
|
|
import re
|
2013-06-27 22:00:01 +02:00
|
|
|
# Disable the time based filesystem check
|
2013-09-15 13:19:45 +02:00
|
|
|
for partition in info.volume.partition_map.partitions:
|
|
|
|
if re.match('^ext[2-4]$', partition.filesystem) is not None:
|
|
|
|
log_check_call(['/sbin/tune2fs', '-i', '0', partition.device_path])
|
2013-06-27 00:11:09 +02:00
|
|
|
|
|
|
|
|
|
|
|
class AddXFSProgs(Task):
|
|
|
|
description = 'Adding `xfsprogs\' to the image packages'
|
|
|
|
phase = phases.preparation
|
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
include, exclude = info.img_packages
|
|
|
|
include.add('xfsprogs')
|
2013-06-27 22:00:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
class CreateMountDir(Task):
|
2013-09-15 13:19:45 +02:00
|
|
|
description = 'Creating mountpoint for the root partition'
|
2013-06-27 22:00:01 +02:00
|
|
|
phase = phases.volume_mounting
|
|
|
|
|
|
|
|
def run(self, info):
|
2013-07-01 22:06:42 +02:00
|
|
|
import os
|
2013-09-15 16:59:56 +02:00
|
|
|
info.root = os.path.join(info.workspace, 'root')
|
2013-06-27 22:00:01 +02:00
|
|
|
os.makedirs(info.root)
|
|
|
|
|
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
class MountRoot(Task):
|
|
|
|
description = 'Mounting the root partition'
|
2013-06-27 22:00:01 +02:00
|
|
|
phase = phases.volume_mounting
|
2013-11-21 15:54:42 +01:00
|
|
|
predecessors = [CreateMountDir]
|
2013-06-27 22:00:01 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-22 21:20:09 +02:00
|
|
|
info.volume.partition_map.root.mount(info.root)
|
2013-06-27 22:00:01 +02:00
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
class MountBoot(Task):
|
|
|
|
description = 'Mounting the boot partition'
|
|
|
|
phase = phases.volume_mounting
|
2013-11-21 15:54:42 +01:00
|
|
|
predecessors = [MountRoot]
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-22 21:20:09 +02:00
|
|
|
info.volume.partition_map.boot.mount(info.boot_dir)
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
class CreateBootMountDir(Task):
|
2013-09-15 18:26:22 +02:00
|
|
|
description = 'Creating mountpoint for the boot partition'
|
2013-09-15 13:19:45 +02:00
|
|
|
phase = phases.volume_mounting
|
2013-11-21 15:54:42 +01:00
|
|
|
successors = [MountBoot]
|
|
|
|
predecessors = [MountRoot]
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
import os
|
2013-09-22 21:20:09 +02:00
|
|
|
info.boot_dir = os.path.join(info.root, 'boot')
|
|
|
|
os.makedirs(info.boot_dir)
|
2013-06-27 22:21:43 +02:00
|
|
|
|
|
|
|
|
2013-07-01 20:48:51 +02:00
|
|
|
class MountSpecials(Task):
|
|
|
|
description = 'Mounting special block devices'
|
|
|
|
phase = phases.os_installation
|
2013-11-21 15:54:42 +01:00
|
|
|
predecessors = [Bootstrap]
|
2013-07-01 20:48:51 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-15 13:19:45 +02:00
|
|
|
info.volume.mount_specials()
|
2013-07-01 20:48:51 +02:00
|
|
|
|
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
class UnmountRoot(Task):
|
|
|
|
description = 'Unmounting the bootstrap volume'
|
2013-07-01 20:48:51 +02:00
|
|
|
phase = phases.volume_unmounting
|
2013-11-21 15:54:42 +01:00
|
|
|
successors = [volume.Detach]
|
2013-07-01 20:48:51 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-22 21:20:09 +02:00
|
|
|
info.volume.partition_map.root.unmount()
|
2013-07-01 20:48:51 +02:00
|
|
|
|
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
class UnmountBoot(Task):
|
|
|
|
description = 'Unmounting the boot partition'
|
2013-06-27 22:21:43 +02:00
|
|
|
phase = phases.volume_unmounting
|
2013-11-21 15:54:42 +01:00
|
|
|
successors = [UnmountRoot]
|
2013-06-27 22:21:43 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-09-22 21:20:09 +02:00
|
|
|
info.volume.partition_map.boot.unmount()
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
class UnmountSpecials(Task):
|
|
|
|
description = 'Unmunting special block devices'
|
|
|
|
phase = phases.volume_unmounting
|
2013-11-21 15:54:42 +01:00
|
|
|
successors = [UnmountRoot]
|
2013-09-15 13:19:45 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
info.volume.unmount_specials()
|
2013-06-27 22:21:43 +02:00
|
|
|
|
|
|
|
|
|
|
|
class DeleteMountDir(Task):
|
|
|
|
description = 'Deleting mountpoint for the bootstrap volume'
|
|
|
|
phase = phases.volume_unmounting
|
2013-11-21 15:54:42 +01:00
|
|
|
predecessors = [UnmountRoot]
|
2013-06-27 22:21:43 +02:00
|
|
|
|
|
|
|
def run(self, info):
|
2013-07-01 22:06:42 +02:00
|
|
|
import os
|
2013-06-27 22:21:43 +02:00
|
|
|
os.rmdir(info.root)
|
|
|
|
del info.root
|
2013-07-07 13:02:04 +02:00
|
|
|
|
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
class FStab(Task):
|
|
|
|
description = 'Adding partitions to the fstab'
|
2013-07-07 13:02:04 +02:00
|
|
|
phase = phases.system_modification
|
|
|
|
|
|
|
|
def run(self, info):
|
|
|
|
import os.path
|
2013-09-25 23:27:31 +02:00
|
|
|
p_map = info.volume.partition_map
|
2013-10-06 13:40:27 +02:00
|
|
|
mount_points = [{'path': '/',
|
|
|
|
'partition': p_map.root,
|
|
|
|
'dump': '1',
|
|
|
|
'pass_num': '1',
|
|
|
|
}]
|
2013-09-25 23:27:31 +02:00
|
|
|
if hasattr(p_map, 'boot'):
|
2013-10-06 13:40:27 +02:00
|
|
|
mount_points.append({'path': '/boot',
|
|
|
|
'partition': p_map.boot,
|
|
|
|
'dump': '1',
|
|
|
|
'pass_num': '2',
|
|
|
|
})
|
2013-09-25 23:27:31 +02:00
|
|
|
if hasattr(p_map, 'swap'):
|
2013-10-06 13:40:27 +02:00
|
|
|
mount_points.append({'path': 'none',
|
|
|
|
'partition': p_map.swap,
|
|
|
|
'dump': '1',
|
|
|
|
'pass_num': '0',
|
|
|
|
})
|
2013-09-25 23:27:31 +02:00
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
fstab_lines = []
|
2013-10-06 13:40:27 +02:00
|
|
|
for mount_point in mount_points:
|
|
|
|
partition = mount_point['partition']
|
2013-09-15 13:19:45 +02:00
|
|
|
mount_opts = ['defaults']
|
2013-10-06 13:40:27 +02:00
|
|
|
fstab_lines.append('UUID={uuid} {mountpoint} {filesystem} {mount_opts} {dump} {pass_num}'
|
2013-09-15 13:19:45 +02:00
|
|
|
.format(uuid=partition.get_uuid(),
|
2013-10-06 13:40:27 +02:00
|
|
|
mountpoint=mount_point['path'],
|
2013-09-15 13:19:45 +02:00
|
|
|
filesystem=partition.filesystem,
|
2013-10-06 13:40:27 +02:00
|
|
|
mount_opts=','.join(mount_opts),
|
|
|
|
dump=mount_point['dump'],
|
|
|
|
pass_num=mount_point['pass_num']))
|
2013-08-10 20:03:20 +02:00
|
|
|
|
2013-09-15 13:19:45 +02:00
|
|
|
fstab_path = os.path.join(info.root, 'etc/fstab')
|
|
|
|
with open(fstab_path, 'w') as fstab:
|
|
|
|
fstab.write('\n'.join(fstab_lines))
|
2013-10-06 00:46:54 +02:00
|
|
|
fstab.write('\n')
|