import repository from arizona
[raven.git] / apps / stork / storkrepodl.py
1 #! /usr/bin/env python
2 """
3 <Program Name>
4    storkrepodl.py
5
6 <Started>
7    5-6-09
8
9 <Author>
10    Programmed by .
11
12 <Purpose>
13    Routines for synchronizing with the repositories. Each repository is
14    contatcted, its metafile fetched, and an arizonatransfer synchronize
15    is performed. 
16
17 <See Also>
18    storkreposync.py -- command-line front end for syncing with repos
19    storkrepolist.py -- maintains a list of repositories
20 """
21
22 import os
23 import sys
24 import tempfile
25 import arizonageneral
26 import shutil
27 import arizonaconfig
28 import arizonacrypt
29 import arizonareport
30 import arizonatransfer
31 import dircache
32 import random
33 import fnmatch
34 import storkerror
35 import ravenlib.package.storkpackage
36 import storkrepolist
37 import storkversion
38
39 glo_initialized = False
40 glo_repo_sections = []
41
42 def sync(force = False, maskList=[]):
43    global glo_initialized
44    global glo_repo_sections
45
46    if (glo_initialized) and (not force):
47       return
48
49    glo_repo_sections = arizonaconfig.get_option("repositories")
50    if not glo_repo_sections:
51       # compatibility mode -- None causes arizonaconfig.get_option_section
52       #   to default to the same behaviour as arizonaconfig.get_option
53       glo_repo_sections = [None]
54
55    # check repinfo
56    for repo_section in glo_repo_sections:
57       if arizonaconfig.get_option_section("repinfo", repo_section) == None:
58          if repo_section:
59              arizonareport.send_error(0, "repository " + repo_section + ":")
60          arizonareport.send_error(0, "Repository package information locations must be" + \
61                                      " specified either on the command line" + \
62                                      " or in the configuration file.  See the" + \
63                                      " `--repositorypackageinfo' option.")
64          sys.exit(1)
65
66       # check to see if the user tried to override the localinfo variable for
67       # a specific repository. If so, then complain because this is not yet
68       # implemented
69       # TODO: finish this (see __find_package_fnlist_on_one_criteria)
70       if arizonaconfig.get_option_section("localinfo", repo_section) != arizonaconfig.get_option("localinfo"):
71          arizonareport.send_error(0, "cannot use localinfo variable inside repository section")
72          sys.exit(1)
73
74       download_repositories(repo_section,
75                             arizonaconfig.get_option_section("repinfo", repo_section),
76                             arizonaconfig.get_option_section("localinfo", repo_section),
77                             maskList)
78
79    glo_initialized = True
80
81
82
83
84
85 def download_repositories(repo_section, repo_names, local_dir, maskList=[]):
86    """
87    <Purpose>
88       Download all packageinfo, tpfile, pacman files from all repositories
89    <Arguments>
90       repo_names
91          a list of repository packageinfo names/directories (for example,
92             [quiver.cs.arizona.edu/packageinfo, nr06.cs.arizona.edu/packageinfo]
93          NOTE: this does not appear to be used. the config value of repinfo is
94             used instead.
95       local_dir
96          local directory to place repository data files in
97       update_ok
98          True if files should be downloaded
99    """
100    # download from each repository in our list
101    repkeys = arizonaconfig.get_option("repkey")
102    for repo_section in glo_repo_sections:
103       for i, repo in enumerate(arizonaconfig.get_option("repinfo", repo_section)):
104          # assuming config options repkey is a list that is in the same order
105          # as the repinfo, we have a key for this repo only if we have a key
106          # at the current index
107          if repkeys and len(repkeys) > i:
108             repkey = repkeys[i]
109          else:
110             repkey = None
111          try:
112             download_repository(repo, local_dir, repkey, maskList)
113          except IOError, e:
114             arizonareport.send_error(1,  \
115                "Warning: Failed to update repository " + str(repo) + \
116                   " Error :" + str(e))
117
118
119
120
121
122
123 def download_repository(repo_name, local_dir, repo_key=None, maskList=[]):
124    localdir = storkrepolist.compute_repo_localdir(local_dir, repo_name)
125
126    # make sure localdir exists
127    try:
128       os.makedirs(localdir)
129    except OSError:
130       pass
131
132    # if the directory isn't there, then we can't download anything
133    if not os.path.isdir(localdir):
134       arizonareport.send_error(1, "Cannot create repository data dir: " + localdir)
135       return False
136
137    # setup paths for downloading files
138    source = repo_name
139    dest = localdir
140
141    arizonareport.send_out(3, "Retrieving package data files from: " + str(source))
142    if arizonareport.get_verbosity() > 1:
143       width = arizonareport.console_size()[1]
144       if width == None:
145          width = 70
146    else:
147       width = 0
148
149    (success, updated_files, all_files) = \
150        arizonatransfer.sync_remote_dir(source, dest, width,
151                                       metafile_signature_key=repo_key,
152                                       hashfuncs = [ravenlib.package.storkpackage.get_package_metadata_hash, arizonatransfer.default_hashfunc],
153                                       maskList=maskList)
154
155    if success:
156        storkrepolist.unpack_repo_tarballs(dest, all_files)
157
158    arizonareport.send_out(1, "Finished.")
159
160    return True
161
162
163