mirror of https://github.com/ouqiang/gocron
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.5 KiB
135 lines
3.5 KiB
package models
|
|
|
|
import (
|
|
"github.com/ouqiang/gocron/modules/ssh"
|
|
"github.com/go-xorm/xorm"
|
|
"github.com/ouqiang/gocron/modules/app"
|
|
"github.com/ouqiang/gocron/modules/utils"
|
|
"errors"
|
|
"io/ioutil"
|
|
"strings"
|
|
"github.com/ouqiang/gocron/modules/logger"
|
|
)
|
|
|
|
// 主机
|
|
type Host struct {
|
|
Id int16 `xorm:"smallint pk autoincr"`
|
|
Name string `xorm:"varchar(64) notnull"` // 主机名称
|
|
Alias string `xorm:"varchar(32) notnull default '' "` // 主机别名
|
|
Username string `xorm:"varchar(32) notnull default '' "` // ssh 用户名
|
|
Port int `xorm:"notnull default 22"` // 主机端口
|
|
Remark string `xorm:"varchar(100) notnull default '' "` // 备注
|
|
AuthType ssh.HostAuthType `xorm:"tinyint notnull default 1"` // 认证方式 1: 密码 2: 公钥
|
|
BaseModel `xorm:"-"`
|
|
}
|
|
|
|
// 新增
|
|
func (host *Host) Create() (insertId int16, err error) {
|
|
_, err = Db.Insert(host)
|
|
if err == nil {
|
|
insertId = host.Id
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (host *Host) UpdateBean(id int16) (int64, error) {
|
|
return Db.ID(id).Cols("name,alias,username,port,remark,auth_type").Update(host)
|
|
}
|
|
|
|
|
|
// 更新
|
|
func (host *Host) Update(id int, data CommonMap) (int64, error) {
|
|
return Db.Table(host).ID(id).Update(data)
|
|
}
|
|
|
|
// 删除
|
|
func (host *Host) Delete(id int) (int64, error) {
|
|
return Db.Id(id).Delete(host)
|
|
}
|
|
|
|
func (host *Host) Find(id int) error {
|
|
_, err := Db.Id(id).Get(host)
|
|
|
|
return err
|
|
}
|
|
|
|
func (host *Host) NameExists(name string, id int16) (bool, error) {
|
|
if id == 0 {
|
|
count, err := Db.Where("name = ?", name).Count(host);
|
|
return count > 0, err
|
|
}
|
|
|
|
count, err := Db.Where("name = ? AND id != ?", name, id).Count(host);
|
|
return count > 0, err
|
|
}
|
|
|
|
func (host *Host) List(params CommonMap) ([]Host, error) {
|
|
host.parsePageAndPageSize(params)
|
|
list := make([]Host, 0)
|
|
session := Db.Desc("id")
|
|
host.parseWhere(session, params)
|
|
err := session.Limit(host.PageSize, host.pageLimitOffset()).Find(&list)
|
|
|
|
return list, err
|
|
}
|
|
|
|
func (host *Host) AllList() ([]Host, error) {
|
|
list := make([]Host, 0)
|
|
err := Db.Desc("id").Find(&list)
|
|
|
|
return list, err
|
|
}
|
|
|
|
func (host *Host) Total(params CommonMap) (int64, error) {
|
|
session := Db.NewSession()
|
|
host.parseWhere(session, params)
|
|
return session.Count(host)
|
|
}
|
|
|
|
func (h *Host) GetPasswordByHost(host string) (string, error) {
|
|
path := app.DataDir + "/ssh/password/" + host
|
|
|
|
|
|
return h.readFile(path)
|
|
}
|
|
|
|
func (h *Host) GetPrivateKeyByHost(host string) (string,error) {
|
|
path := app.DataDir + "/ssh/private_key/" + host
|
|
|
|
return h.readFile(path)
|
|
}
|
|
|
|
func (host *Host) readFile(file string) (string, error) {
|
|
logger.Debug("认证文件路径: ", file)
|
|
if !utils.FileExist(file) {
|
|
return "", errors.New(file + "-认证文件不存在或无权限访问")
|
|
}
|
|
|
|
contentByte, err := ioutil.ReadFile(file)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
content := string(contentByte)
|
|
content = strings.TrimSpace(content)
|
|
if content == "" {
|
|
return "", errors.New("密码为空")
|
|
}
|
|
|
|
return content, nil
|
|
}
|
|
|
|
// 解析where
|
|
func (host *Host) parseWhere(session *xorm.Session, params CommonMap) {
|
|
if len(params) == 0 {
|
|
return
|
|
}
|
|
id, ok := params["Id"]
|
|
if ok && id.(int) > 0 {
|
|
session.And("id = ?", id)
|
|
}
|
|
name, ok := params["Name"]
|
|
if ok && name.(string) != "" {
|
|
session.And("name = ?", name)
|
|
}
|
|
} |