-
Notifications
You must be signed in to change notification settings - Fork 2
/
format_disk.py
146 lines (127 loc) · 5.42 KB
/
format_disk.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
141
142
143
144
145
146
#!/usr/bin/python
__author__ = "Anirudh Srinivasan "
__copyright__ = "Copyright 2015"
__version__ = "1.0"
__maintainer__ = "Anirudh Srinivasan"
__email__ = "[email protected]"
__status__ = "Production"
from optparse import OptionParser
from subprocess import Popen, call, PIPE
from shlex import split
from commands import getstatusoutput
from os import mkdir
from os.path import basename , normpath
import time
parser = OptionParser()
parser.add_option('-d', '--drive', dest='drive', help='this is the name of the drive like sda, hdd etc..')
parser.add_option('-f', '--folder', dest='folder', help='this is the name of the directory like /data or /var/log')
parser.add_option('-t', '--fstype', dest='fstype', help='this is the type of filesystem you need like ext4 or xfs')
(opts, args) = parser.parse_args()
class FormatDrive(object):
'''This is a class that does end to end create partition, deal with lvm, make filesystem, extend filesystem, write to fstab and resize filesystem'''
def __init__(self, drive, folder, fstype):
self.drive = str(drive)
self.folder =str (folder)
self.fstype = str(fstype)
def fdisk(self):
'''This is a definition to perform fdisk the drive in the argument'''
before_pipe_cmd = 'echo -e "n\np\n1\n\n\nt\\n8e\nw"'
before_pipe_args = split(before_pipe_cmd)
after_pipe_cmd = "fdisk /dev/%s" %self.drive
after_pipe_args = split(after_pipe_cmd)
p1 = Popen(before_pipe_args, stdout=PIPE)
p2 = call(after_pipe_args, stdin=p1.stdout)
def partprobe(self):
'''This function performs the partprobe'''
#pprobe = "partprobe /dev/%s" %self.drive
pprobe = "partprobe"
pprobe1 = split(pprobe)
part = call(pprobe1)
def pvcreate(self):
'''This function creates the physical volume '''
pvcreate = call(["pvcreate", "/dev/%s1" %self.drive])
def volgroup(self):
'''This function creates the physical volume and also created the volume group'''
vgcreate = 'vgcreate -v vg_%s /dev/%s1' % (basename(normpath(self.folder)), self.drive)
status,output = getstatusoutput(vgcreate)
def lvm(self):
'''This function creates the logical volume'''
lvcreate ='lvcreate -v -l "100%FREE" -n lv_{0} vg_{1}' .format(basename(normpath(self.folder)), basename(normpath(self.folder)))
#lvcreate = 'lvcreate -v -l "100%FREE" -n lv_{0} vg_{1}' .format(self.folder, self.folder)
status,output = getstatusoutput(lvcreate)
print status
print output
def makefs(self):
'''This functions creates the filesystem on the /dev/mapper LVM device'''
if self.fstype == 'ext4':
mkfs = call(["mkfs.ext4", "/dev/mapper/vg_%s-lv_%s" % (basename(normpath(self.folder)),basename(normpath(self.folder)))])
elif self.fstype == 'xfs':
mkfs = call(["mkfs.xfs", "/dev/mapper/vg_%s-lv_%s" % (basename(normpath(self.folder)),basename(normpath(self.folder)))])
def makedir(self):
'''This function makes directory inthe /root level'''
path = "%s" %self.folder
mkdir( path, 0755 )
print '%s is created' %path
def write_to_fstab(self):
'''This function appends the filesystem info to the /etc/fstab'''
if self.fstype == 'ext4':
string = '/dev/mapper/vg_%s-lv_%s %s ext4 defaults 1 1' % (basename(normpath(self.folder)), basename(normpath(self.folder)), self.folder)
f = open("/etc/fstab",'a')
f.write(string + "\n")
f.close()
elif self.fstype == 'xfs':
string = '/dev/mapper/vg_%s-lv_%s %s xfs defaults 1 1' % (basename(normpath(self.folder)), basename(normpath(self.folder)), self.folder)
f = open("/etc/fstab",'a')
f.write(string + "\n")
f.close()
def filesystem_mount(self):
'''This is a simple function to mount all the drive'''
fsmount = 'mount -a'
status,output = getstatusoutput(fsmount)
def resizefs(self):
''' This method is to resize an existing filesystem'''
if self.fstype == 'ext4':
rs = 'resize2fs /dev/vg_%s/lv_%s' % (basename(normpath(self.folder)),basename(normpath(self.folder)))
status,output = getstatusoutput(rs)
elif self.fstype == 'xfs':
rs = 'xfs_growfs /dev/vg_%s/lv_%s' % (basename(normpath(self.folder)),basename(normpath(self.folder)))
status,output = getstatusoutput(rs)
def extend_vg(self):
'''Extending volume group'''
vgextend = 'vgextend vg_%s /dev/%s1' % (basename(normpath(self.folder)), self.drive)
status,output = getstatusoutput(vgextend)
def extend_lv(self):
'''Extending logical volume'''
lvextend = call(["lvextend", "-l", "+100%FREE", "/dev/vg_%s/lv_%s" % (basename(normpath(self.folder)),basename(normpath(self.folder)))])
def main():
x = FormatDrive(opts.drive, opts.folder, opts.fstype)
intake = raw_input("Do you want to extend of create a new filesystem ?")
if intake == 'create':
print "a new drive has been created"
x.fdisk()
x.partprobe()
x.pvcreate()
time.sleep(5)
x.volgroup()
time.sleep(5)
x.lvm()
x.makefs()
x.makedir()
x.write_to_fstab()
x.filesystem_mount()
if intake == 'extend':
print "a drive has been extended"
x.fdisk()
x.partprobe()
x.pvcreate()
x.extend_vg()
x.extend_lv()
x.resizefs()
if __name__ == '__main__':
if opts.drive == None or opts.folder == None or opts.fstype == None:
parser.print_help()
exit(-1)
main()
print 'The root folder is %s' %opts.folder
print 'the drive is %s' %opts.drive
print 'The fstype is %s' %opts.fstype