Skip to content
Snippets Groups Projects
Commit 819589d8 authored by Seblu's avatar Seblu
Browse files

Generic improvment. Too many things to tell.

parent 07e374f0
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,8 @@ InstallSystems Image Manipulation Tool ...@@ -8,6 +8,8 @@ InstallSystems Image Manipulation Tool
import os import os
import argparse import argparse
import time
import datetime
import installsystems import installsystems
from installsystems.printer import * from installsystems.printer import *
from installsystems.image import SourceImage from installsystems.image import SourceImage
...@@ -20,34 +22,27 @@ class DebugAction(argparse.Action): ...@@ -20,34 +22,27 @@ class DebugAction(argparse.Action):
debug("Debug on") debug("Debug on")
def init(options): def init(args):
'''Create an empty fresh source image tree''' '''Create an empty fresh source image tree'''
# Directory must not exists
if os.path.exists(options.path) and os.path.isdir(options.path):
error("Directory already exists: %s" % options.path)
# Check if parent path is writable
parent_path = os.path.abspath(os.path.join(options.path, "../"))
if not os.access(parent_path, os.W_OK):
error("%s is not writable."%parent_path)
# call init from library # call init from library
try: try:
simg = SourceImage.create(options.path, options.verbose) simg = SourceImage.create(args.path, args.verbose)
except Exception as e: except Exception as e:
error("init failed: %s." % e) error("init failed: %s." % e)
def build(options): def build(args):
'''Create a package image''' '''Create a package image'''
for d in ("", "parser", "setup", "data"):
rp = os.path.join(options.path, d)
if not os.path.exists(rp):
error("Missing directory: %s" % d)
if not os.path.isdir(rp):
error("Not a directory: %s" % rp)
if not os.access(rp, os.R_OK|os.X_OK):
error("Unable to access to %s" % rp)
try: try:
simg = SourceImage(options.path) # start time
simg.build() t0 = time.time()
# load source image
simg = SourceImage(args.path)
# do the job
simg.build(args.force)
# compute building time
t1 = time.time()
dt = int(t1 - t0)
arrow("Build time: %s" % datetime.timedelta(seconds=dt), 1, args.verbose)
except Exception as e: except Exception as e:
error("build failed: %s." % e) error("build failed: %s." % e)
...@@ -59,13 +54,16 @@ p_main.add_argument('-d', "--debug", action=DebugAction, nargs=0, ...@@ -59,13 +54,16 @@ p_main.add_argument('-d', "--debug", action=DebugAction, nargs=0,
help="active debug mode") help="active debug mode")
p_main.add_argument('-q', "--quiet", action="store_false", dest="verbose", default=True, p_main.add_argument('-q', "--quiet", action="store_false", dest="verbose", default=True,
help="active quiet mode") help="active quiet mode")
subparsers = p_main.add_subparsers() subparsers = p_main.add_subparsers()
# Init command parser # Init command parser
p_init = subparsers.add_parser("init", help=init.__doc__) p_init = subparsers.add_parser("init", help=init.__doc__.lower())
p_init.add_argument("path", help="Path of new image directory") p_init.add_argument("path", help="Path of new image directory")
p_init.set_defaults(func=init) p_init.set_defaults(func=init)
# Build command parser # Build command parser
p_build = subparsers.add_parser("build", help=build.__doc__) p_build = subparsers.add_parser("build", help=build.__doc__.lower())
p_build.add_argument('-f', "--force", action="store_true", dest="force", default=False,
help="overwrite existing image")
p_build.add_argument("path", nargs="?", type=str, default=".") p_build.add_argument("path", nargs="?", type=str, default=".")
p_build.set_defaults(func=build) p_build.set_defaults(func=build)
# Parse and run # Parse and run
......
...@@ -8,6 +8,8 @@ InstallSystems Installation Tool ...@@ -8,6 +8,8 @@ InstallSystems Installation Tool
import os import os
import argparse import argparse
import time
import datetime
import installsystems import installsystems
import installsystems.tools as istools import installsystems.tools as istools
from installsystems.printer import * from installsystems.printer import *
...@@ -30,17 +32,15 @@ p_main.add_argument('-d', "--debug", action=DebugAction, nargs=0, ...@@ -30,17 +32,15 @@ p_main.add_argument('-d', "--debug", action=DebugAction, nargs=0,
help="active debug mode") help="active debug mode")
p_main.add_argument('-q', "--quiet", action="store_false", dest="verbose", default=True, p_main.add_argument('-q', "--quiet", action="store_false", dest="verbose", default=True,
help="active quiet mode") help="active quiet mode")
p_main.add_argument("-I", "--image-path", dest="image_path", type=str, default=None, p_main.add_argument("-I", "--image-repo", dest="image_path", type=str, default=None,
help="remote image repository path") help="remote image repository path")
p_main.add_argument("-D", "--data-path", dest="data_path", type=str, default=None, p_main.add_argument("-D", "--data-repo", dest="data_path", type=str, default=None,
help="remote data repository path") help="remote data repository path")
p_main.add_argument("-C", "--cache-path", dest="cache_path", type=str, p_main.add_argument("-C", "--cache-path", dest="cache_path", type=str,
default="/var/cache/isinstall", default="/var/cache/isinstall",
help="local cache repository path") help="local cache repository path")
p_main.add_argument("-v", "--image-version", dest="image_version", type=int, default=None, p_main.add_argument("-v", "--image-version", dest="image_version", type=int, default=None,
help="specific image version") help="specific image version")
p_main.add_argument('-u', "--update", action="store_true", dest="update", default=False,
help="update repository cache")
p_main.add_argument("image_name", type=str, p_main.add_argument("image_name", type=str,
help="image to install (path or name)") help="image to install (path or name)")
...@@ -58,19 +58,25 @@ try: ...@@ -58,19 +58,25 @@ try:
# register command ligne repo # register command ligne repo
if args.image_path is not None: if args.image_path is not None:
repocache.register("cmdline", args.image_path, args.data_path) repocache.register("cmdline", args.image_path, args.data_path)
# update remote info if -u options is present # update remote info
if args.update: repocache.update()
repocache.update()
# get image package # get image package
pkg = repocache.get(args.image_name, args.image_version) pkg = repocache.get(args.image_name, args.image_version)
else: else:
raise Exception("Invalid image name") p_main.print_usage()
exit(1)
# install start time
t0 = time.time()
# run parser scripts # run parser scripts
pkg.run_parser({ "parser": p_main }) pkg.run_parser({ "parser": p_main })
# call parser again, with extended attributes # call parser again, with extended attributes
args = p_main.parse_args() args = p_main.parse_args()
# run setup scripts # run setup scripts
pkg.run_setup({"args": args}) pkg.run_setup({"args": args})
# compute building time
t1 = time.time()
dt = int(t1 - t0)
arrow("Install time: %s" % datetime.timedelta(seconds=dt), 1, args.verbose)
except Exception as e: except Exception as e:
error(e) error(e)
except KeyboardInterrupt: except KeyboardInterrupt:
......
...@@ -22,29 +22,29 @@ class DebugAction(argparse.Action): ...@@ -22,29 +22,29 @@ class DebugAction(argparse.Action):
debug("Debug on") debug("Debug on")
def init(options): def init(args):
'''Create an empty fresh repo tree''' '''Create an empty fresh repo tree'''
# call init from library # call init from library
try: try:
Repository.create(options.image_path, options.data_path, options.verbose) Repository.create(args.image_path, args.data_path, args.verbose)
except Exception as e: except Exception as e:
error("init failed: %s." % e) error("init failed: %s." % e)
def add(options): def add(args):
'''Add a package to repository''' '''Add a package to repository'''
try: try:
repo = Repository(options.image_path, options.data_path, options.verbose) repo = Repository(args.image_path, args.data_path, args.verbose)
pkg = PackageImage(options.path, options.verbose) pkg = PackageImage(args.path, args.verbose)
pkg.check_md5() pkg.check_md5()
repo.add(pkg) repo.add(pkg)
except Exception as e: except Exception as e:
error("add failed: %s." % e) error("add failed: %s." % e)
def delete(options): def delete(args):
'''Remove a package from repository''' '''Remove a package from repository'''
try: try:
repo = Repository(options.image_path, options.data_path, options.verbose) repo = Repository(args.image_path, args.data_path, args.verbose)
repo.delete(options.image_name, options.image_version) repo.delete(args.image_name, args.image_version)
except Exception as e: except Exception as e:
error("del failed: %s." % e) error("del failed: %s." % e)
...@@ -63,18 +63,18 @@ p_main.add_argument("-D", "--data-path", dest="data_path", type=str, ...@@ -63,18 +63,18 @@ p_main.add_argument("-D", "--data-path", dest="data_path", type=str,
subparsers = p_main.add_subparsers() subparsers = p_main.add_subparsers()
# Init command parser # Init command parser
p_init = subparsers.add_parser("init", help=init.__doc__) p_init = subparsers.add_parser("init", help=init.__doc__.lower())
p_init.add_argument("image_path", nargs="?", default=argparse.SUPPRESS, p_init.add_argument("image_path", nargs="?", default=argparse.SUPPRESS,
help="Path of the new image directory") help="Path of the new image directory")
p_init.add_argument("data_path", nargs="?", default=argparse.SUPPRESS, p_init.add_argument("data_path", nargs="?", default=argparse.SUPPRESS,
help="Path of the new data directory") help="Path of the new data directory")
p_init.set_defaults(func=init) p_init.set_defaults(func=init)
# Add command parser # Add command parser
p_add = subparsers.add_parser("add", help=add.__doc__) p_add = subparsers.add_parser("add", help=add.__doc__.lower())
p_add.add_argument("path", type=str) p_add.add_argument("path", type=str)
p_add.set_defaults(func=add) p_add.set_defaults(func=add)
# Del command parser # Del command parser
p_del = subparsers.add_parser("del", help=delete.__doc__) p_del = subparsers.add_parser("del", help=delete.__doc__.lower())
p_del.add_argument("image_name", type=str) p_del.add_argument("image_name", type=str)
p_del.add_argument("image_version", type=str) p_del.add_argument("image_version", type=str)
p_del.set_defaults(func=delete) p_del.set_defaults(func=delete)
......
...@@ -8,7 +8,6 @@ Image stuff ...@@ -8,7 +8,6 @@ Image stuff
import os import os
import stat import stat
import datetime
import time import time
import json import json
import StringIO import StringIO
...@@ -17,7 +16,7 @@ import subprocess ...@@ -17,7 +16,7 @@ import subprocess
import json import json
import tarfile import tarfile
import re import re
import installsystems.template import installsystems.template as istemplate
import installsystems.tools as istools import installsystems.tools as istools
from installsystems.printer import * from installsystems.printer import *
from installsystems.tarball import Tarball from installsystems.tarball import Tarball
...@@ -53,15 +52,6 @@ class Image(object): ...@@ -53,15 +52,6 @@ class Image(object):
class SourceImage(Image): class SourceImage(Image):
'''Image source manipulation class''' '''Image source manipulation class'''
def __init__(self, path, verbose=True, pbzip2=True):
Image.__init__(self, pbzip2)
self.base_path = path
self.parser_path = os.path.join(path, "parser")
self.setup_path = os.path.join(path, "setup")
self.data_path = os.path.join(path, "data")
self.verbose = verbose
self.description = self.parse_description()
@classmethod @classmethod
def create(cls, path, verbose=True, pbzip2=True): def create(cls, path, verbose=True, pbzip2=True):
'''Create an empty source image''' '''Create an empty source image'''
...@@ -80,16 +70,13 @@ class SourceImage(Image): ...@@ -80,16 +70,13 @@ class SourceImage(Image):
try: try:
# create description example from template # create description example from template
arrow("Creating description example", 2, verbose) arrow("Creating description example", 2, verbose)
open(os.path.join(path, "description"), "w").write( open(os.path.join(path, "description"), "w").write(istemplate.description)
installsystems.template.description)
# create parser example from template # create parser example from template
arrow("Creating parser script example", 2, verbose) arrow("Creating parser script example", 2, verbose)
open(os.path.join(parser_path, "01-parser.py"), "w").write( open(os.path.join(parser_path, "01-parser.py"), "w").write(istemplate.parser)
installsystems.template.parser)
# create setup example from template # create setup example from template
arrow("Creating setup script example", 2, verbose) arrow("Creating setup script example", 2, verbose)
open(os.path.join(setup_path, "01-setup.py"), "w").write( open(os.path.join(setup_path, "01-setup.py"), "w").write(istemplate.setup)
installsystems.template.setup)
except Exception as e: except Exception as e:
raise Exception("Unable to example file: %s" % e) raise Exception("Unable to example file: %s" % e)
try: try:
...@@ -105,16 +92,35 @@ class SourceImage(Image): ...@@ -105,16 +92,35 @@ class SourceImage(Image):
raise Exception("Unable to set rights on %s: %s" % (pf, e)) raise Exception("Unable to set rights on %s: %s" % (pf, e))
return cls(path, verbose, pbzip2) return cls(path, verbose, pbzip2)
def build(self): def __init__(self, path, verbose=True, pbzip2=True):
Image.__init__(self, pbzip2)
self.base_path = path
self.parser_path = os.path.join(path, "parser")
self.setup_path = os.path.join(path, "setup")
self.data_path = os.path.join(path, "data")
self.verbose = verbose
self.valid_source_image()
self.description = self.parse_description()
def valid_source_image(self):
'''Check if we are a valid SourceImage'''
for d in (self.base_path, self.parser_path, self.setup_path, self.data_path):
if not os.path.exists(d):
raise Exception("Missing directory: %s" % d)
if not os.path.isdir(d):
raise Exception("Not a directory: %s" % d)
if not os.access(d, os.R_OK|os.X_OK):
raise Exception("Unable to access to %s" % d)
def build(self, overwrite=False):
'''Create packaged image''' '''Create packaged image'''
t0 = time.time()
# compute script tarball paths # compute script tarball paths
tarpath = os.path.join(self.base_path, tarpath = os.path.join(self.base_path,
"%s-%s%s" % (self.description["name"], "%s-%s%s" % (self.description["name"],
self.description["version"], self.description["version"],
self.image_extension)) self.image_extension))
# check if free to create script tarball # check if free to create script tarball
if os.path.exists(tarpath): if os.path.exists(tarpath) and overwrite == False:
raise Exception("Tarball already exists. Remove it before") raise Exception("Tarball already exists. Remove it before")
# printing pbzip2 status # printing pbzip2 status
if self.pbzip2_path: if self.pbzip2_path:
...@@ -148,10 +154,6 @@ class SourceImage(Image): ...@@ -148,10 +154,6 @@ class SourceImage(Image):
recursive=True, filter=self.tar_scripts_filter) recursive=True, filter=self.tar_scripts_filter)
# closing tarball file # closing tarball file
tarball.close() tarball.close()
# compute building time
t1 = time.time()
dt = int(t1 - t0)
arrow("Build time: %s" % datetime.timedelta(seconds=dt), 2, self.verbose)
def data_tarballs(self): def data_tarballs(self):
'''List all data tarballs in data directory''' '''List all data tarballs in data directory'''
......
...@@ -26,6 +26,7 @@ def cp(source, destination): ...@@ -26,6 +26,7 @@ def cp(source, destination):
def get_path_type(path): def get_path_type(path):
'''Return path type. This is usefull to know what king of path is given''' '''Return path type. This is usefull to know what king of path is given'''
from installsystems.image import Image
if path.startswith("http://") or path.startswith("https://"): if path.startswith("http://") or path.startswith("https://"):
return "http" return "http"
elif path.startswith("ssh://"): elif path.startswith("ssh://"):
...@@ -47,9 +48,3 @@ def complete_path(path): ...@@ -47,9 +48,3 @@ def complete_path(path):
return os.path.abspath(path) return os.path.abspath(path)
else: else:
return None return None
def path_strip_file(path):
'''Remove file:// header of a local file path'''
if path.startswith("file://"):
return path[len("file://")]
return path
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment