Implements bootstrap, fixes #3
This commit is contained in:
		
							
								
								
									
										7
									
								
								bootstrap.config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								bootstrap.config.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | // Copyright 2018 Mikhail Klementev. All rights reserved. | ||||||
|  | // Use of this source code is governed by a AGPLv3 license | ||||||
|  | // (or later) that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package main | ||||||
|  |  | ||||||
|  | const imagesURL = "https://github.com/jollheef/out-of-tree/releases/download/v0.2/images.tar.gz" | ||||||
							
								
								
									
										76
									
								
								bootstrap.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								bootstrap.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | // Copyright 2018 Mikhail Klementev. All rights reserved. | ||||||
|  | // Use of this source code is governed by a AGPLv3 license | ||||||
|  | // (or later) that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"log" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"os/user" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // inspired by Edd Turtle code | ||||||
|  | func downloadFile(filepath string, url string) (err error) { | ||||||
|  | 	out, err := os.Create(filepath) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer out.Close() | ||||||
|  |  | ||||||
|  | 	resp, err := http.Get(url) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer resp.Body.Close() | ||||||
|  |  | ||||||
|  | 	_, err = io.Copy(out, resp.Body) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func unpackTar(archive, destination string) (err error) { | ||||||
|  | 	cmd := exec.Command("tar", "xf", archive) | ||||||
|  | 	cmd.Dir = destination + "/" | ||||||
|  |  | ||||||
|  | 	rawOutput, err := cmd.CombinedOutput() | ||||||
|  | 	if err != nil { | ||||||
|  | 		// I don't like when some errors printed inside | ||||||
|  | 		// So if you know way to do it better - FIXME please | ||||||
|  | 		log.Println("Unpack images error:", string(rawOutput), err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func bootstrapHandler() (err error) { | ||||||
|  | 	usr, err := user.Current() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	imagesPath := usr.HomeDir + "/.out-of-tree/images/" | ||||||
|  | 	os.MkdirAll(imagesPath, os.ModePerm) | ||||||
|  |  | ||||||
|  | 	tmp, err := ioutil.TempDir("/tmp/", "out-of-tree_") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println("Temporary directory creation error:", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer os.RemoveAll(tmp) | ||||||
|  |  | ||||||
|  | 	imagesArchive := tmp + "/images.tar.gz" | ||||||
|  |  | ||||||
|  | 	err = downloadFile(imagesArchive, imagesURL) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println("Download file error:", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = unpackTar(imagesArchive, imagesPath) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.go
									
									
									
									
									
								
							| @@ -78,6 +78,9 @@ func main() { | |||||||
| 	debugFlagGDB := debugCommand.Flag("gdb", "Set gdb listen address") | 	debugFlagGDB := debugCommand.Flag("gdb", "Set gdb listen address") | ||||||
| 	debugGDB := debugFlagGDB.Default("tcp::1234").String() | 	debugGDB := debugFlagGDB.Default("tcp::1234").String() | ||||||
|  |  | ||||||
|  | 	bootstrapCommand := app.Command("bootstrap", | ||||||
|  | 		"Create directories && download images") | ||||||
|  |  | ||||||
| 	// Check for required commands | 	// Check for required commands | ||||||
| 	for _, cmd := range []string{"timeout", "docker", "qemu"} { | 	for _, cmd := range []string{"timeout", "docker", "qemu"} { | ||||||
| 		_, err := exec.Command("which", cmd).CombinedOutput() | 		_, err := exec.Command("which", cmd).CombinedOutput() | ||||||
| @@ -123,6 +126,8 @@ func main() { | |||||||
| 	case debugCommand.FullCommand(): | 	case debugCommand.FullCommand(): | ||||||
| 		err = debugHandler(kcfg, *path, *debugKernel, *debugGDB, | 		err = debugHandler(kcfg, *path, *debugKernel, *debugGDB, | ||||||
| 			*dockerTimeout) | 			*dockerTimeout) | ||||||
|  | 	case bootstrapCommand.FullCommand(): | ||||||
|  | 		err = bootstrapHandler() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user