mirror of https://github.com/Xhofe/alist
111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
package template
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/Xhofe/alist/conf"
|
|
"github.com/Xhofe/alist/drivers/base"
|
|
"github.com/Xhofe/alist/model"
|
|
"github.com/Xhofe/alist/utils"
|
|
"github.com/pkg/sftp"
|
|
"golang.org/x/crypto/ssh"
|
|
"os"
|
|
"path"
|
|
"sync"
|
|
)
|
|
|
|
var clientsMap = struct {
|
|
sync.Mutex
|
|
clients map[string]*Client
|
|
}{clients: make(map[string]*Client)}
|
|
|
|
func GetClient(account *model.Account) (*Client, error) {
|
|
clientsMap.Lock()
|
|
defer clientsMap.Unlock()
|
|
if v, ok := clientsMap.clients[account.Name]; ok {
|
|
return v, nil
|
|
}
|
|
conn, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", account.SiteUrl, account.Limit), &ssh.ClientConfig{
|
|
User: account.Username,
|
|
Auth: []ssh.AuthMethod{ssh.Password(account.Password)},
|
|
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
client, err := sftp.NewClient(conn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
c := &Client{client}
|
|
clientsMap.clients[account.Name] = c
|
|
return c, nil
|
|
}
|
|
|
|
type Client struct {
|
|
*sftp.Client
|
|
}
|
|
|
|
func (client *Client) Files(remotePath string) ([]os.FileInfo, error) {
|
|
return client.ReadDir(remotePath)
|
|
}
|
|
|
|
func (client *Client) Remove(remotePath string) error {
|
|
f, err := client.Stat(remotePath)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
if f.IsDir() {
|
|
return client.removeDirectory(remotePath)
|
|
} else {
|
|
return client.removeFile(remotePath)
|
|
}
|
|
}
|
|
|
|
func (client *Client) removeDirectory(remotePath string) error {
|
|
//打不开,说明要么文件路径错误了,要么是第一次部署
|
|
remoteFiles, err := client.ReadDir(remotePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, backupDir := range remoteFiles {
|
|
remoteFilePath := path.Join(remotePath, backupDir.Name())
|
|
if backupDir.IsDir() {
|
|
err := client.removeDirectory(remoteFilePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
err := client.Remove(path.Join(remoteFilePath))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return client.RemoveDirectory(remotePath)
|
|
}
|
|
|
|
func (client *Client) removeFile(remotePath string) error {
|
|
return client.Remove(utils.Join(remotePath))
|
|
}
|
|
|
|
func (driver SFTP) formatFile(f os.FileInfo) model.File {
|
|
t := f.ModTime()
|
|
file := model.File{
|
|
//Id: f.Id,
|
|
Name: f.Name(),
|
|
Size: f.Size(),
|
|
Driver: driver.Config().Name,
|
|
UpdatedAt: &t,
|
|
}
|
|
if f.IsDir() {
|
|
file.Type = conf.FOLDER
|
|
} else {
|
|
file.Type = utils.GetFileType(path.Ext(f.Name()))
|
|
}
|
|
return file
|
|
}
|
|
|
|
func init() {
|
|
base.RegisterDriver(&SFTP{})
|
|
}
|