github.com/apptainer/singularity@v3.1.1+incompatible/cmd/internal/cli/apps_linux.go (about) 1 // Copyright (c) 2018-2019, Sylabs Inc. All rights reserved. 2 // This software is licensed under a 3-clause BSD license. Please consult the 3 // LICENSE.md file distributed with the sources of this project regarding your 4 // rights to use or distribute this software. 5 6 package cli 7 8 import ( 9 "encoding/json" 10 "os" 11 "path/filepath" 12 13 "github.com/opencontainers/runtime-tools/generate" 14 "github.com/spf13/cobra" 15 "github.com/sylabs/singularity/docs" 16 "github.com/sylabs/singularity/internal/pkg/buildcfg" 17 "github.com/sylabs/singularity/internal/pkg/runtime/engines/config" 18 "github.com/sylabs/singularity/internal/pkg/runtime/engines/config/oci" 19 singularityConfig "github.com/sylabs/singularity/internal/pkg/runtime/engines/singularity/config" 20 "github.com/sylabs/singularity/internal/pkg/sylog" 21 "github.com/sylabs/singularity/internal/pkg/util/exec" 22 ) 23 24 func init() { 25 SingularityCmd.AddCommand(AppsCmd) 26 } 27 28 const listAppsCommand = "for app in ${SINGULARITY_MOUNTPOINT}/scif/apps/*; do\n if [ -d \"$app/scif\" ]; then\n APPNAME=`basename $app`\n echo \"$APPNAME\"\n fi\ndone" 29 30 // AppsCmd singularity apps <container path> 31 var AppsCmd = &cobra.Command{ 32 DisableFlagsInUseLine: true, 33 Use: docs.AppsUse, 34 Short: docs.AppsShort, 35 Long: docs.AppsLong, 36 Example: docs.AppsExample, 37 38 Args: cobra.ExactArgs(1), 39 Run: func(cmd *cobra.Command, args []string) { 40 // Sanity check 41 if _, err := os.Stat(args[0]); err != nil { 42 sylog.Fatalf("Container not found: %s", err) 43 } 44 45 // apps prints the apps installed in the container 46 abspath, err := filepath.Abs(args[0]) 47 if err != nil { 48 sylog.Fatalf("While getting absolute path: %s", err) 49 } 50 name := filepath.Base(abspath) 51 52 a := []string{"/bin/sh", "-c", listAppsCommand} 53 starter := buildcfg.LIBEXECDIR + "/singularity/bin/starter-suid" 54 procname := "Singularity apps" 55 Env := []string{sylog.GetEnvVar()} 56 57 engineConfig := singularityConfig.NewConfig() 58 ociConfig := &oci.Config{} 59 generator := generate.Generator{Config: &ociConfig.Spec} 60 engineConfig.OciConfig = ociConfig 61 62 generator.SetProcessArgs(a) 63 generator.SetProcessCwd("/") 64 engineConfig.SetImage(abspath) 65 66 cfg := &config.Common{ 67 EngineName: singularityConfig.Name, 68 ContainerID: name, 69 EngineConfig: engineConfig, 70 } 71 72 configData, err := json.Marshal(cfg) 73 if err != nil { 74 sylog.Fatalf("CLI Failed to marshal CommonEngineConfig: %s\n", err) 75 } 76 77 if err := exec.Pipe(starter, []string{procname}, Env, configData); err != nil { 78 sylog.Fatalf("%s", err) 79 } 80 }, 81 }