2 Commits

Author SHA1 Message Date
yo
dc4213a8d5 v.0.34 : Jail names can be shortened 2023-07-09 10:38:00 +02:00
yo
5eed121f0b Protect devfs last ruleset acquiring with mutex 2023-06-25 23:32:15 +02:00
4 changed files with 22 additions and 10 deletions

View File

@ -1,3 +1,3 @@
v.0.33b : Support jaling datasets on differents pools : jail_zfs_dataset now have to include the pool name v.0.33b : Support jailing datasets on differents pools : jail_zfs_dataset now have to include the pool name
v.0.33c : Parallelize start/stop of jails with same priority v.0.33c : Parallelize start/stop of jails with same priority
v.0.34 : jail name can be shortened

View File

@ -1,11 +1,12 @@
package cmd package cmd
import ( import (
"encoding/json"
"fmt"
"io/ioutil"
"os" "os"
"fmt"
"sync"
"strings" "strings"
"io/ioutil"
"encoding/json"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/viper" "github.com/spf13/viper"
@ -14,7 +15,7 @@ import (
) )
const ( const (
gVersion = "0.33c" gVersion = "0.34"
// TODO : Get from $jail_zpool/defaults.json // TODO : Get from $jail_zpool/defaults.json
MIN_DYN_DEVFS_RULESET = 1000 MIN_DYN_DEVFS_RULESET = 1000
@ -55,6 +56,7 @@ var (
gFetchIntoDS string gFetchIntoDS string
gFetchFrom string gFetchFrom string
gMdevfs sync.Mutex
rootCmd = &cobra.Command{ rootCmd = &cobra.Command{
Use: "gocage", Use: "gocage",

View File

@ -476,12 +476,17 @@ func genNatIpv4(jail *Jail) ([]string, error) {
return ippair, nil return ippair, nil
} }
func buildDevfsRuleSet(jail *Jail) (error, int) { // FIXME : Must lock this function so parallel start do not
func buildDevfsRuleSet(jail *Jail, m *sync.Mutex) (error, int) {
rulesets := []int{} rulesets := []int{}
m.Lock()
//defer m.Unlock()
// Get known rulesets // Get known rulesets
out, err := executeCommand("devfs rule showsets") out, err := executeCommand("devfs rule showsets")
if err != nil { if err != nil {
m.Unlock()
return errors.New(fmt.Sprintf("Error executing command \"devfs rule showsets\": %v; command returned: %s\n", err, out)), 0 return errors.New(fmt.Sprintf("Error executing command \"devfs rule showsets\": %v; command returned: %s\n", err, out)), 0
} }
srs := strings.Split(out, "\n") srs := strings.Split(out, "\n")
@ -509,19 +514,23 @@ func buildDevfsRuleSet(jail *Jail) (error, int) {
// UPDATE: We don't need this as every jail have a default Devfs_ruleset value // UPDATE: We don't need this as every jail have a default Devfs_ruleset value
/*ds, err := getDatastoreFromArray(jail.Datastore, gDatastores) /*ds, err := getDatastoreFromArray(jail.Datastore, gDatastores)
if err != nil { if err != nil {
m.Unlock()
return errors.New(fmt.Sprintf("Error getting datastore %s for jail %s", jail.Datastore, jail.Name)), 0 return errors.New(fmt.Sprintf("Error getting datastore %s for jail %s", jail.Datastore, jail.Name)), 0
} }
defaultrs, err := strconv.ParseInt(ds.DefaultJailConfig.Devfs_ruleset, 10, 64) defaultrs, err := strconv.ParseInt(ds.DefaultJailConfig.Devfs_ruleset, 10, 64)
if err != nil { if err != nil {
m.Unlock()
return errors.New(fmt.Sprintf("Error parsing default devfs_ruleset for datastore %s", jail.Datastore)), 0 return errors.New(fmt.Sprintf("Error parsing default devfs_ruleset for datastore %s", jail.Datastore)), 0
}*/ }*/
// Clone configured devfs_ruleset to a dynamic ruleset // Clone configured devfs_ruleset to a dynamic ruleset
if false == isStringInArray(srs, jail.Config.Devfs_ruleset) { if false == isStringInArray(srs, jail.Config.Devfs_ruleset) {
m.Unlock()
return errors.New(fmt.Sprintf("Unknown ruleset: %s", jail.Config.Devfs_ruleset)), 0 return errors.New(fmt.Sprintf("Unknown ruleset: %s", jail.Config.Devfs_ruleset)), 0
} }
rs, _ := strconv.Atoi(jail.Config.Devfs_ruleset) rs, _ := strconv.Atoi(jail.Config.Devfs_ruleset)
err = copyDevfsRuleset(ruleset, rs) err = copyDevfsRuleset(ruleset, rs)
m.Unlock()
if err != nil { if err != nil {
return err, 0 return err, 0
} }
@ -1343,7 +1352,7 @@ func StartJail(args []string) {
net = append(net, strings.Split(cj.Config.Vnet_interfaces, " ")...) net = append(net, strings.Split(cj.Config.Vnet_interfaces, " ")...)
} }
err, dynrs := buildDevfsRuleSet(cj) err, dynrs := buildDevfsRuleSet(cj, &gMdevfs)
if err != nil { if err != nil {
fmt.Printf("%s\n", err.Error()) fmt.Printf("%s\n", err.Error())
return return

View File

@ -772,7 +772,8 @@ func getJailFromArray(name string, jarray []Jail) (*Jail, error) {
} }
for i, j := range jarray { for i, j := range jarray {
if jail == j.Name { //if jail == j.Name {
if strings.HasPrefix(j.Name, jail) {
if len(ds) > 0 { if len(ds) > 0 {
if strings.EqualFold(ds, j.Datastore) { if strings.EqualFold(ds, j.Datastore) {
return &jarray[i], nil return &jarray[i], nil
@ -786,7 +787,7 @@ func getJailFromArray(name string, jarray []Jail) (*Jail, error) {
} }
if len(jails) > 0 { if len(jails) > 0 {
if len(jails) > 1 { if len(jails) > 1 {
return &Jail{}, errors.New("More than one jail found with this name, please use datastore/jail format") return &Jail{}, errors.New("More than one jail matching, please use datastore/jail format or full name")
} else { } else {
return &jails[0], nil return &jails[0], nil
} }