2022-01-02 18:44:45 +08:00
|
|
|
|
// Copyright (c) 2020 tickstep.
|
|
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
package command
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/tickstep/aliyunpan/cmder"
|
|
|
|
|
"github.com/tickstep/aliyunpan/internal/config"
|
|
|
|
|
"github.com/tickstep/aliyunpan/internal/webdav"
|
2022-09-24 15:09:31 +08:00
|
|
|
|
"github.com/tickstep/library-go/logger"
|
2022-01-02 18:44:45 +08:00
|
|
|
|
"github.com/urfave/cli"
|
2022-02-08 19:34:22 +08:00
|
|
|
|
"strings"
|
2022-12-21 16:27:39 +08:00
|
|
|
|
"sync/atomic"
|
2022-09-24 15:09:31 +08:00
|
|
|
|
"time"
|
2022-01-02 18:44:45 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func CmdWebdav() cli.Command {
|
|
|
|
|
return cli.Command{
|
|
|
|
|
Name: "webdav",
|
|
|
|
|
Usage: "在线网盘服务",
|
|
|
|
|
Description: "webdav在线网盘服务",
|
|
|
|
|
Category: "阿里云盘",
|
2022-12-10 14:07:28 +08:00
|
|
|
|
Before: ReloadConfigFunc,
|
|
|
|
|
After: SaveConfigFunc,
|
2022-01-02 18:44:45 +08:00
|
|
|
|
Action: func(c *cli.Context) error {
|
|
|
|
|
fmt.Print(`
|
2022-01-03 07:55:03 +08:00
|
|
|
|
本文命令可以让阿里云盘变身为webdav协议的文件服务器。这样你可以把阿里云盘挂载为Windows、Linux、Mac系统的磁盘,可以通过NAS系统做文件管理或文件同步等等。
|
|
|
|
|
当把阿里云盘作为webdav文件服务器进行使用的时候,上传文件是不支持秒传的,所以当你挂载为网络磁盘使用的时候,不建议在webdav挂载目录中上传、下载过大的文件,不然体验会非常差。
|
|
|
|
|
建议作为文档,图片等小文件的同步网盘。
|
2022-01-02 18:44:45 +08:00
|
|
|
|
|
|
|
|
|
请输入以下命令查看如何启动
|
|
|
|
|
aliyunpan webdav start -h
|
|
|
|
|
|
|
|
|
|
`)
|
|
|
|
|
cli.ShowCommandHelp(c, c.Command.Name)
|
|
|
|
|
return nil
|
|
|
|
|
},
|
|
|
|
|
Subcommands: []cli.Command{
|
|
|
|
|
{
|
|
|
|
|
Name: "start",
|
|
|
|
|
Usage: "启动webdav在线网盘服务",
|
|
|
|
|
UsageText: cmder.App().Name + " webdav start [arguments...]",
|
|
|
|
|
Description: `
|
|
|
|
|
启动webdav服务,让阿里云盘变身为webdav协议的文件服务器。这样你可以把阿里云盘挂载为Windows、Linux、Mac系统的磁盘,可以通过NAS系统做文件管理或文件同步等等。
|
|
|
|
|
当把阿里云盘作为webdav文件服务器进行使用的时候,上传文件是不支持秒传的,所以当你挂载为网络磁盘使用的时候,不建议在webdav挂载目录中上传、下载过大的文件,不然体验会非常差。
|
|
|
|
|
建议作为文档,图片等小文件的同步网盘。
|
|
|
|
|
|
|
|
|
|
例子:
|
|
|
|
|
1. 查看帮助
|
|
|
|
|
aliyunpan webdav start -h
|
|
|
|
|
|
|
|
|
|
2. 使用默认配置启动webdav服务
|
|
|
|
|
aliyunpan webdav start
|
|
|
|
|
|
2022-09-23 16:49:26 +08:00
|
|
|
|
3. 启动webdav服务,并配置IP为127.0.0.1,端口为23077,登录用户名为admin,登录密码为admin123,模式为读写,文件网盘目录 /webdav_folder 作为服务的根目录
|
|
|
|
|
aliyunpan webdav start -ip "127.0.0.1" -port 23077 -webdav_user "admin" -webdav_password "admin123" -webdav_mode "rw" -pan_drive "File" -pan_dir_path "/webdav_folder"
|
2022-01-02 18:44:45 +08:00
|
|
|
|
|
|
|
|
|
`,
|
|
|
|
|
Action: func(c *cli.Context) error {
|
|
|
|
|
if config.Config.ActiveUser() == nil {
|
|
|
|
|
fmt.Println("未登录账号,请先登录")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2022-09-24 15:09:31 +08:00
|
|
|
|
activeUser := GetActiveUser()
|
2022-12-21 16:27:39 +08:00
|
|
|
|
|
|
|
|
|
// pan token expired checker
|
|
|
|
|
continueFlag := int32(0)
|
|
|
|
|
atomic.StoreInt32(&continueFlag, 0)
|
|
|
|
|
defer func() {
|
|
|
|
|
atomic.StoreInt32(&continueFlag, 1)
|
|
|
|
|
}()
|
|
|
|
|
go func(flag *int32) {
|
|
|
|
|
for atomic.LoadInt32(flag) == 0 {
|
2022-09-24 15:25:03 +08:00
|
|
|
|
// token刷新
|
2022-09-24 15:09:31 +08:00
|
|
|
|
time.Sleep(time.Duration(1) * time.Minute)
|
|
|
|
|
//time.Sleep(time.Duration(5) * time.Second)
|
2022-12-07 17:24:02 +08:00
|
|
|
|
if RefreshTokenInNeed(activeUser) {
|
2022-09-24 15:09:31 +08:00
|
|
|
|
logger.Verboseln("reload new access token for webdav")
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-12-21 16:27:39 +08:00
|
|
|
|
}(&continueFlag)
|
2022-09-24 15:09:31 +08:00
|
|
|
|
|
2022-01-02 18:44:45 +08:00
|
|
|
|
webdavServ := &webdav.WebdavConfig{
|
2022-09-23 16:49:26 +08:00
|
|
|
|
PanDriveId: "",
|
|
|
|
|
PanUserId: "",
|
|
|
|
|
PanUser: nil,
|
2022-01-02 18:44:45 +08:00
|
|
|
|
UploadChunkSize: c.Int("bs") * 1024,
|
|
|
|
|
TransferUrlType: config.Config.TransferUrlType,
|
2022-09-23 16:49:26 +08:00
|
|
|
|
Address: "0.0.0.0",
|
|
|
|
|
Port: 23077,
|
|
|
|
|
Prefix: "/",
|
|
|
|
|
Users: []webdav.WebdavUser{{
|
2022-01-02 18:44:45 +08:00
|
|
|
|
Username: "admin",
|
|
|
|
|
Password: "admin",
|
|
|
|
|
Scope: "/",
|
2022-09-23 16:49:26 +08:00
|
|
|
|
Mode: "rw",
|
2022-01-02 18:44:45 +08:00
|
|
|
|
}},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// pan user
|
2022-09-24 15:09:31 +08:00
|
|
|
|
panUserId := activeUser.UserId
|
2022-01-02 18:44:45 +08:00
|
|
|
|
webdavServ.PanUserId = panUserId
|
|
|
|
|
webdavServ.PanUser = activeUser
|
|
|
|
|
|
|
|
|
|
// address
|
|
|
|
|
ip := "0.0.0.0"
|
|
|
|
|
if c.IsSet("ip") {
|
|
|
|
|
ip = c.String("ip")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Address = ip
|
|
|
|
|
|
|
|
|
|
// port
|
|
|
|
|
port := 23077
|
|
|
|
|
if c.IsSet("port") {
|
|
|
|
|
port = c.Int("port")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Port = port
|
|
|
|
|
|
2022-02-08 19:34:22 +08:00
|
|
|
|
// binding pan drive
|
|
|
|
|
panDriveName := "File"
|
|
|
|
|
panDriveNameStr := "文件"
|
|
|
|
|
if c.IsSet("pan_drive") {
|
|
|
|
|
panDriveName = c.String("pan_drive")
|
|
|
|
|
}
|
|
|
|
|
if strings.ToLower(panDriveName) == "album" {
|
|
|
|
|
webdavServ.PanDriveId = activeUser.DriveList.GetAlbumDriveId()
|
|
|
|
|
panDriveNameStr = "相册"
|
|
|
|
|
} else {
|
|
|
|
|
webdavServ.PanDriveId = activeUser.DriveList.GetFileDriveId()
|
|
|
|
|
panDriveNameStr = "文件"
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 18:44:45 +08:00
|
|
|
|
// binding pan dir path
|
|
|
|
|
panDirPath := "/"
|
|
|
|
|
if c.IsSet("pan_dir_path") {
|
|
|
|
|
panDirPath = c.String("pan_dir_path")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Users[0].Scope = panDirPath
|
|
|
|
|
|
|
|
|
|
webdavUserName := "admin"
|
|
|
|
|
if c.IsSet("webdav_user") {
|
|
|
|
|
webdavUserName = c.String("webdav_user")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Users[0].Username = webdavUserName
|
|
|
|
|
|
|
|
|
|
webdavPassword := "admin"
|
|
|
|
|
if c.IsSet("webdav_password") {
|
|
|
|
|
webdavPassword = c.String("webdav_password")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Users[0].Password = webdavPassword
|
|
|
|
|
|
2022-09-23 16:49:26 +08:00
|
|
|
|
webdavMode := "rw"
|
|
|
|
|
if c.IsSet("webdav_mode") {
|
|
|
|
|
webdavMode = c.String("webdav_mode")
|
|
|
|
|
}
|
|
|
|
|
webdavServ.Users[0].Mode = webdavMode
|
|
|
|
|
if webdavServ.Users[0].Mode != "rw" && webdavServ.Users[0].Mode != "ro" {
|
|
|
|
|
webdavServ.Users[0].Mode = "rw"
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 18:44:45 +08:00
|
|
|
|
err := config.Config.Save()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-23 16:49:26 +08:00
|
|
|
|
modeStr := "读写"
|
|
|
|
|
if webdavServ.Users[0].Mode == "rw" {
|
|
|
|
|
modeStr = "读写"
|
|
|
|
|
} else if webdavServ.Users[0].Mode == "ro" {
|
|
|
|
|
modeStr = "只读"
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 18:44:45 +08:00
|
|
|
|
fmt.Println("----------------------------------------")
|
2022-09-23 16:49:26 +08:00
|
|
|
|
fmt.Printf("webdav网盘信息:\n链接:http://localhost:%d\n用户名:%s\n密码:%s\n网盘模式:%s\n网盘服务类型:%s\n网盘服务目录:%s\n",
|
|
|
|
|
webdavServ.Port, webdavServ.Users[0].Username, webdavServ.Users[0].Password, modeStr, panDriveNameStr, webdavServ.Users[0].Scope)
|
2022-01-02 18:44:45 +08:00
|
|
|
|
fmt.Println("----------------------------------------")
|
|
|
|
|
fmt.Println("webdav在线网盘服务运行中...")
|
|
|
|
|
webdavServ.StartServer()
|
|
|
|
|
return nil
|
|
|
|
|
},
|
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "ip",
|
|
|
|
|
Usage: "绑定的本地IP,多网卡的环境下建议指定绑定的IP。默认为0.0.0.0代表绑定全部网卡",
|
|
|
|
|
},
|
|
|
|
|
cli.IntFlag{
|
|
|
|
|
Name: "port",
|
|
|
|
|
Usage: "绑定的本地端口,默认为:23077",
|
|
|
|
|
Value: 23077,
|
|
|
|
|
},
|
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "webdav_user",
|
|
|
|
|
Usage: "Webdav登录用户名,默认为:admin",
|
|
|
|
|
},
|
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "webdav_password",
|
|
|
|
|
Usage: "Webdav登录密码,默认为:admin",
|
|
|
|
|
},
|
2022-09-23 16:49:26 +08:00
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "webdav_mode",
|
|
|
|
|
Usage: "Webdav模式,包括:rw-读写,ro-只读,默认为:rw",
|
|
|
|
|
Value: "rw",
|
|
|
|
|
},
|
2022-02-08 19:34:22 +08:00
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "pan_drive",
|
|
|
|
|
Usage: "Webdav绑定的网盘类型。File-文件 Album-相册。默认为文件网盘",
|
|
|
|
|
Value: "File",
|
|
|
|
|
},
|
2022-01-02 18:44:45 +08:00
|
|
|
|
cli.StringFlag{
|
|
|
|
|
Name: "pan_dir_path",
|
|
|
|
|
Usage: "Webdav绑定的网盘文件夹路径,默认为:/",
|
|
|
|
|
},
|
|
|
|
|
cli.IntFlag{
|
|
|
|
|
Name: "bs",
|
2022-01-08 22:08:04 +08:00
|
|
|
|
Usage: "block size,上传分片大小,单位KB。推荐值:1024 ~ 10240",
|
|
|
|
|
Value: 10240,
|
2022-01-02 18:44:45 +08:00
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|