From d5f4bb2561d461aba8402d6dd7c94dead2fdfb73 Mon Sep 17 00:00:00 2001 From: Ma Shimiao Date: Thu, 28 Apr 2016 16:32:16 +0800 Subject: [PATCH] validate: add Hooks validation Signed-off-by: Ma Shimiao --- man/ocitools-validate.1.md | 3 +++ validate.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/man/ocitools-validate.1.md b/man/ocitools-validate.1.md index 2f171cc4c..fac34ef71 100644 --- a/man/ocitools-validate.1.md +++ b/man/ocitools-validate.1.md @@ -18,6 +18,9 @@ Validate an OCI bundle **--path=PATH Path to bundle +**--hooks** + Check specified hooks exist and are executable on the host. + # SEE ALSO **ocitools**(1) diff --git a/validate.go b/validate.go index 429b09b40..6ed8285b8 100644 --- a/validate.go +++ b/validate.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path" + "path/filepath" "reflect" "regexp" "strings" @@ -19,6 +20,7 @@ import ( var bundleValidateFlags = []cli.Flag{ cli.StringFlag{Name: "path", Usage: "path to a bundle"}, + cli.BoolFlag{Name: "hooks", Usage: "Check specified hooks exist and are executable on the host."}, } var ( @@ -76,17 +78,19 @@ var bundleValidateCommand = cli.Command{ logrus.Fatalf("root path %q is not a directory.", spec.Root.Path) } - bundleValidate(spec, rootfsPath) + hooksCheck := context.Bool("hooks") + bundleValidate(spec, rootfsPath, hooksCheck) logrus.Infof("Bundle validation succeeded.") }, } -func bundleValidate(spec rspec.Spec, rootfs string) { +func bundleValidate(spec rspec.Spec, rootfs string, hooksCheck bool) { checkMandatoryField(spec) checkSemVer(spec.Version) checkPlatform(spec.Platform) checkProcess(spec.Process, rootfs) checkLinux(spec.Linux, spec.Hostname, rootfs) + checkHooks(spec.Hooks, hooksCheck) } func checkSemVer(version string) { @@ -120,6 +124,30 @@ func checkPlatform(platform rspec.Platform) { logrus.Fatalf("Operation system %q of the bundle is not supported yet.", platform.OS) } +func checkHooks(hooks rspec.Hooks, hooksCheck bool) { + checkEventHookPaths("pre-start", hooks.Prestart, hooksCheck) + checkEventHookPaths("post-start", hooks.Poststart, hooksCheck) + checkEventHookPaths("post-stop", hooks.Poststop, hooksCheck) +} + +func checkEventHookPaths(hookType string, hooks []rspec.Hook, hooksCheck bool) { + for _, hook := range hooks { + if !filepath.IsAbs(hook.Path) { + logrus.Fatalf("The %s hook %v: is not absolute path", hookType, hook.Path) + } + + if hooksCheck { + fi, err := os.Stat(hook.Path) + if err != nil { + logrus.Fatalf("Cannot find %s hook: %v", hookType, hook.Path) + } + if fi.Mode()&0111 == 0 { + logrus.Fatalf("The %s hook %v: is not executable", hookType, hook.Path) + } + } + } +} + func checkProcess(process rspec.Process, rootfs string) { if !path.IsAbs(process.Cwd) { logrus.Fatalf("cwd %q is not an absolute path", process.Cwd)