From 99118f5fad40411d050c47a9f7b0a372e2e04925 Mon Sep 17 00:00:00 2001 From: Jason-ZW Date: Thu, 29 Nov 2018 16:41:52 +0800 Subject: [PATCH] Add 4glte support --- cmd/control/udevsettle.go | 41 +++++++++++++++++++++++++++++++ cmd/init/init.go | 1 - config/schema.go | 3 ++- config/types.go | 2 ++ pkg/init/hypervisor/hypervisor.go | 35 -------------------------- pkg/netconf/types.go | 25 ++++++++++++------- pkg/sysinit/sysinit.go | 27 ++++++++++++++++++++ 7 files changed, 88 insertions(+), 46 deletions(-) diff --git a/cmd/control/udevsettle.go b/cmd/control/udevsettle.go index 9367ddd6..8ee3cf3b 100644 --- a/cmd/control/udevsettle.go +++ b/cmd/control/udevsettle.go @@ -1,20 +1,61 @@ package control import ( + "io/ioutil" "os" "os/exec" + "path/filepath" + "github.com/rancher/os/config" "github.com/rancher/os/pkg/log" "github.com/codegangsta/cli" ) func udevSettleAction(c *cli.Context) { + if err := extraRules(); err != nil { + log.Error(err) + } + if err := UdevSettle(); err != nil { log.Fatal(err) } } +func extraRules() error { + cfg := config.LoadConfig() + if len(cfg.Rancher.Network.ModemNetworks) > 0 { + rules, err := ioutil.ReadDir(config.UdevRulesExtrasDir) + if err != nil { + return err + } + for _, r := range rules { + if r.IsDir() || filepath.Ext(r.Name()) != ".rules" { + continue + } + err := os.Symlink(filepath.Join(config.UdevRulesExtrasDir, r.Name()), filepath.Join(config.UdevRulesDir, r.Name())) + if err != nil { + return err + } + } + } else { + rules, err := ioutil.ReadDir(config.UdevRulesDir) + if err != nil { + return err + } + for _, r := range rules { + if r.IsDir() || (filepath.Ext(r.Name()) != ".rules") || (r.Mode()&os.ModeSymlink != 0) { + continue + } + err := os.Remove(filepath.Join(config.UdevRulesDir, r.Name())) + if err != nil { + return err + } + } + } + return nil +} + func UdevSettle() error { cmd := exec.Command("udevd", "--daemon") defer exec.Command("killall", "udevd").Run() diff --git a/cmd/init/init.go b/cmd/init/init.go index 4cdd69c9..dad71e25 100644 --- a/cmd/init/init.go +++ b/cmd/init/init.go @@ -58,7 +58,6 @@ func RunInit() error { {"mount OEM2", fsmount.MountOem}, {"mount BOOT", fsmount.MountBoot}, {"write cfg and log files", configfiles.WriteConfigFiles}, - {"hypervisor Env", hypervisor.Env}, {"b2d Env", b2d.Env}, {"hypervisor tools", hypervisor.Tools}, {"preparefs2", prepare.FS}, diff --git a/config/schema.go b/config/schema.go index 6bd46c4d..3a610855 100644 --- a/config/schema.go +++ b/config/schema.go @@ -88,7 +88,8 @@ var schema = `{ "http_proxy": {"type": "string"}, "https_proxy": {"type": "string"}, "no_proxy": {"type": "string"}, - "wifi_networks": {"type": "object"} + "wifi_networks": {"type": "object"}, + "modem_networks": {"type": "array"} } }, diff --git a/config/types.go b/config/types.go index 62389cf5..3e72572b 100644 --- a/config/types.go +++ b/config/types.go @@ -53,6 +53,8 @@ const ( DHCPCDTemplateFile = "/etc/dhcpcd.conf.tpl" MultiDockerConfFile = "/var/lib/rancher/conf.d/m-user-docker.yml" MultiDockerDataDir = "/var/lib/m-user-docker" + UdevRulesDir = "/etc/udev/rules.d" + UdevRulesExtrasDir = "/lib/udev/rules-extras.d" ) var ( diff --git a/pkg/init/hypervisor/hypervisor.go b/pkg/init/hypervisor/hypervisor.go index 8883d9ac..0f965421 100644 --- a/pkg/init/hypervisor/hypervisor.go +++ b/pkg/init/hypervisor/hypervisor.go @@ -1,9 +1,6 @@ package hypervisor import ( - "io/ioutil" - "os" - "github.com/rancher/os/config" "github.com/rancher/os/pkg/log" "github.com/rancher/os/pkg/util" @@ -14,38 +11,6 @@ func Tools(cfg *config.CloudConfig) (*config.CloudConfig, error) { return config.LoadConfig(), nil } -func Env(cfg *config.CloudConfig) (*config.CloudConfig, error) { - hypervisor := util.GetHypervisor() - - // this code make sure the open-vm-tools service can be started correct when there is no network - if hypervisor == "vmware" { - // make sure the cache directory exist - if err := os.MkdirAll("/var/lib/rancher/cache/", os.ModeDir|0755); err != nil { - log.Errorf("Create service cache diretory error: %v", err) - } - - // move os-services cache file - if _, err := os.Stat("/usr/share/ros/services-cache"); err == nil { - files, err := ioutil.ReadDir("/usr/share/ros/services-cache/") - if err != nil { - log.Errorf("Read file error: %v", err) - } - for _, f := range files { - err := os.Rename("/usr/share/ros/services-cache/"+f.Name(), "/var/lib/rancher/cache/"+f.Name()) - if err != nil { - log.Errorf("Rename file error: %v", err) - } - } - if err := os.Remove("/usr/share/ros/services-cache"); err != nil { - log.Errorf("Remove file error: %v", err) - } - } - - } - - return cfg, nil -} - func enableHypervisorService(cfg *config.CloudConfig, hypervisorName string) { if hypervisorName == "" { return diff --git a/pkg/netconf/types.go b/pkg/netconf/types.go index 3655d83a..65b5b991 100644 --- a/pkg/netconf/types.go +++ b/pkg/netconf/types.go @@ -1,15 +1,16 @@ package netconf type NetworkConfig struct { - PreCmds []string `yaml:"pre_cmds,omitempty"` - DHCPTimeout int `yaml:"dhcp_timeout,omitempty"` - DNS DNSConfig `yaml:"dns,omitempty"` - Interfaces map[string]InterfaceConfig `yaml:"interfaces,omitempty"` - PostCmds []string `yaml:"post_cmds,omitempty"` - HTTPProxy string `yaml:"http_proxy,omitempty"` - HTTPSProxy string `yaml:"https_proxy,omitempty"` - NoProxy string `yaml:"no_proxy,omitempty"` - WifiNetworks map[string]WifiNetworkConfig `yaml:"wifi_networks,omitempty"` + PreCmds []string `yaml:"pre_cmds,omitempty"` + DHCPTimeout int `yaml:"dhcp_timeout,omitempty"` + DNS DNSConfig `yaml:"dns,omitempty"` + Interfaces map[string]InterfaceConfig `yaml:"interfaces,omitempty"` + PostCmds []string `yaml:"post_cmds,omitempty"` + HTTPProxy string `yaml:"http_proxy,omitempty"` + HTTPSProxy string `yaml:"https_proxy,omitempty"` + NoProxy string `yaml:"no_proxy,omitempty"` + WifiNetworks map[string]WifiNetworkConfig `yaml:"wifi_networks,omitempty"` + ModemNetworks []ModemNetworkConfig `yaml:"modem_networks,omitempty"` } type InterfaceConfig struct { @@ -57,3 +58,9 @@ type WifiNetworkConfig struct { KeyMgmt string `yaml:"key_mgmt,omitempty"` Password string `yaml:"password,omitempty"` } + +type ModemNetworkConfig struct { + Apn string `yaml:"apn"` + Interface string `yaml:"interface"` + ExtraArgs string `yaml:"extra_args,omitempty"` +} diff --git a/pkg/sysinit/sysinit.go b/pkg/sysinit/sysinit.go index 125ded99..44020e1a 100644 --- a/pkg/sysinit/sysinit.go +++ b/pkg/sysinit/sysinit.go @@ -2,6 +2,7 @@ package sysinit import ( "fmt" + "io/ioutil" "os" "os/exec" "path" @@ -124,7 +125,33 @@ func SysInit() error { return err } +func loadServicesCache() { + // this code make sure the open-vm-tools, modem-manager... services can be started correct when there is no network + // make sure the cache directory exist + if err := os.MkdirAll("/var/lib/rancher/cache/", os.ModeDir|0755); err != nil { + log.Errorf("Create service cache diretory error: %v", err) + } + + // move os-services cache file + if _, err := os.Stat("/usr/share/ros/services-cache"); err == nil { + files, err := ioutil.ReadDir("/usr/share/ros/services-cache/") + if err != nil { + log.Errorf("Read file error: %v", err) + } + for _, f := range files { + err := os.Rename("/usr/share/ros/services-cache/"+f.Name(), "/var/lib/rancher/cache/"+f.Name()) + if err != nil { + log.Errorf("Rename file error: %v", err) + } + } + if err := os.Remove("/usr/share/ros/services-cache"); err != nil { + log.Errorf("Remove file error: %v", err) + } + } +} + func RunSysInit(c *config.CloudConfig) (*config.CloudConfig, error) { + loadServicesCache() args := append([]string{config.SysInitBin}, os.Args[1:]...) cmd := &exec.Cmd{