1
0

Implements command for generate all kernels for distro/version

This commit is contained in:
dump_stack() 2018-12-02 19:54:09 +00:00
parent 3fdb2736c8
commit 825d69b770
3 changed files with 76 additions and 38 deletions

View File

@ -66,13 +66,9 @@ Use custom kernels config
$ out-of-tree --kernels /path/to/kernels.toml pew $ out-of-tree --kernels /path/to/kernels.toml pew
## Generate all kernels Generate all kernels
Does not required if you dont need to use `--guess`. $ out-of-tree kernel genall --distro Ubuntu --ver 16.04
$ cd $GOPATH/src/github.com/jollheef/out-of-tree/tools/kernel-factory
$ ./bootstrap.sh # more than 6-8 hours for all kernels
$ export OUT_OF_TREE_KCFG=$GOPATH/src/github.com/jollheef/out-of-tree/tools/kernel-factory/output/kernels.toml
## Development ## Development

View File

@ -29,17 +29,17 @@ func kernelListHandler(kcfg config.KernelConfig) (err error) {
return return
} }
func matchDebianKernelPkg(container, mask string, generic bool) (pkgs []string, func matchDebianHeadersPkg(container, mask string, generic bool) (
err error) { pkgs []string, err error) {
cmd := "apt-cache search linux-image | cut -d ' ' -f 1" cmd := "apt-cache search linux-headers | cut -d ' ' -f 1"
c := dockerCommand(container, "/tmp", "1m", cmd) c := dockerCommand(container, "/tmp", "1m", cmd)
rawOutput, err := c.CombinedOutput() rawOutput, err := c.CombinedOutput()
if err != nil { if err != nil {
return return
} }
r, err := regexp.Compile("linux-image-" + mask) r, err := regexp.Compile("linux-headers-" + mask)
if err != nil { if err != nil {
return return
} }
@ -51,6 +51,9 @@ func matchDebianKernelPkg(container, mask string, generic bool) (pkgs []string,
if generic && !strings.HasSuffix(pkg, "generic") { if generic && !strings.HasSuffix(pkg, "generic") {
continue continue
} }
if pkg == "linux-headers-generic" {
continue
}
pkgs = append(pkgs, pkg) pkgs = append(pkgs, pkg)
} }
@ -144,11 +147,12 @@ func dockerImageAppend(sk config.KernelMask, pkgname string) (err error) {
return return
} }
log.Printf("Start adding kernel %s for %s:%s", imagepkg := strings.Replace(pkgname, "headers", "image", -1)
pkgname, sk.DistroType.String(), sk.DistroRelease)
s := fmt.Sprintf("RUN apt-get install -y %s %s\n", pkgname, log.Printf("Start adding kernel %s for %s:%s",
strings.Replace(pkgname, "image", "headers", -1)) imagepkg, sk.DistroType.String(), sk.DistroRelease)
s := fmt.Sprintf("RUN apt-get install -y %s %s\n", imagepkg, pkgname)
err = ioutil.WriteFile(imagePath+"/Dockerfile", err = ioutil.WriteFile(imagePath+"/Dockerfile",
append(raw, []byte(s)...), 0644) append(raw, []byte(s)...), 0644)
@ -389,6 +393,38 @@ func hasKernel(ki config.KernelInfo, kcfg config.KernelConfig) bool {
return false return false
} }
func generateKernels(km config.KernelMask) (err error) {
err = generateBaseDockerImage(km)
if err != nil {
return
}
var pkgs []string
pkgs, err = matchDebianHeadersPkg(km.DockerName(),
km.ReleaseMask, true)
if err != nil {
return
}
for i, pkg := range pkgs {
log.Println(i, "/", len(pkgs))
dockerImageAppend(km, pkg)
}
err = kickImage(km.DockerName())
if err != nil {
log.Println("kick image", km.DockerName(), ":", err)
return
}
err = copyKernels(km.DockerName())
if err != nil {
log.Println("copy kernels", km.DockerName(), ":", err)
return
}
return
}
func kernelAutogenHandler(workPath string) (err error) { func kernelAutogenHandler(workPath string) (err error) {
ka, err := config.ReadArtifactConfig(workPath + "/.out-of-tree.toml") ka, err := config.ReadArtifactConfig(workPath + "/.out-of-tree.toml")
if err != nil { if err != nil {
@ -401,33 +437,10 @@ func kernelAutogenHandler(workPath string) (err error) {
return return
} }
err = generateBaseDockerImage(sk) err = generateKernels(sk)
if err != nil { if err != nil {
return return
} }
var pkgs []string
pkgs, err = matchDebianKernelPkg(sk.DockerName(),
sk.ReleaseMask, true)
if err != nil {
return
}
for _, pkg := range pkgs {
dockerImageAppend(sk, pkg)
}
err = kickImage(sk.DockerName())
if err != nil {
log.Println("kick image", sk.DockerName(), ":", err)
continue
}
err = copyKernels(sk.DockerName())
if err != nil {
log.Println("copy kernels", sk.DockerName(), ":", err)
continue
}
} }
err = updateKernelsCfg() err = updateKernelsCfg()
@ -474,3 +487,22 @@ func kernelDockerRegenHandler() (err error) {
return updateKernelsCfg() return updateKernelsCfg()
} }
func kernelGenallHandler(distro, version string) (err error) {
distroType, err := config.NewDistroType(distro)
if err != nil {
return
}
km := config.KernelMask{
DistroType: distroType,
DistroRelease: version,
ReleaseMask: ".*",
}
err = generateKernels(km)
if err != nil {
return
}
return updateKernelsCfg()
}

10
main.go
View File

@ -99,6 +99,14 @@ func main() {
"Generate kernels based on a current config") "Generate kernels based on a current config")
kernelDockerRegenCommand := kernelCommand.Command("docker-regen", kernelDockerRegenCommand := kernelCommand.Command("docker-regen",
"Regenerate kernels config from out_of_tree_* docker images") "Regenerate kernels config from out_of_tree_* docker images")
kernelGenallCommand := kernelCommand.Command("genall",
"Generate all kernels for distro")
genallDistroFlag := kernelGenallCommand.Flag("distro", "Distributive")
distro := genallDistroFlag.Required().String()
genallVerFlag := kernelGenallCommand.Flag("ver", "Distro version")
version := genallVerFlag.Required().String()
genCommand := app.Command("gen", "Generate .out-of-tree.toml skeleton") genCommand := app.Command("gen", "Generate .out-of-tree.toml skeleton")
genModuleCommand := genCommand.Command("module", genModuleCommand := genCommand.Command("module",
@ -169,6 +177,8 @@ func main() {
err = kernelAutogenHandler(*path) err = kernelAutogenHandler(*path)
case kernelDockerRegenCommand.FullCommand(): case kernelDockerRegenCommand.FullCommand():
err = kernelDockerRegenHandler() err = kernelDockerRegenHandler()
case kernelGenallCommand.FullCommand():
err = kernelGenallHandler(*distro, *version)
case genModuleCommand.FullCommand(): case genModuleCommand.FullCommand():
err = genConfig(config.KernelModule) err = genConfig(config.KernelModule)
case genExploitCommand.FullCommand(): case genExploitCommand.FullCommand():