[yocto] [PATCH 5/5] Bastille: set Yocto specific questions via config file.
Martin Jansa
martin.jansa at gmail.com
Mon Aug 26 00:19:29 PDT 2013
On Sun, Aug 25, 2013 at 09:17:12PM -0400, mulhern wrote:
> [YOCTO #3867]
>
> The python script, set_required_questions.py reads the list of questions and
> answers from the config file and edits the REQUIRE_DISTRO field for those
> questions in the questions file so that it includes "Yocto" if it is not
> already present. This has the effect of causing Bastille, when loading
> questions for the Yocto distribution, to load only those that are answered
> in the existing config file. Under the assumption that the exisitng config
> file contains question/answer pairs that are relevant to the Yocto project,
> this will cause the interactive question screen to have answers that are
> relevant to the Yocto project.
>
> Signed-off-by: mulhern <mulhern at yoctoproject.org>
> ---
> recipes-security/bastille/bastille_3.2.1.bb | 3 +
> .../bastille/files/set_required_questions.py | 135 ++++++++++++++++++++
> 2 files changed, 138 insertions(+)
> create mode 100755 recipes-security/bastille/files/set_required_questions.py
>
> diff --git a/recipes-security/bastille/bastille_3.2.1.bb b/recipes-security/bastille/bastille_3.2.1.bb
> index 8969f6b..094f09c 100644
> --- a/recipes-security/bastille/bastille_3.2.1.bb
> +++ b/recipes-security/bastille/bastille_3.2.1.bb
> @@ -139,6 +139,9 @@ do_install () {
> install -m 0644 OSMap/HP-UX.service ${D}${datadir}/Bastille/OSMap
> install -m 0644 OSMap/OSX.bastille ${D}${datadir}/Bastille/OSMap
> install -m 0644 OSMap/OSX.system ${D}${datadir}/Bastille/OSMap
> +
> + ${THISDIR}/files/set_required_questions.py ${WORKDIR}/config Questions
> +
Inconsistent whitespace.
> install -m 0777 ${WORKDIR}/config ${D}${sysconfdir}/Bastille/config
>
> for file in `cat Modules.txt` ; do
> diff --git a/recipes-security/bastille/files/set_required_questions.py b/recipes-security/bastille/files/set_required_questions.py
> new file mode 100755
> index 0000000..a432dc5
> --- /dev/null
> +++ b/recipes-security/bastille/files/set_required_questions.py
> @@ -0,0 +1,135 @@
> +#!/usr/bin/env python
> +
> +import argparse, os, shutil, sys, tempfile
> +from os import path
> +
> +
> +
> +def get_config(lines):
> + """
> + From a sequence of lines retrieve the question file name, question identifier
> + pairs.
> + """
> + for l in lines:
> + if not l.startswith("#"):
> + try:
> + (coord, value) = l.split("=")
> + try:
> + (fname, ident) = coord.split(".")
> + yield fname, ident
> + except ValueError as e:
> + raise ValueError("Badly formatted coordinates %s in line %s." % (coord, l.strip()))
> + except ValueError as e:
> + raise ValueError("Skipping badly formatted line %s, %s" % (l.strip(), e))
> +
> +
> +
> +def check_contains(line, name):
> + """
> + Check if the value field for REQUIRE_DISTRO contains the given name.
> + @param name line The REQUIRE_DISTRO line
> + @param name name The name to look for in the value field of the line.
> + """
> + try:
> + (label, distros) = line.split(":")
> + return name in distros.split()
> + except ValueError as e:
> + raise ValueError("Error splitting REQUIRE_DISTRO line: %s" % e)
> +
> +
> +
> +def add_requires(the_ident, distro, lines):
> +
> + """
> + Yield a sequence of lines the same as lines except that where
> + the_ident matches a question identifier change the REQUIRE_DISTRO so that
> + it includes the specified distro.
> +
> + @param name the_ident The question identifier to be matched.
> + @param name distro The distribution to added to the questions REQUIRE_DISTRO
> + field.
> + @param lines The sequence to be processed.
> + """
> + for l in lines:
> + yield l
> + if l.startswith("LABEL:"):
> + try:
> + (label, ident) = l.split(":")
> + if ident.strip() == the_ident:
> + break
> + except ValueError as e:
> + raise ValueError("Unexpected line %s in questions file." % l.strip())
> + for l in lines:
> + if l.startswith("REQUIRE_DISTRO"):
> + if not check_contains(l, distro):
> + yield l.rstrip() + " " + distro + "\n"
> + else:
> + yield l
> + break;
> + else:
> + yield l
> + for l in lines:
> + yield l
> +
> +
> +
> +def xform_file(qfile, distro, qlabel):
> + questions_in = open(qfile)
> + questions_out = tempfile.NamedTemporaryFile(delete=False)
> + for l in add_requires(qlabel, distro, questions_in):
> + questions_out.write(l)
> + questions_out.close()
> + questions_in.close()
> + shutil.move(questions_out.name, qfile)
> +
> +
> +
> +def handle_args(parser):
> + parser.add_argument('config_file',
> + help = "Configuration file path.")
> + parser.add_argument('questions_dir',
> + help = "Directory containing Questions files.")
> + parser.add_argument('--distro', '-d',
> + help = "The distribution, the default is Yocto.",
> + default = "Yocto")
> + return parser.parse_args()
> +
> +
> +
> +def check_args(args):
> + args.config_file = os.path.abspath(args.config_file)
> + args.questions_dir = os.path.abspath(args.questions_dir)
> +
> + if not os.path.isdir(args.questions_dir):
> + raise ValueError("Specified Questions directory %s does not exist or is not a directory." % args.questions_dir)
> +
> + if not os.path.isfile(args.config_file):
> + raise ValueError("Specified configuration file %s not found." % args.config_file)
> +
> +
> +
> +def main():
> + opts = handle_args(argparse.ArgumentParser(description="A simple script that sets required questions based on the question/answer pairs in a configuration file."))
> +
> + try:
> + check_args(opts)
> + except ValueError as e:
> + sys.exit("Fatal error: %s" % e)
> +
> +
> + try:
> + config_in = open(opts.config_file)
> + for qfile, qlabel in get_config(config_in):
> + questions_file = os.path.join(opts.questions_dir, qfile + ".txt")
> + xform_file(questions_file, opts.distro, qlabel)
> + config_in.close()
> +
> + except IOError as e:
> + sys.exit("Fatal error reading config file: %s" % e)
> + except ValueError as e:
> + sys.exit("Fatal error: %s" % e)
> +
> +
> +
> +if __name__ == "__main__":
> + main()
> --
> 1.7.10.4
>
> _______________________________________________
> yocto mailing list
> yocto at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/yocto
--
Martin 'JaMa' Jansa jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.yoctoproject.org/pipermail/yocto/attachments/20130826/340aa7fd/attachment.pgp>
More information about the yocto
mailing list