initial commit: 1.5.0
[systemrescuecd.git] / portage-overlay / sys-apps / dumpdisklayout / files / restore.py
1 import sys, os
2 sys.path.append(os.path.abspath(os.curdir))
3 sys.path.append('/usr/lib/dumpdisklayout/modules/')
4 import re,os,commands,sys,datetime
5 import mod_checks
6 import mod_filesys
7 import mod_diskutil
8
9 FILEFORMVER='0.1.1'
10 hddlist=[] # list of harddisks found in the layout-file
11 volgroup={} # list of volume-groups and their pvs
12
13 # -------------------------------------------------------------------------------------
14 def check_filefmt(inlines):
15         for line in inlines:
16                 if not re.match('^fileformat!',line): continue
17                 filefmt=line.split('!')[1]
18                 if filefmt==FILEFORMVER:
19                         return 0
20                 else:
21                         print 'found file format %s and expected %s' % (filefmt, FILEFORMVER)
22                         return -1
23         return -1
24
25 def check_physhdd(inlines):
26         for line in inlines:
27                 if not (re.match('[:alnum:]*|[0-9]*![:alnum:]*![:alnum:]*', line)): continue
28                 (dev,size,vendor,model)=line.split('!')
29                 if not dev in mod_diskutil.list_disks():
30                         print 'Cannot find hard disk %s'%devname
31                         return -1
32                 devname='/dev/'+dev
33                 cursize=file('/sys/block/%s/size'%dev).readline().strip("\r\n").strip()
34                 if cursize==size:
35                         hddlist.append(dev)
36                 else:
37                         print 'size of hard disk does not match for device %s'%devname
38                         return -1
39         return 0
40
41 def rest_sfdisk(inlines):
42         for hdd in hddlist:
43                 sfdiskdat=''
44                 for line in inlines:
45                         if not re.match('^%s!'%hdd, line): continue
46                         line=line.replace('%s!'%hdd,'')
47                         sfdiskdat+=line+'\n'
48                 print sfdiskdat
49                 if sfdiskdat=='': continue
50                 cmd='echo "%s" | sfdisk /dev/%s'%(sfdiskdat,hdd)
51                 (status, output) = commands.getstatusoutput(cmd)
52                 print 'sfdisk returned %s'%status
53                 if not int(status) in (0,256):
54                         print 'sfdisk failed to restore disk /dev/%s'%hdd
55                         return -1
56         return 0
57
58 def rest_pv(inlines):
59         for line in inlines:
60                 data=line.split('!')
61                 if len(data)!=12: continue
62                 (devname,vgname,uuid)=(data[0],data[1],data[11])
63                 if not volgroup.has_key(vgname): 
64                         volgroup[vgname]=(devname+' ')
65                 else:
66                         volgroup[vgname]+=(devname+' ')
67                 commands.getstatusoutput('dd if=/dev/zero of=%s count=400 bs=512'%devname)
68                 cmd='pvcreate -ff -Zy -u %s %s'%(uuid, devname)
69                 print 'pv_exec %s'%cmd
70                 (status, output) = commands.getstatusoutput(cmd)
71                 if status!=0:
72                         print 'pvcreate failed (%s) with status %s'%(cmd,status)
73                         return -1
74         return 0
75
76 def rest_vg(inlines):
77         for line in inlines:
78                 data=line.split('!')
79                 if len(data)!=18: continue
80                 (vgname,uuid,lvmvers)=(data[0],data[16],data[17])
81                 cmd='vgcreate %s %s'%(vgname, volgroup[vgname])
82                 print 'vg_exec %s'%cmd
83                 (status, output) = commands.getstatusoutput(cmd)
84                 if status!=0:
85                         print 'vgcreate failed (%s) with status %s'%(cmd,status)
86                         return -1
87         return 0
88
89 def rest_lv(inlines):
90         for line in inlines:
91                 data=line.split('!')
92                 if len(data)!=13: continue
93                 lvname=data[0].split('/')[-1]
94                 vgname=data[1]
95                 lvsize=int(data[6])/2
96                 commands.getstatusoutput('dd if=/dev/zero of=%s count=4 bs=512'%data[0])
97                 cmd='lvcreate -n %s -L %sk %s'%(lvname, lvsize, vgname)
98                 print 'lv_exec %s'%cmd
99                 (status, output) = commands.getstatusoutput(cmd)
100                 if status!=0:
101                         print 'lvcreate failed (%s) with status %s'%(cmd,status)
102                         return -1
103         return 0
104
105 def rest_fs(inlines):
106         for line in inlines:
107                 if len(line.split('!'))!=4: continue
108                 (devname,filesys,label,attrib)=line.split('!')
109                 res=mod_filesys.format(devname, filesys, label, attrib)
110                 if res!=0:
111                         print 'failed to format device %s'%devname
112                         return -1
113         return 0