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