src/modules/client/image.py
changeset 116 9c9942a52984
parent 111 647c91609117
child 135 a1e20e9a9845
equal deleted inserted replaced
115:6b4cc194a4d4 116:9c9942a52984
    26 import ConfigParser
    26 import ConfigParser
    27 import getopt
    27 import getopt
    28 import os
    28 import os
    29 import re
    29 import re
    30 import urllib
    30 import urllib
       
    31 import urlparse
    31 # import uuid           # XXX interesting 2.5 module
    32 # import uuid           # XXX interesting 2.5 module
    32 
    33 
    33 import pkg.catalog as catalog
    34 import pkg.catalog as catalog
    34 import pkg.fmri as fmri
    35 import pkg.fmri as fmri
    35 import pkg.manifest as manifest
    36 import pkg.manifest as manifest
   339                                     for d in os.listdir(os.path.join(thedir, v))
   340                                     for d in os.listdir(os.path.join(thedir, v))
   340                                 ]
   341                                 ]
   341 
   342 
   342                 return dependents
   343                 return dependents
   343 
   344 
       
   345         def retrieve_catalogs(self):
       
   346                 for auth in self.gen_authorities():
       
   347                         # XXX Mirror selection and retrieval policy?
       
   348 
       
   349                         # Ignore http_proxy for localhost case, by overriding
       
   350                         # default proxy behaviour of urlopen().
       
   351                         proxy_uri = None
       
   352                         netloc = urlparse.urlparse(auth["origin"])[1]
       
   353                         if urllib.splitport(netloc)[0] == "localhost":
       
   354                                 proxy_uri = {}
       
   355 
       
   356                         uri = urlparse.urljoin(auth["origin"], "catalog")
       
   357 
       
   358                         c = urllib.urlopen(uri, proxies=proxy_uri)
       
   359 
       
   360                         # compare headers
       
   361                         data = c.read()
       
   362 
       
   363                         # Filename should be reduced to host\:port
       
   364                         cfile = file("%s/catalog/%s" % (self.imgdir,
       
   365                             auth["prefix"]), "w")
       
   366                         print >>cfile, data
       
   367 
   344         def reload_catalogs(self):
   368         def reload_catalogs(self):
   345                 cdir = "%s/%s" % (self.imgdir, "catalog")
   369                 cdir = "%s/%s" % (self.imgdir, "catalog")
   346                 for cf in os.listdir(cdir):
   370                 for auth in self.gen_authorities():
   347                         c = catalog.Catalog()
   371                         c = catalog.Catalog()
   348                         c.load("%s/%s" % (cdir, cf))
   372                         c.load("%s/%s" % (cdir, auth["prefix"]))
   349 
   373 
   350                         self.catalogs[cf] = c
   374                         self.catalogs[auth["prefix"]] = c
   351 
       
   352                         # XXX XXX
       
   353                         # build up authorities
       
   354 
   375 
   355         def gen_known_packages(self):
   376         def gen_known_packages(self):
   356                 for c in self.catalogs.values():
   377                 for c in self.catalogs.values():
   357                         for pf in c.gen_package_versions():
   378                         for pf in c.gen_package_versions():
   358                                 yield pf
   379                                 yield pf
   377                         if opt == "-u":
   398                         if opt == "-u":
   378                                 upgradable_only = True
   399                                 upgradable_only = True
   379                         if opt == "-v":
   400                         if opt == "-v":
   380                                 verbose = True
   401                                 verbose = True
   381 
   402 
   382 
       
   383                 if verbose:
   403                 if verbose:
   384                         fmt_str = "%-64s %-10s %c%c%c%c"
   404                         fmt_str = "%-64s %-10s %c%c%c%c"
   385                 else:
   405                 else:
   386                         fmt_str = "%-50s %-10s %c%c%c%c"
   406                         fmt_str = "%-50s %-10s %c%c%c%c"
   387 
   407 
   388                 proot = "%s/pkg" % self.imgdir
   408                 proot = "%s/pkg" % self.imgdir
   389 
   409 
   390                 # XXX if len(pargs) > 0, then pkgs_known is pargs and all_known
   410                 if len(pargs):
   391                 # is unused
   411                         pkgs_known = [ m[1]
   392 
   412                             for p in pargs
   393                 if all_known:
   413                             for m in self.get_regex_matching_fmris(p) ]
   394                         # XXX Iterate through catalogs, building up list of
   414 
   395                         # packages.
   415                 elif all_known:
   396                         pkgs_known = [ str(pf) for pf in self.gen_known_packages() ]
   416                         pkgs_known = [ pf for pf in
       
   417                             self.gen_known_packages() ]
   397 
   418 
   398                 else:
   419                 else:
   399                         pkgs_known = [ urllib.unquote("%s@%s" % (pd, vd))
   420                         pkgs_known = [ fmri.PkgFmri(urllib.unquote("%s@%s" %
       
   421                             (pd, vd)), None)
   400                             for pd in sorted(os.listdir(proot))
   422                             for pd in sorted(os.listdir(proot))
   401                             for vd in sorted(os.listdir("%s/%s" % (proot, pd)))
   423                             for vd in sorted(os.listdir("%s/%s" % (proot, pd)))
   402                             if os.path.exists("%s/%s/%s/installed" %
   424                             if os.path.exists("%s/%s/%s/installed" %
   403                                 (proot, pd, vd)) ]
   425                                 (proot, pd, vd)) ]
   404 
   426 
   405                 if len(pkgs_known) == 0:
   427                 if len(pkgs_known) == 0:
   406                         print "pkg: no packages installed"
   428                         if len(pargs):
       
   429                                 print "pkg: no matching packages installed"
       
   430                         else:
       
   431                                 print "pkg: no packages installed"
   407                         return
   432                         return
   408 
   433 
   409                 print fmt_str % ("FMRI", "STATE", "U", "F", "I", "X")
   434                 print fmt_str % ("FMRI", "STATE", "U", "F", "I", "X")
   410 
   435 
   411                 for p in pkgs_known:
   436                 for p in pkgs_known:
   412                         f = fmri.PkgFmri(p, None)
       
   413 
       
   414                         upgradable = "-"
   437                         upgradable = "-"
   415                         frozen = "-"
   438                         frozen = "-"
   416                         incorporated = "-"
   439                         incorporated = "-"
   417                         excludes = "-"
   440                         excludes = "-"
   418 
   441 
   419                         if len(self.get_matching_pkgs(f)) > 1:
   442                         if len(self.get_matching_pkgs(p)) > 1:
   420                                 upgradable = "u"
   443                                 upgradable = "u"
   421                         elif upgradable_only:
   444                         elif upgradable_only:
   422                                 continue
   445                                 continue
   423 
   446 
   424                         if not verbose:
   447                         if not verbose:
   425                                 pf = f.get_short_fmri()
   448                                 pf = p.get_short_fmri()
   426                         else:
   449                         else:
   427                                 pf = f.get_fmri(self.get_default_authority())
   450                                 pf = p.get_fmri(self.get_default_authority())
   428 
   451 
   429                         print fmt_str % (pf, self.get_pkg_state_by_fmri(f),
   452                         print fmt_str % (pf, self.get_pkg_state_by_fmri(p),
   430                             upgradable, frozen, incorporated, excludes)
   453                             upgradable, frozen, incorporated, excludes)
   431 
   454 
   432 
   455 
   433 if __name__ == "__main__":
   456 if __name__ == "__main__":
   434         # XXX Need to construct a trivial image and catalog.
   457         # XXX Need to construct a trivial image and catalog.