Codebase list golang-gopkg-lxc-go-lxc.v2 / 3807065
Merge pull request #10 from dropbox/return-codes Return boolean success status from RunCommand* S.Çağlar Onur 9 years ago
4 changed file(s) with 53 addition(s) and 41 deletion(s). Raw diff Collapse all Expand all
990990 // stdinfd: fd to read input from
991991 // stdoutfd: fd to write output to
992992 // stderrfd: fd to write error output to
993 func (c *Container) RunCommand(stdinfd, stdoutfd, stderrfd uintptr, args ...string) error {
994 if args == nil {
995 return ErrInsufficientNumberOfArguments
996 }
997
998 if err := c.makeSure(isDefined | isRunning); err != nil {
999 return err
1000 }
1001
1002 c.mu.Lock()
1003 defer c.mu.Unlock()
1004
1005 cargs := makeNullTerminatedArgs(args)
1006 if cargs == nil {
1007 return ErrAllocationFailed
1008 }
1009 defer freeNullTerminatedArgs(cargs, len(args))
1010
1011 if int(C.go_lxc_attach_run_wait(c.container, false, C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs)) < 0 {
1012 return ErrAttachFailed
1013 }
1014 return nil
993 func (c *Container) RunCommand(stdinfd, stdoutfd, stderrfd uintptr, args ...string) (bool, error) {
994 return c.runCommand(stdinfd, stdoutfd, stderrfd, false, args...)
1015995 }
1016996
1017997 // RunCommandWithClearEnvironment runs the user specified command inside the container
1019999 // stdinfd: fd to read input from
10201000 // stdoutfd: fd to write output to
10211001 // stderrfd: fd to write error output to
1022 func (c *Container) RunCommandWithClearEnvironment(stdinfd, stdoutfd, stderrfd uintptr, args ...string) error {
1002 func (c *Container) RunCommandWithClearEnvironment(stdinfd, stdoutfd, stderrfd uintptr, args ...string) (bool, error) {
1003 return c.runCommand(stdinfd, stdoutfd, stderrfd, true, args...)
1004 }
1005
1006 func (c *Container) runCommand(stdinfd, stdoutfd, stderrfd uintptr, clearenv bool, args ...string) (bool, error) {
10231007 if args == nil {
1024 return ErrInsufficientNumberOfArguments
1025 }
1026
1027 if err := c.makeSure(isDefined | isRunning); err != nil {
1028 return err
1008 return false, ErrInsufficientNumberOfArguments
1009 }
1010
1011 if err := c.makeSure(isDefined | isRunning); err != nil {
1012 return false, err
10291013 }
10301014
10311015 c.mu.Lock()
10331017
10341018 cargs := makeNullTerminatedArgs(args)
10351019 if cargs == nil {
1036 return ErrAllocationFailed
1020 return false, ErrAllocationFailed
10371021 }
10381022 defer freeNullTerminatedArgs(cargs, len(args))
10391023
1040 if int(C.go_lxc_attach_run_wait(c.container, true, C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs)) < 0 {
1041 return ErrAttachFailed
1042 }
1043 return nil
1024 ret := int(C.go_lxc_attach_run_wait(c.container, C.bool(clearenv), C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs))
1025
1026 if ret < 0 {
1027 return false, ErrAttachFailed
1028 }
1029 return ret == 0, nil
10441030 }
10451031
10461032 // Interfaces returns the names of the network interfaces.
5656 }
5757
5858 log.Printf("RunCommandWithClearEnvironment\n")
59 if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil {
59 if _, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil {
6060 log.Fatalf("ERROR: %s\n", err.Error())
6161 }
6262
6767 }
6868
6969 log.Printf("RunCommand\n")
70 if err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil {
70 if _, err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil {
7171 log.Fatalf("ERROR: %s\n", err.Error())
7272 }
7373 }
8686 }
8787
8888 log.Printf("RunCommandWithClearEnvironment\n")
89 if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil {
89 if _, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil {
9090 log.Fatalf("ERROR: %s\n", err.Error())
9191 }
9292 } else {
9696 }
9797
9898 log.Printf("RunCommand\n")
99 if err := c.RunCommand(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil {
99 if _, err := c.RunCommand(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil {
100100 log.Fatalf("ERROR: %s\n", err.Error())
101101 }
102102 }
932932 defer PutContainer(c)
933933
934934 argsThree := []string{"/bin/sh", "-c", "/bin/ls -al > /dev/null"}
935 if err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...); err != nil {
936 t.Errorf(err.Error())
935 ok, err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...)
936 if err != nil {
937 t.Errorf(err.Error())
938 }
939 if ok != true {
940 t.Errorf("Expected success")
941 }
942
943 argsThree = []string{"/bin/sh", "-c", "exit 1"}
944 ok, err = c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...)
945 if err != nil {
946 t.Errorf(err.Error())
947 }
948 if ok != false {
949 t.Errorf("Expected failure")
937950 }
938951 }
939952
945958 defer PutContainer(c)
946959
947960 argsThree := []string{"/bin/sh", "-c", "/bin/ls -al > /dev/null"}
948 if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...); err != nil {
949 t.Errorf(err.Error())
961 ok, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...)
962 if err != nil {
963 t.Errorf(err.Error())
964 }
965 if ok != true {
966 t.Errorf("Expected success")
967 }
968
969 argsThree = []string{"/bin/sh", "-c", "exit 1"}
970 ok, err = c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...)
971 if err != nil {
972 t.Errorf(err.Error())
973 }
974 if ok != false {
975 t.Errorf("Expected failure")
950976 }
951977 }
952978