Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions SimpleInstall/Linstall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
package main

import (
"archive/tar"
"bufio"
"bytes"
"compress/gzip"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
)

// public command to do something, for example:to execute a command
func publicCommand() {

}
func osCommand() {

cmd := exec.Command("mkdir", "-p", "/etc/docker")
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout // 标准输出
cmd.Stderr = &stderr // 标准错误
err := cmd.Run()
outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
}

func creatService() {
var dockerService = `
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io

[Service]
Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart=/usr/local/bin/dockerd
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
`

filePath := "/Users/yun/dev/code/go/devops/SimpleInstall/docker.service"
//filePath := "/usr/lib/systemd/system/docker.service"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打开失败", err)
}
//及时关闭file句柄
defer file.Close()
//写入文件时,使用带缓存的 *Writer
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
write.WriteString(dockerService)
}
//Flush将缓存的文件真正写入到文件中
write.Flush()
}

// download install source code or executable file
func publicDownloadFile() {
imgUrl := "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-23.0.1.tgz"
// Get the data
resp, err := http.Get(imgUrl)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 创建一个文件用于保存
out, err := os.Create("docker-23.0.1.tgz")
if err != nil {
panic(err)
}
defer out.Close()

// 然后将响应流和文件流对接起来
_, err = io.Copy(out, resp.Body)
if err != nil {
panic(err)
}
}

// create system service
func createSystemlServices() {

}

func UnTar(dst, src string) (err error) {
// 打开准备解压的 tar 包
fr, err := os.Open(src)
if err != nil {
return
}
defer fr.Close()

// 将打开的文件先解压
gr, err := gzip.NewReader(fr)
if err != nil {
return
}
defer gr.Close()

// 通过 gr 创建 tar.Reader
tr := tar.NewReader(gr)

// 现在已经获得了 tar.Reader 结构了,只需要循环里面的数据写入文件就可以了
for {
hdr, err := tr.Next()

switch {
case err == io.EOF:
return nil
case err != nil:
return err
case hdr == nil:
continue
}

// 处理下保存路径,将要保存的目录加上 header 中的 Name
// 这个变量保存的有可能是目录,有可能是文件,所以就叫 FileDir 了……
dstFileDir := filepath.Join(dst, hdr.Name)

// 根据 header 的 Typeflag 字段,判断文件的类型
switch hdr.Typeflag {
case tar.TypeDir: // 如果是目录时候,创建目录
// 判断下目录是否存在,不存在就创建
if b := ExistDir(dstFileDir); !b {
// 使用 MkdirAll 不使用 Mkdir ,就类似 Linux 终端下的 mkdir -p,
// 可以递归创建每一级目录
if err := os.MkdirAll(dstFileDir, 0775); err != nil {
return err
}
}
case tar.TypeReg: // 如果是文件就写入到磁盘
// 创建一个可以读写的文件,权限就使用 header 中记录的权限
// 因为操作系统的 FileMode 是 int32 类型的,hdr 中的是 int64,所以转换下
file, err := os.OpenFile(dstFileDir, os.O_CREATE|os.O_RDWR, os.FileMode(hdr.Mode))
if err != nil {
return err
}
n, err := io.Copy(file, tr)
if err != nil {
return err
}
// 将解压结果输出显示
fmt.Printf("成功解压: %s , 共处理了 %d 个字符\n", dstFileDir, n)

// 不要忘记关闭打开的文件,因为它是在 for 循环中,不能使用 defer
// 如果想使用 defer 就放在一个单独的函数中
file.Close()
}
}

return nil
}

// 判断目录是否存在
func ExistDir(dirname string) bool {
fi, err := os.Stat(dirname)
return (err == nil || os.IsExist(err)) && fi.IsDir()
}

// https://learnku.com/articles/23433/golang-learning-notes-four-archivetar-package-compression-and-decompression

