func initialize() *daemonState { sigs := make(chan os.Signal) signal.Notify(sigs, syscall.SIGHUP, syscall.SIGUSR2) d := &daemonState{} d.initializeLogging() config, err := d.loadConfig() if err != nil { d.log.Error("Could not load configuration: %s", oz.DefaultConfigPath, err) os.Exit(1) } d.config = config ps, err := d.loadProfiles(d.config.ProfileDir) if err != nil { d.log.Fatalf("Failed to load profiles: %v", err) os.Exit(1) } d.profiles = ps if err := d.cacheSystemGroups(); err != nil { d.log.Fatalf("Unable to cache list of system groups: %v", err) } oz.ReapChildProcs(d.log, d.handleChildExit) d.nextSboxId = 1 d.nextDisplay = 100 bridgeNeeded := false staticBytes := []uint{} for _, pp := range d.profiles { if pp.Networking.Nettype == network.TYPE_BRIDGE { bridgeNeeded = true if pp.Networking.IpByte > 0 { staticBytes = append(staticBytes, pp.Networking.IpByte) } } } if bridgeNeeded { d.log.Info("Initializing bridge networking") htn, err := network.BridgeInit(d.config.BridgeMACAddr, d.config.NMIgnoreFile, d.log) if err != nil { d.log.Fatalf("Failed to initialize bridge networking: %+v", err) return nil } d.network = htn d.network.IpBytes = staticBytes //network.NetPrint(d.log) } sockets := path.Join(config.SandboxPath, "sockets") if err := os.MkdirAll(sockets, 0755); err != nil { d.log.Fatalf("Failed to create sockets directory: %v", err) } os.Clearenv() go d.processSignals(sigs) return d }
func initialize() *daemonState { sigs := make(chan os.Signal) signal.Notify(sigs, syscall.SIGHUP, syscall.SIGUSR1) d := &daemonState{} d.initializeLogging() config, err := d.loadConfig() if err != nil { d.log.Error("Could not load configuration: %s", oz.DefaultConfigPath, err) os.Exit(1) } d.config = config ps, err := d.loadProfiles(d.config.ProfileDir) if err != nil { d.log.Fatalf("Failed to load profiles: %v", err) os.Exit(1) } d.profiles = ps oz.ReapChildProcs(d.log, d.handleChildExit) d.nextSboxId = 1 d.nextDisplay = 100 for _, pp := range d.profiles { if pp.Networking.Nettype == network.TYPE_BRIDGE { d.log.Info("Initializing bridge networking") htn, err := network.BridgeInit(d.config.BridgeMACAddr, d.config.NMIgnoreFile, d.log) if err != nil { d.log.Fatalf("Failed to initialize bridge networking: %+v", err) return nil } d.network = htn network.NetPrint(d.log) break } } sockets := path.Join(config.SandboxPath, "sockets") if err := os.MkdirAll(sockets, 0755); err != nil { d.log.Fatalf("Failed to create sockets directory: %v", err) } go d.processSignals(sigs) return d }
func (st *initState) runInit() { st.log.Info("Starting oz-init for profile: %s", st.profile.Name) sigs := make(chan os.Signal) signal.Notify(sigs, syscall.SIGTERM, os.Interrupt) s, err := ipc.NewServer(st.sockaddr, messageFactory, st.log, handlePing, st.handleRunProgram, st.handleRunShell, ) if err != nil { st.log.Error("NewServer failed: %v", err) os.Exit(1) } if err := os.Chown(st.sockaddr, int(st.uid), int(st.gid)); err != nil { st.log.Warning("Failed to chown oz-init control socket: %v", err) } if err := st.setupFilesystem(nil); err != nil { st.log.Error("Failed to setup filesytem: %v", err) os.Exit(1) } if st.user != nil && st.user.HomeDir != "" { st.launchEnv = append(st.launchEnv, "HOME="+st.user.HomeDir) } if st.profile.Networking.Nettype != network.TYPE_HOST { err := network.NetSetup(st.network) if err != nil { st.log.Error("Unable to setup networking: %+v", err) os.Exit(1) } } network.NetPrint(st.log) if syscall.Sethostname([]byte(st.profile.Name)) != nil { st.log.Error("Failed to set hostname to (%s)", st.profile.Name) os.Exit(1) } if syscall.Setdomainname([]byte("local")) != nil { st.log.Error("Failed to set domainname") } st.log.Info("Hostname set to (%s.local)", st.profile.Name) if err := st.setupDbus(); err != nil { st.log.Error("Unable to setup dbus: %v", err) os.Exit(1) } oz.ReapChildProcs(st.log, st.handleChildExit) if st.profile.XServer.Enabled { st.xpraReady.Add(1) st.startXpraServer() } st.xpraReady.Wait() st.log.Info("XPRA started") if st.needsDbus() { if err := st.getDbusSession(); err != nil { st.log.Error("Unable to get dbus session information: %v", err) os.Exit(1) } } fsbx := path.Join("/tmp", "oz-sandbox") err = ioutil.WriteFile(fsbx, []byte(st.profile.Name), 0644) // Signal the daemon we are ready os.Stderr.WriteString("OK\n") go st.processSignals(sigs, s) st.ipcServer = s if err := s.Run(); err != nil { st.log.Warning("MsgServer.Run() return err: %v", err) } st.log.Info("oz-init exiting...") }