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  }