func initSystem() {

fmt.Println("env config change ok!")
fmt.Println("kernel config change ok!")
fmt.Println("network config change ok!")
}
func installDocker() {

fmt.Println("install docker ok!")
}
func main() {
creatService()
//publicDownloadFile()

//UnTar("", "/Users/yun/dev/code/go/devops/SimpleInstall/docker-23.0.1.tgz")
//creatService()
//installDocker()

}
135 changes: 135 additions & 0 deletions data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
{
"data": {
"timeStamp": 1723899671,
"fetchTimeStamp": 1723899020,
"updateTimeStamp": 1723898460,
"provinceName": "江苏",
"cityName": "南京",
"countyName": "浦口",
"linkSeven": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"currentWeather": "晴",
"currentWeatherIcon": "a0",
"currentTemp": "31",
"currentAqiValue": "46",
"currentAqiLevel": "优",
"weatherArr": [
{
"date": "08月17日",
"time": "周六",
"dateInfo": {
"date": "8月17日",
"lunar": "七月十四",
"timeStamp": 1723824000,
"festival": "",
"weatherSourceUrl": ""
},
"temp": "26 ~ 35",
"wind": "东北风3-4级",
"condition": "多云",
"imgs": [
"a1",
"a1"
],
"link": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"pm25": "46",
"pm25url": "//www.baidu.com/s?wd=南京空气质量指数\u0026amp;tn=baidutop10\u0026amp;rsv_idx=2"
},
{
"date": "08月18日",
"time": "周日",
"dateInfo": {
"date": "8月18日",
"lunar": "七月十五",
"timeStamp": 1723910400,
"festival": "",
"weatherSourceUrl": ""
},
"temp": "27 ~ 35",
"wind": "东风3-4级",
"condition": "多云",
"imgs": [
"a1",
"a1"
],
"link": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"pm25": "",
"pm25url": "//www.baidu.com/s?wd=南京空气质量指数\u0026amp;tn=baidutop10\u0026amp;rsv_idx=2"
},
{
"date": "08月19日",
"time": "周一",
"dateInfo": {
"date": "8月19日",
"lunar": "七月十六",
"timeStamp": 1723996800,
"festival": "",
"weatherSourceUrl": ""
},
"temp": "26 ~ 35",
"wind": "东风3-4级",
"condition": "雷阵雨转中到大雨",
"imgs": [
"a4",
"a1"
],
"link": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"pm25": "",
"pm25url": "//www.baidu.com/s?wd=南京空气质量指数\u0026amp;tn=baidutop10\u0026amp;rsv_idx=2"
},
{
"date": "08月20日",
"time": "周二",
"dateInfo": {
"date": "8月20日",
"lunar": "七月十七",
"timeStamp": 1724083200,
"festival": "",
"weatherSourceUrl": ""
},
"temp": "25 ~ 31",
"wind": "南风3-4级",
"condition": "中到大雨转多云",
"imgs": [
"a1",
"a1"
],
"link": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"pm25": "",
"pm25url": "//www.baidu.com/s?wd=南京空气质量指数\u0026amp;tn=baidutop10\u0026amp;rsv_idx=2"
},
{
"date": "08月21日",
"time": "周三",
"dateInfo": {
"date": "8月21日",
"lunar": "七月十八",
"timeStamp": 1724169600,
"festival": "",
"weatherSourceUrl": ""
},
"temp": "25 ~ 34",
"wind": "西风\u003c3级",
"condition": "阴转多云",
"imgs": [
"a2",
"a1"
],
"link": "http://www.weather.com.cn/weather/101190107.shtml#7d",
"pm25": "",
"pm25url": "//www.baidu.com/s?wd=南京空气质量指数\u0026amp;tn=baidutop10\u0026amp;rsv_idx=2"
}
],
"weatherType": "aladdin",
"pslink": "//www.baidu.com/s?tn=baidutop10\u0026rsv_idx=2\u0026wd=南京天气预报",
"pollution": "0",
"alarm": [
{
"type": "高温",
"level": "黄色",
"color": "fcc419"
}
]
},
"errno": 0,
"msg": "ok"
}
Loading