Update AUTHORS to review credit and split the list of people in original authors...
[catalyst.git] / catalyst / 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/"
22                         + self.settings["snapshot_name"]
23                         + self.settings["version_stamp"] + ".tar.bz2")
24                 self.settings["tmp_path"]=normpath(st+"/tmp/"+self.settings["target_subpath"])
25
26         def setup(self):
27                 x=normpath(self.settings["storedir"]+"/snapshots")
28                 if not os.path.exists(x):
29                         os.makedirs(x)
30
31         def mount_safety_check(self):
32                 pass
33
34         def run(self):
35                 if "PURGEONLY" in self.settings:
36                         self.purge()
37                         return
38
39                 if "PURGE" in self.settings:
40                         self.purge()
41
42                 self.setup()
43                 print "Creating Portage tree snapshot "+self.settings["version_stamp"]+\
44                         " from "+self.settings["portdir"]+"..."
45
46                 mytmp=self.settings["tmp_path"]
47                 if not os.path.exists(mytmp):
48                         os.makedirs(mytmp)
49
50                 cmd("rsync -a --delete --exclude /packages/ --exclude /distfiles/ " +
51                         "--exclude /local/ --exclude CVS/ --exclude .svn --filter=H_**/files/digest-* " +
52                         self.settings["portdir"] + "/ " + mytmp + "/%s/" % self.settings["repo_name"],
53                         "Snapshot failure", env=self.env)
54
55                 print "Compressing Portage snapshot tarball..."
56                 cmd("tar -I lbzip2 -cf " + self.settings["snapshot_path"] + " -C " +
57                         mytmp + " " + self.settings["repo_name"],
58                         "Snapshot creation failure",env=self.env)
59
60                 self.gen_contents_file(self.settings["snapshot_path"])
61                 self.gen_digest_file(self.settings["snapshot_path"])
62
63                 self.cleanup()
64                 print "snapshot: complete!"
65
66         def kill_chroot_pids(self):
67                 pass
68
69         def cleanup(self):
70                 print "Cleaning up..."
71
72         def purge(self):
73                 myemp=self.settings["tmp_path"]
74                 if os.path.isdir(myemp):
75                         print "Emptying directory",myemp
76                         """
77                         stat the dir, delete the dir, recreate the dir and set
78                         the proper perms and ownership
79                         """
80                         mystat=os.stat(myemp)
81                         """ There's no easy way to change flags recursively in python """
82                         if os.uname()[0] == "FreeBSD":
83                                 os.system("chflags -R noschg "+myemp)
84                         shutil.rmtree(myemp)
85                         os.makedirs(myemp,0755)
86                         os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
87                         os.chmod(myemp,mystat[ST_MODE])
88
89 def register(foo):
90         foo.update({"snapshot":snapshot_target})
91         return foo