import repository from arizona
[raven.git] / apps / mprepo / repopublish.py
1 """arizonaconfig
2    options=[["",     "--publishs3",         "publishs3",  "store_true",  None, False, None,  "publish files to S3"]]
3    includes=[]
4 """
5
6 import os
7 import sys
8 import shutil
9 import tempfile
10 import time
11 import arizonaconfig
12 import arizonageneral
13 import arizonareport
14
15 import repoconfig
16 import repobackend
17
18 class RepoPublishError:
19    def __init__(self, msg=None, file=None):
20       self.msg = msg
21       self.file = file
22
23 def ismetadatafile(string):
24     return string.endswith(".metadata")
25
26 def ismetalinkfile(string):
27     return string.endswith(".metalink")
28
29 # XXX should use repoclassify for this
30 def ispackage(string):
31     return  "rpm" in string or \
32             "tar" in string or \
33             "gz"  in string or \
34             "bz2" in string or \
35             "tgz" in string
36
37 def getLinkName(file):
38       filename = os.path.basename(file['name'])
39
40       if ispackage(filename):
41          if not "metahash" in file:
42             repobackend.extract_metadata(file)
43
44          if not "metahash" in file:
45             raise RepoPublishError(file = file, msg = "Unable to get link name")
46
47          linkname = filename + "-" + file['metahash']
48       else:
49          linkname = filename
50
51       return linkname
52
53 def publish_bittorrent(file):
54    pathname = file['name']
55
56    filename = os.path.basename(pathname)
57    target_dir = repoconfig.bittorrent_dir
58    linkname = None
59
60    arizonageneral.makedirs_existok(target_dir)
61
62    if ismetadatafile(filename) or ismetalinkfile(filename):
63        arizonareport.send_out(1, "publish_bittorrent: skipping metadata/metalink file " + filename);
64        return
65
66    linkname = getLinkName(file)
67
68    destname = os.path.join(target_dir, linkname)
69    arizonareport.send_out(1, "publish_bittorrent: copying " + pathname + " to " + destname)
70    try:
71       shutil.copy(pathname, destname)
72    except:
73       arizonareport.send_error(0, "error copying: "+ linkname + ": " + str( sys.exc_info()[0]) )
74
75 def publish_s3(file):
76    import storks3
77    storks3.init()
78
79    pathname = file['name']
80
81    filename = os.path.basename(pathname)
82    linkname = None
83
84    if ismetadatafile(filename) or ismetalinkfile(filename):
85       arizonareport.send_out(1, "Skipping metadata/metalink file " + file);
86       return
87
88    linkname = getLinkName(file)
89
90    # this should have been computed as a side effect of getLinkName
91    metahash = file.get("metahash", None)
92    metafile = file.get("metafile", None)
93
94    # upload the metafile, assuming we know what it is
95    if metafile:
96       metalinkname = linkname + ".metadata"
97
98       # prep some s3 metadata headers to go with the metafile. They will
99       # provide enough information to link metafile to the package.
100       s3MetafileMetadata = {}
101       s3MetafileMetadata['kind'] = "metafile"
102       s3MetafileMetadata['packagename'] = linkname
103       s3MetafileMetadata['package_localname'] = pathname
104       try:
105          arizonareport.send_out(1, "upload metafile to s3: " + metafile + " as " + metalinkname)
106          storks3.put_file(metafile, metalinkname)
107          arizonareport.send_out(1, "  success")
108       except IOError, e:
109           arizonareport.send_error(0, "error s3-copying: "+pathname+": "+ str( e ) )
110       except:
111           arizonareport.send_error(0, "error s3-copying: "+pathname+": "+ str( sys.exc_info()[0] ) )
112
113    # prep some s3 metadata headers to go with the package.
114    s3PackageMetadata = {}
115    s3PackageMetadata['kind'] = "package"
116    if metahash:
117        s3PackageMetadata['metahash'] = metahash
118    if metafile:
119        s3PackageMetadata['metafile'] = metafile
120
121    # upload the package
122    try:
123        arizonareport.send_out(1, "upload to s3: " + pathname + " as " + linkname)
124        storks3.put_file(pathname, linkname, s3PackageMetadata)
125        arizonareport.send_out(1, "  success")
126    except IOError, e:
127        arizonareport.send_error(0, "error s3-copying: "+pathname+": "+ str( e ) )
128    except:
129        arizonareport.send_error(0, "error s3-copying: "+pathname+": "+ str( sys.exc_info()[0] ) )
130
131
132
133 def publish(file):
134    arizonareport.send_out(1, "publish: publishing " + file['name'])
135
136    publish_bittorrent(file)
137
138    if arizonaconfig.get_option("publishs3"):
139       publish_s3(file)
140
141
142
143