Add the file_copy plugin

File_copy supports creation of dirs and copying of files
from the host system into the image.

bug 168
This commit is contained in:
Andrew Bogott 2014-12-10 10:54:25 +00:00
parent 4c315f80b7
commit d34aeab6e0
3 changed files with 125 additions and 0 deletions

View file

@ -0,0 +1,16 @@
import tasks
def validate_manifest(data, validator, error):
import os.path
schema_path = os.path.normpath(os.path.join(os.path.dirname(__file__), 'manifest-schema.yml'))
validator(data, schema_path)
def resolve_tasks(taskset, manifest):
taskset.add(tasks.ValidateSourcePaths)
if ('mkdirs' in manifest.plugins['file_copy']):
taskset.add(tasks.MkdirCommand)
if ('files' in manifest.plugins['file_copy']):
taskset.add(tasks.FileCopyCommand)

View file

@ -0,0 +1,44 @@
---
$schema: http://json-schema.org/draft-04/schema#
properties:
plugins:
properties:
file_copy:
properties:
mkdirs:
items:
dir:
$ref: '#/definitions/absolute_path'
permissions:
type: string
owner:
type: string
group:
type: string
files:
items:
src:
$ref: '#/definitions/absolute_path'
dst:
$ref: '#/definitions/absolute_path'
permissions:
type: string
owner:
type: string
group:
type: string
minItems: 1
type: array
required:
- src
- dst
required:
- files
type: object
required:
- file_copy
type: object
required:
- plugins
title: File copy plugin manifest
type: object

View file

@ -0,0 +1,65 @@
from bootstrapvz.base import Task
from bootstrapvz.common import phases
import os
import shutil
class ValidateSourcePaths(Task):
description = 'Check whether the files to be copied exist'
phase = phases.preparation
@classmethod
def run(cls, info):
from bootstrapvz.common.exceptions import TaskError
for file_entry in info.manifest.plugins['file_copy']['files']:
srcfile = file_entry['src']
if not os.path.isfile(srcfile):
msg = 'The source file %s does not exist.' % srcfile
raise TaskError(msg)
def modify_path(info, path, entry):
from bootstrapvz.common.tools import log_check_call
if 'permissions' in entry:
# We wrap the permissions string in str() in case
# the user specified a numeric bitmask
chmod_command = ['chroot', info.root, 'chmod', str(entry['permissions']), path]
log_check_call(chmod_command)
if 'owner' in entry:
chown_command = ['chroot', info.root, 'chown', entry['owner'], path]
log_check_call(chown_command)
if 'group' in entry:
chgrp_command = ['chroot', info.root, 'chgrp', entry['group'], path]
log_check_call(chgrp_command)
class MkdirCommand(Task):
description = 'copy files into the image'
phase = phases.system_modification
@classmethod
def run(cls, info):
from bootstrapvz.common.tools import log_check_call
for dir_entry in info.manifest.plugins['file_copy']['mkdirs']:
mkdir_command = ['chroot', info.root, 'mkdir', '-p', dir_entry['dir']]
log_check_call(mkdir_command)
modify_path(info, dir_entry['dir'], dir_entry)
class FileCopyCommand(Task):
description = 'copy files into the image'
phase = phases.system_modification
predecessors = [MkdirCommand]
@classmethod
def run(cls, info):
for file_entry in info.manifest.plugins['file_copy']['files']:
# note that we don't use os.path.join because it can't
# handle absolute paths, which 'dst' most likely is.
final_destination = os.path.normpath("%s/%s" % (info.root, file_entry['dst']))
shutil.copy(file_entry['src'], final_destination)
modify_path(info, file_entry['dst'], file_entry)