Skip to content

Instantly share code, notes, and snippets.

@m87h
Created March 28, 2014 17:34
Show Gist options
  • Save m87h/9838324 to your computer and use it in GitHub Desktop.
Save m87h/9838324 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys, os, types, errno, shutil
import pkg.server.depot as ds
import pkg.server.repository as sr
# monkeypatch pkg.server.face.init (noop)
import pkg.server.face
pkg.server.face.init = lambda depot: None
def output(path, val):
with open(path, 'w') as io:
io.write(''.join(val))
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno == errno.EEXIST and os.path.isdir(path):
pass
else: raise
def split_fmri(fmri):
comps = fmri.pkg_name.split('/')
comps[-1] += '@' + str(fmri.version)
return comps
def main():
inst_root = os.path.abspath(sys.argv[1])
dest = os.path.abspath(sys.argv[2])
dconf = ds.DepotConfig()
repo = sr.Repository(read_only=True, root=inst_root)
depot = ds.DepotHTTP(repo, dconf)
# prune tree (we restore some of these files below)
root, dirnames, filenames = os.walk(dest).next()
for dirname in dirnames:
try:
depot.repo.get_publisher(dirname)
except sr.RepositoryUnknownPublisher:
shutil.rmtree(os.path.join(root, dirname))
mkdir_p(os.path.join(dest, 'versions', '0'))
output(os.path.join(dest, 'versions', '0', 'index.html'), depot.versions_0())
mkdir_p(os.path.join(dest, 'publisher', '0'))
output(os.path.join(dest, 'publisher', '0', 'index.html'), depot.publisher_0())
for pub in depot.repo.get_publishers():
depot._get_req_pub = types.MethodType(lambda self: pub.prefix, depot)
mkdir_p(os.path.join(dest, pub.prefix, 'catalog', '0'))
output(os.path.join(dest, pub.prefix, 'catalog', '0', 'index.html'), depot.catalog_0())
mkdir_p(os.path.join(dest, pub.prefix, 'catalog', '1'))
output(os.path.join(dest, pub.prefix, 'catalog', '1', 'catalog.attrs'), depot.catalog_1('catalog.attrs'))
output(os.path.join(dest, pub.prefix, 'catalog', '1', 'catalog.summary.C'), depot.catalog_1('catalog.summary.C'))
output(os.path.join(dest, pub.prefix, 'catalog', '1', 'catalog.base.C'), depot.catalog_1('catalog.base.C'))
for (fmri, entry) in depot.repo.get_pub_rstore(pub.prefix).catalog.entries(pubs=[pub.prefix]):
comps = split_fmri(fmri)
mkdir_p(os.path.join(dest, pub.prefix, 'manifest', '0', *comps[:-1]))
output(os.path.join(dest, pub.prefix, 'manifest', '0', *comps), depot.manifest_0(*comps))
mkdir_p(os.path.join(dest, pub.prefix, 'file', '1'))
for root, dirnames, filenames in os.walk(os.path.join(inst_root, 'publisher', pub.prefix, 'file')):
for filename in filenames:
shutil.copy(os.path.join(root, filename), os.path.join(dest, pub.prefix, 'file', '1'))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment