Skip to content

Commit 6d0f9cc

Browse files
committed
cmdb-k8s
1 parent 8fd4260 commit 6d0f9cc

675 files changed

Lines changed: 124767 additions & 1116 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
云管系统,对接腾讯云、阿里云
1+
cmdb资产管理系统,对接kubernetes集群、腾讯云、阿里云、gitlab、prometheus

server/buildservice/build.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package buildservice
2+
3+
import (
4+
"fmt"
5+
"path/filepath"
6+
"sync"
7+
"time"
8+
9+
"github.com/CosmicBDry/gocmdb/server/models"
10+
"github.com/CosmicBDry/gocmdb/server/rwFile"
11+
"github.com/CosmicBDry/gocmdb/server/systemCommand"
12+
13+
"github.com/astaxie/beego"
14+
)
15+
16+
type BuildService struct {
17+
Mutex sync.RWMutex //读写锁
18+
ProjectId map[int64]bool //判断项目是否再构建中
19+
}
20+
21+
func NewBuildService() *BuildService {
22+
23+
return &BuildService{
24+
Mutex: sync.RWMutex{},
25+
ProjectId: make(map[int64]bool),
26+
}
27+
}
28+
29+
var DefaultBuildService = NewBuildService()
30+
31+
func (b *BuildService) Build(gitproject *models.GitProject) error {
32+
b.Mutex.RLock() //添加一个读锁,每次只允许一个进程读取b.ProjectId映射
33+
if _, ok := b.ProjectId[gitproject.ProjectId]; ok {
34+
b.Mutex.RUnlock() //读完之后将锁释放,使得其他进程可读
35+
beego.Warning(gitproject.SShUrl + ": 项目正在构建中...,请不要重复构建!")
36+
return fmt.Errorf("Is Building")
37+
}
38+
b.Mutex.RUnlock() ////读完之后将锁释放
39+
b.ProjectId[gitproject.ProjectId] = true
40+
41+
//构建脚本:------------------------------------------------------------------------------->
42+
WorkDir := beego.AppConfig.DefaultString("builder::BuildDir", "/tmp/")
43+
ProjectDir := fmt.Sprintf("%sProject_%s/", WorkDir, gitproject.Name)
44+
PackageDir := beego.AppConfig.DefaultString("builder::PackageDir", "/tmp/")
45+
Now := time.Now().Format("2006-01-02_15-04-05")
46+
PackageCmd := fmt.Sprintf("cd %s%s/%s/target && tar czf %s%s/%s.tar.gz ./* && wait && sleep 5\n", ProjectDir, gitproject.Branch, gitproject.Name, PackageDir, gitproject.Name, Now)
47+
if gitproject.PackageFile != "" {
48+
PackageCmd = fmt.Sprintf("cd %s%s/%s && cp -a {%s,} ./target/ && wait && sleep 5 &&cd ./target && tar czf %s%s/%s.tar.gz ./* && wait && sleep 5\n", ProjectDir, gitproject.Branch, gitproject.Name, gitproject.PackageFile, PackageDir, gitproject.Name, Now)
49+
fmt.Println("----->: ", PackageCmd)
50+
}
51+
cmd := []string{
52+
fmt.Sprintf("rm -rf %s && wait && mkdir -p %s%s && echo `%s` >> %s%s/build.log && wait\n", ProjectDir, ProjectDir, gitproject.Branch, "date +%Y-%m-%d_%H:%M:%S", ProjectDir, gitproject.Branch),
53+
fmt.Sprintf("mkdir -p %s%s\n", PackageDir, gitproject.Name),
54+
fmt.Sprintf("cd %s%s &&git clone -b %s %s %s && wait && sleep 5\n", ProjectDir, gitproject.Branch, gitproject.Branch, gitproject.SShUrl, gitproject.Name),
55+
fmt.Sprintf("cd %s%s/%s && go build -o ./target/%s && wait && sleep 5\n", ProjectDir, gitproject.Branch, gitproject.Name, gitproject.Name),
56+
PackageCmd,
57+
}
58+
59+
for _, v := range cmd {
60+
var result string
61+
var err error
62+
path := fmt.Sprintf("%s%s/build.log", ProjectDir, gitproject.Branch)
63+
if result, err = systemCommand.RunCmd(v); err != nil {
64+
beego.Error(gitproject.SShUrl + ": 项目代码构建失败,详情请查看build.log构建记录")
65+
if errs := rwFile.WriteFile(result+err.Error()+"\n", path); errs != nil {
66+
beego.Error(path + " :代码构建记录写入失败," + errs.Error())
67+
}
68+
delete(b.ProjectId, gitproject.ProjectId)
69+
return err
70+
}
71+
72+
if result == "" {
73+
result = "执行成功: " + v
74+
}
75+
76+
if err = rwFile.WriteFile(result, path); err != nil {
77+
beego.Error(path + " :代码构建记录写入失败," + err.Error())
78+
continue
79+
}
80+
}
81+
beego.Informational(gitproject.SShUrl + ": 项目构建成功!")
82+
delete(b.ProjectId, gitproject.ProjectId)
83+
return nil
84+
}
85+
86+
func GetBuildLog(gitproject *models.GitProject) string {
87+
WorkDir := beego.AppConfig.DefaultString("builder::BuildDir", "/tmp/")
88+
ProjectDir := fmt.Sprintf("%sProject_%s/", WorkDir, gitproject.Name)
89+
Path := filepath.Join(ProjectDir, gitproject.Branch, "/", "build.log")
90+
return rwFile.ReadFile(Path)
91+
}

