catalyst 2.0.12.1
[catalyst.git] / modules / snapshot_target.py
1 """
2 Snapshot target
3 """
4
5 import os
6 from catalyst_support import *
7 from generic_stage_target import *
8
9 class snapshot_target(generic_stage_target):
10         """
11         Builder class for snapshots.
12         """
13         def __init__(self,myspec,addlargs):
14                 self.required_values=["version_stamp","target"]
15                 self.valid_values=["version_stamp","target"]
16
17                 generic_target.__init__(self,myspec,addlargs)
18                 self.settings=myspec
19                 self.settings["target_subpath"]="portage"
20                 st=self.settings["storedir"]
21                 self.settings["snapshot_path"]=normpath(st+"/snapshots/portage-"+self.settings["version_stamp"]\
22                         +".tar.bz2")
23                 self.settings["tmp_path"]=normpath(st+"/tmp/"+self.settings["target_subpath"])
24
25         def setup(self):
26                 x=normpath(self.settings["storedir"]+"/snapshots")
27                 if not os.path.exists(x):
28                         os.makedirs(x)
29
30         def mount_safety_check(self):
31                 pass
32
33         def run(self):
34                 if self.settings.has_key("PURGEONLY"):
35                         self.purge()
36                         return
37
38                 if self.settings.has_key("PURGE"):
39                         self.purge()
40
41                 self.setup()
42                 print "Creating Portage tree snapshot "+self.settings["version_stamp"]+\
43                         " from "+self.settings["portdir"]+"..."
44
45                 mytmp=self.settings["tmp_path"]
46                 if not os.path.exists(mytmp):
47                         os.makedirs(mytmp)
48
49                 cmd("rsync -a --delete --exclude /packages/ --exclude /distfiles/ --exclude /local/ --exclude CVS/ --exclude .svn --filter=H_**/files/digest-* "+\
50                         self.settings["portdir"]+"/ "+mytmp+"/portage/","Snapshot failure",env=self.env)
51
52                 print "Compressing Portage snapshot tarball..."
53                 cmd("tar -I lbzip2 -cf "+self.settings["snapshot_path"]+" -C "+mytmp+" portage",\
54                         "Snapshot creation failure",env=self.env)
55
56                 self.gen_contents_file(self.settings["snapshot_path"])
57                 self.gen_digest_file(self.settings["snapshot_path"])
58
59                 self.cleanup()
60                 print "snapshot: complete!"
61
62         def kill_chroot_pids(self):
63                 pass
64
65         def cleanup(self):
66                 print "Cleaning up..."
67
68         def purge(self):
69                 myemp=self.settings["tmp_path"]
70                 if os.path.isdir(myemp):
71                         print "Emptying directory",myemp
72                         """
73                         stat the dir, delete the dir, recreate the dir and set
74                         the proper perms and ownership
75                         """
76                         mystat=os.stat(myemp)
77                         """ There's no easy way to change flags recursively in python """
78                         if os.uname()[0] == "FreeBSD":
79                                 os.system("chflags -R noschg "+myemp)
80                         shutil.rmtree(myemp)
81                         os.makedirs(myemp,0755)
82                         os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
83                         os.chmod(myemp,mystat[ST_MODE])
84
85 def register(foo):
86         foo.update({"snapshot":snapshot_target})
87         return foo