Move package command in commands module

master
Lertsenem 2015-12-07 16:48:01 +01:00
parent 1749d0706d
commit eab5121d97
2 changed files with 93 additions and 77 deletions

View File

@ -0,0 +1,90 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import tarfile
from metafile import Metafile, MalformedMetafileError
# --------------------------------------
def init(parser):
parser.add_argument( "apps" ,
type=str ,
nargs="*" ,
default=[] ,
help="The apps to package ; defaults to all " \
"apps" )
parser.add_argument( "--pkgtype", "-t" ,
type=str ,
nargs="?" ,
default="tgz" ,
choices = [ "tgz" ] ,
help="The type of package to use" )
parser.add_argument( "--pkgname", "-p" ,
type=str ,
nargs="?" ,
default="persoconf." + (time.strftime("%Y%m%d")) ,
help="The name of the package to create" )
# --------------------------------------
def run(args, persoconf, logger):
pkgname = args.pkgname
# If no app is given: package all apps
if args.apps == []:
logger.info("Packaging all apps")
args.apps = persoconf.list_apps(logger=logger)
# Some apps were specified, so we list them with their files
appmetas = []
for app in args.apps :
# Load app META file
try:
appmetas.append( Metafile(json_path = "/".join([persoconf.path, app, persoconf.metafile])) )
except FileNotFoundError:
logger.warning("Metafile %s does not exist for app %s; ignoring" % (persoconf.metafile, app))
continue
except MalformedMetafileError:
logger.warning("Malformed metafile %s in app %s; ignoring" % (persoconf.metafile, app) )
continue
# TODO check that the app exists
# Adds the app name if there is only one packaged
if len(appmetas) == 1:
pkgname += ("." + appmetas[0].name)
# Switch according to the pkgtype
if args.pkgtype == "tgz":
pkgname += ".tgz"
# Create a tar containing the files in the right place
pkg = tarfile.open(pkgname, "w:gz")
for appmeta in appmetas:
for f in appmeta.files:
filename = persoconf.path +"/"+ appmeta.name +"/"+ f
filedest = appmeta.files[f]["dest"]
# Remove possible 'home'. The final targz should be extracted
# at 'home.
if filedest.startswith("~/"):
filedest = filedest[2:]
# TODO save and restore owners and permissions
try:
pkg.add(filename, arcname=filedest)
logger.info("Adding %s to package" % f)
except:
logger.warning("Failed to add %s to tar package %s" % (f, pkgname))
pkg.close()

View File

@ -15,7 +15,7 @@ from metafile import Metafile, MalformedMetafileError, NoPathDefinedError
from persoconf import Persoconf, FileInsteadOfDirError, \
PersoconfRootDoesNotExistError
import commands.list
import commands.list, commands.package
@ -54,26 +54,7 @@ commands.list.init(parser_list)
# Package
parser_package = subparsers.add_parser( "package" ,
help="Package a persoconf repository" )
parser_package.add_argument( "apps" ,
type=str ,
nargs="*" ,
default=[] ,
help="The apps to package ; defaults to all " \
"apps" )
parser_package.add_argument( "--pkgtype", "-t" ,
type=str ,
nargs="?" ,
default="tgz" ,
choices = [ "tgz" ] ,
help="The type of package to use" )
parser_package.add_argument( "--pkgname", "-p" ,
type=str ,
nargs="?" ,
default="persoconf." + (time.strftime("%Y%m%d")) ,
help="The name of the package to create" )
commands.package.init(parser_package)
# Update
parser_update = subparsers.add_parser( "update" ,
@ -503,62 +484,7 @@ if args.command == "update":
# PACKAGE COMMAND
########################################
if args.command == "package":
pkgname = args.pkgname
# If no app is given: package all apps
if args.apps == []:
log.info("Packaging all apps")
args.apps = persoconf.list_apps(logger=log)
# Some apps were specified, so we list them with their files
appmetas = []
for app in args.apps :
# Load app META file
try:
appmetas.append( Metafile(json_path = "/".join([persoconf.path, app, persoconf.metafile])) )
except FileNotFoundError:
log.warning("Metafile %s does not exist for app %s; ignoring" % (persoconf.metafile, app))
continue
except MalformedMetafileError:
log.warning("Malformed metafile %s in app %s; ignoring" % (persoconf.metafile, app) )
continue
# TODO check that the app exists
# Adds the app name if there is only one packaged
if len(appmetas) == 1:
pkgname += ("." + appmeta[0].name)
# Switch according to the pkgtype
if args.pkgtype == "tgz":
pkgname += ".tgz"
# Create a tar containing the files in the right place
pkg = tarfile.open(pkgname, "w:gz")
for appmeta in appmetas:
for f in appmeta.files:
filename = persoconf.path +"/"+ appmeta.name +"/"+ f
filedest = appmeta.files[f]["dest"]
# Remove possible 'home'. The final targz should be extracted
# at 'home.
if filedest.startswith("~/"):
filedest = filedest[2:]
# TODO save and restore owners and permissions
try:
pkg.add(filename, arcname=filedest)
log.info("Adding %s to package" % f)
except:
log.warning("Failed to add %s to tar package %s" % (f, pkgname))
pkg.close()
commands.package.run(args, persoconf, log)