moved utilities into cmd/utils.go, started working on stop command
This commit is contained in:
		
							
								
								
									
										173
									
								
								cmd/stop.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								cmd/stop.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,173 @@
 | 
				
			|||||||
 | 
					package cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					//	"log"
 | 
				
			||||||
 | 
					//	"strings"
 | 
				
			||||||
 | 
						"os/exec"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO : Use SYS_RCTL_GET_RACCT syscall
 | 
				
			||||||
 | 
					func removeRctlRules(jail string, rules []string) error {
 | 
				
			||||||
 | 
						var cmd []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(rules) == 0 {
 | 
				
			||||||
 | 
							rules[0] = ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, r := range rules {
 | 
				
			||||||
 | 
							if gUseSudo {
 | 
				
			||||||
 | 
								cmd = append(cmd, "sudo")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							cmd = append(cmd, "/usr/bin/rctl")
 | 
				
			||||||
 | 
							cmd = append(cmd, "-r")
 | 
				
			||||||
 | 
							cmd = append(cmd, fmt.Sprintf("jail:%s:%s", jail, r))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO : Log in another channel than stdout (will scramble diusplay)
 | 
				
			||||||
 | 
							//log.Println(fmt.Sprintf("Removing all rules for jail %s: %s", jail, cmd))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//out, err := exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
							_, err := exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Moved into cmd/utils.go
 | 
				
			||||||
 | 
					func executeCommand(cmdline string) (string, error) {
 | 
				
			||||||
 | 
						var cmd []string
 | 
				
			||||||
 | 
						var out []byte
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if gUseSudo {
 | 
				
			||||||
 | 
							cmd = append(cmd, "sudo")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cs := strings.Split(cmdline, " ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd = append(cmd, cs...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len (cmd) > 1 {
 | 
				
			||||||
 | 
							out, err = exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out, err = exec.Command(cmd[0]).Output()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return string(out), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
 | 
				
			||||||
 | 
						var cmd []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if gUseSudo {
 | 
				
			||||||
 | 
							cmd = append(cmd, "sudo")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd = append(cmd, "setfib")
 | 
				
			||||||
 | 
						if len(jail.Config.Exec_fib) > 0 {
 | 
				
			||||||
 | 
							cmd = append(cmd, jail.Config.Exec_fib)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							cmd = append(cmd, "0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd = append(cmd, "jexec", jail.InternalName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cs := strings.Split(cmdline, " ")
 | 
				
			||||||
 | 
						cmd = append(cmd, cs...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out, err := exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return string(out), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO
 | 
				
			||||||
 | 
					func umountJailedZFS(jail *Jail) error {
 | 
				
			||||||
 | 
					/*	
 | 
				
			||||||
 | 
						for _, zd := range jail.Config.Jail_zfs_dataset {
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						Stop jail:
 | 
				
			||||||
 | 
							Remove rctl rules
 | 
				
			||||||
 | 
							Execute prestop if set (jailhost perimeter)
 | 
				
			||||||
 | 
							Execute stop if set (inside jail)
 | 
				
			||||||
 | 
							Umount ZFS dataset
 | 
				
			||||||
 | 
							Unmount mountpoint
 | 
				
			||||||
 | 
							Delete devfs ruleset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Use setfib for each command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Shouldnt rctl rules be removed last, when jail is stopped?
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					func stopJail(args []string) {
 | 
				
			||||||
 | 
						// Current jail were stopping
 | 
				
			||||||
 | 
						var cj *Jail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, j := range args {
 | 
				
			||||||
 | 
							fmt.Printf("> Stopping jail %s\n", j)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, rj := range gJails {
 | 
				
			||||||
 | 
								if rj.Name == j {
 | 
				
			||||||
 | 
									cj = &rj
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if cj == nil {
 | 
				
			||||||
 | 
								fmt.Printf("Jail not found: %s\n", j)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if cj.Running == false {
 | 
				
			||||||
 | 
								fmt.Printf("Jail %s is not running!\n", cj.Name)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fmt.Printf("  > Remove RCTL rules: ")
 | 
				
			||||||
 | 
							err := removeRctlRules(cj.InternalName, []string{""})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Printf("ERROR: %s\n", err.Error())
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fmt.Printf("OK\n")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len (cj.Config.Exec_prestop) > 0 {
 | 
				
			||||||
 | 
								fmt.Printf("  > Execute prestop: ")
 | 
				
			||||||
 | 
								out, err := executeCommand(cj.Config.Exec_prestop)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									fmt.Printf("ERROR: %s\n", err.Error())
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									fmt.Printf("OK\n")
 | 
				
			||||||
 | 
									fmt.Printf("%s\n", out)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if len (cj.Config.Exec_stop) > 0 {
 | 
				
			||||||
 | 
								fmt.Printf("  > Execute stop: ")
 | 
				
			||||||
 | 
								out, err := executeCommandInJail(cj, cj.Config.Exec_stop)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									fmt.Printf("ERROR: %s\n", err.Error())
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									fmt.Printf("OK\n")
 | 
				
			||||||
 | 
									fmt.Printf("%s\n", out)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if cj.Config.Jail_zfs > 0 {
 | 
				
			||||||
 | 
								fmt.Printf("  > Umount jailed ZFS: ")
 | 
				
			||||||
 | 
								err := umountJailedZFS(cj)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									fmt.Printf("ERROR: %s\n", err.Error())
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									fmt.Printf("OK\n")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										53
									
								
								cmd/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								cmd/utils.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					package cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeCommand(cmdline string) (string, error) {
 | 
				
			||||||
 | 
					    var cmd []string
 | 
				
			||||||
 | 
					    var out []byte
 | 
				
			||||||
 | 
					    var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if gUseSudo {
 | 
				
			||||||
 | 
					        cmd = append(cmd, "sudo")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    cs := strings.Split(cmdline, " ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmd = append(cmd, cs...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if len (cmd) > 1 {
 | 
				
			||||||
 | 
					        out, err = exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        out, err = exec.Command(cmd[0]).Output()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return string(out), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
 | 
				
			||||||
 | 
					    var cmd []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if gUseSudo {
 | 
				
			||||||
 | 
					        cmd = append(cmd, "sudo")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmd = append(cmd, "setfib")
 | 
				
			||||||
 | 
					    if len(jail.Config.Exec_fib) > 0 {
 | 
				
			||||||
 | 
					        cmd = append(cmd, jail.Config.Exec_fib)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        cmd = append(cmd, "0")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmd = append(cmd, "jexec", jail.InternalName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cs := strings.Split(cmdline, " ")
 | 
				
			||||||
 | 
					    cmd = append(cmd, cs...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out, err := exec.Command(cmd[0], cmd[1:]...).Output()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return string(out), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user