sysinit.go
58a22942
 package docker
 
 import (
6de3e8a2
 	"flag"
58a22942
 	"fmt"
 	"log"
 	"os"
 	"os/exec"
6de3e8a2
 	"os/user"
 	"strconv"
f7eaaa3a
 	"strings"
58a22942
 	"syscall"
 )
 
b9b66d0e
 // Setup networking
 func setupNetworking(gw string) {
 	if gw == "" {
 		return
 	}
5e1a975b
 	if _, err := ip("route", "add", "default", "via", gw); err != nil {
b9b66d0e
 		log.Fatalf("Unable to set up networking: %v", err)
 	}
 }
 
6de3e8a2
 // Takes care of dropping privileges to the desired user
 func changeUser(u string) {
 	if u == "" {
 		return
 	}
 	userent, err := user.LookupId(u)
 	if err != nil {
 		userent, err = user.Lookup(u)
 	}
 	if err != nil {
 		log.Fatalf("Unable to find user %v: %v", u, err)
 	}
 
 	uid, err := strconv.Atoi(userent.Uid)
 	if err != nil {
 		log.Fatalf("Invalid uid: %v", userent.Uid)
 	}
 	gid, err := strconv.Atoi(userent.Gid)
 	if err != nil {
 		log.Fatalf("Invalid gid: %v", userent.Gid)
 	}
 
 	if err := syscall.Setgid(gid); err != nil {
 		log.Fatalf("setgid failed: %v", err)
 	}
 	if err := syscall.Setuid(uid); err != nil {
 		log.Fatalf("setuid failed: %v", err)
 	}
 }
 
f7eaaa3a
 // Clear environment pollution introduced by lxc-start
7b0e96f1
 func cleanupEnv(env ListOpts) {
f7eaaa3a
 	os.Clearenv()
 	for _, kv := range env {
 		parts := strings.SplitN(kv, "=", 2)
 		if len(parts) == 1 {
 			parts = append(parts, "")
 		}
 		if parts[0] == "container" {
 			continue
 		}
 		os.Setenv(parts[0], parts[1])
 	}
 }
 
6de3e8a2
 func executeProgram(name string, args []string) {
 	path, err := exec.LookPath(name)
 	if err != nil {
 		log.Printf("Unable to locate %v", name)
 		os.Exit(127)
 	}
 
 	if err := syscall.Exec(path, args, os.Environ()); err != nil {
 		panic(err)
 	}
 }
 
58a22942
 // Sys Init code
 // This code is run INSIDE the container and is responsible for setting
 // up the environment before running the actual process
 func SysInit() {
 	if len(os.Args) <= 1 {
 		fmt.Println("You should not invoke docker-init manually")
 		os.Exit(1)
 	}
6de3e8a2
 	var u = flag.String("u", "", "username or uid")
b9b66d0e
 	var gw = flag.String("g", "", "gateway address")
58a22942
 
7b0e96f1
 	var flEnv ListOpts
 	flag.Var(&flEnv, "e", "Set environment variables")
 
6de3e8a2
 	flag.Parse()
b9b66d0e
 
7b0e96f1
 	cleanupEnv(flEnv)
b9b66d0e
 	setupNetworking(*gw)
6de3e8a2
 	changeUser(*u)
 	executeProgram(flag.Arg(0), flag.Args())
58a22942
 }