server/cloudSync.go

Lines changed: 0 additions & 77 deletions
This file was deleted.

server/cmdb.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package main
2+
3+
import (
4+
"github.com/CosmicBDry/gocmdb/server/cobraCmd"
5+
)
6+
7+
func main() {
8+
9+
cobraCmd.RootCmd.Execute()
10+
11+
}

server/cobraCmd/cloudSync.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package cobraCmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"time"
7+
8+
"github.com/CosmicBDry/gocmdb/server/cloud"
9+
"github.com/CosmicBDry/gocmdb/server/models"
10+
"github.com/astaxie/beego"
11+
"github.com/astaxie/beego/orm"
12+
"github.com/spf13/cobra"
13+
)
14+
15+
var (
16+
cloudsync bool
17+
)
18+
19+
var SyncCmd = &cobra.Command{
20+
Use: "cloudsync",
21+
Short: "lauch a cloudsync process ",
22+
Long: "lauch a cloudsync process ",
23+
RunE: func(cmd *cobra.Command, args []string) error {
24+
25+
orm.RegisterDriver("mysql", orm.DRMySQL)
26+
orm.RegisterDataBase("default", "mysql", beego.AppConfig.String("dsn"))
27+
28+
if db, err := orm.GetDB(); err != nil || db.Ping() != nil {
29+
beego.Error("数据库连接失败")
30+
os.Exit(-1)
31+
}
32+
33+
beego.SetLogger("file", `{"level":7,"filename":"logs/cloudsync.log","maxdays":15,"maxlines":1000}`)
34+
35+
//通过遍历time.Tick(n * time.second)函数实现每间隔n秒后执行以下for循环中的操作
36+
for now := range time.Tick(5 * time.Second) {
37+
fmt.Println(now)
38+
_, _, Platforms := models.DefautlCloudPlatformManager.QueryList(0, 0, 0, "", "", "", "")
39+
for _, platform := range Platforms {
40+
if platform.Status == models.StatusLock {
41+
continue
42+
}
43+
//fmt.Println(platform)
44+
sdk := cloud.DefaultCloudManager.Plugins[platform.Types]
45+
sdk.Init(platform.Addr, platform.Region, platform.AccessKey, platform.SecretKey)
46+
instances := sdk.GetInstances()
47+
fmt.Printf("%#v\n", instances)
48+
if len(instances) == 0 {
49+
50+
models.DefaultVirtualMachineManager.SyncVmStatus(&platform, now) //同步虚拟机状态
51+
models.DefautlCloudPlatformManager.CloudSyncTime(&platform, now) //云平台最后一次同步时间
52+
}
53+
for _, instance := range instances {
54+
if err := models.DefaultVirtualMachineManager.SyncVmByCloudPlatform(&platform, instance); err == nil {
55+
models.DefaultVirtualMachineManager.SyncVmStatus(&platform, now) //同步虚拟机状态
56+
models.DefautlCloudPlatformManager.CloudSyncTime(&platform, now) //云平台最后一次同步时间
57+
}
58+
}
59+
}
60+
}
61+
return nil
62+
},
63+
}
64+
65+
func init() {
66+
RootCmd.AddCommand(SyncCmd)
67+
68+
SyncCmd.Flags().BoolVarP(&cloudsync, "cloudsync", "s", false, "sync cloud machine")
69+
70+
}

server/cobraCmd/root.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cobraCmd
2+
3+
//子命令的初始化包都可以放到此处,如下
4+
import (
5+
_ "github.com/CosmicBDry/gocmdb/server/cloud/plugins"
6+
_ "github.com/go-sql-driver/mysql"
7+
"github.com/spf13/cobra"
8+
)
9+
10+
var RootCmd = &cobra.Command{
11+
Use: "cmdb [web]",
12+
Short: "Asset management system[CMDB]",
13+
Long: "Asset management system[CMDB]",
14+
}
15+
16+
func Execute() {
17+
RootCmd.Execute()
18+
}

server/cobraCmd/web.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package cobraCmd
2+
3+
import (
4+
"os"
5+
"time"
6+
7+
"github.com/CosmicBDry/gocmdb/server/models"
8+
"github.com/CosmicBDry/gocmdb/server/routers"
9+
"github.com/CosmicBDry/gocmdb/server/utils"
10+
"github.com/astaxie/beego"
11+
"github.com/astaxie/beego/orm"
12+
13+
"github.com/spf13/cobra"
14+
)
15+
16+
var (
17+
initial, syncdb, force, verbose, resetPassword bool
18+
)
19+
20+
var WebCmd = &cobra.Command{
21+
Use: "web",
22+
Short: "lauch web program",
23+
Long: "lauch web program",
24+
RunE: func(cmd *cobra.Command, args []string) error {
25+
26+
orm.RegisterDriver("mysql", orm.DRMySQL)
27+
orm.RegisterDataBase("default", "mysql", beego.AppConfig.String("dsn"))
28+
29+
if db, err := orm.GetDB(); err != nil || db.Ping() != nil {
30+
beego.Error("数据库连接失败")
31+
os.Exit(-1)
32+
}
33+
routers.Register()
34+
beego.SetLogger("file", `{"level":7,"filename":"logs/web.log","maxdays":15,"maxlines":10000}`)
35+
switch {
36+
case initial:
37+
orm.RunSyncdb("default", force, verbose)
38+
Birth := time.Now()
39+
admin := &models.User{Name: "admin", IsSuperman: true, Birthday: &Birth}
40+
ormer := orm.NewOrm()
41+
if err := ormer.Read(admin, "Name"); err == orm.ErrNoRows {
42+
Password := utils.RandString(20)
43+
admin.SetPassword(Password)
44+
if _, err := ormer.Insert(admin); err == nil {
45+
beego.Informational("Database table and user 'admin' have been initialized , admin password is: ", Password)
46+
} else {
47+
48+
beego.Informational("admin initialization failed!")
49+
50+
}
51+
52+
} else {
53+
54+
beego.Informational("Database table has been initialized,but admin is already exist,admin does not need to be initialized!")
55+
}
56+
case syncdb:
57+
orm.RunSyncdb("default", force, verbose)
58+
beego.Informational("sync table success!")
59+
case resetPassword:
60+
admin := &models.User{Id: 1}
61+
password := utils.RandString(20)
62+
admin.SetPassword(password)
63+
ormer := orm.NewOrm()
64+
if rows, err := ormer.Update(admin, "Password"); rows != 0 && err == nil {
65+
beego.Informational("User 'admin' reset success,admin password is : ", password)
66+
} else {
67+
beego.Error("User 'admin' Password reset failed,Ensure that the user 'admin' exists or please check the database connection!")
68+
69+
}
70+
71+
default:
72+
beego.Run()
73+
}
74+
75+
return nil
76+
},
77+
}
78+
79+
func init() {
80+
81+
RootCmd.AddCommand(WebCmd)
82+
WebCmd.Flags().BoolVarP(&initial, "init", "I", false, "sync table,according to your needs,Adding '-force' option to reset table and admin password")
83+
WebCmd.Flags().BoolVarP(&syncdb, "sync", "S", false, "sync table")
84+
WebCmd.Flags().BoolVarP(&force, "force", "F", false, "force sync db(drop table)")
85+
WebCmd.Flags().BoolVarP(&verbose, "verbose", "V", false, "display detailed information of sql")
86+
WebCmd.Flags().BoolVarP(&resetPassword, "resetPassword", "R", false, "only reset admin password!")
87+
88+
}

0 commit comments

Comments
 (0)