Skip to content

Commit

Permalink
support load balance
Browse files Browse the repository at this point in the history
  • Loading branch information
reruin committed Dec 3, 2019
1 parent cca7528 commit 303ed9c
Show file tree
Hide file tree
Showing 11 changed files with 270 additions and 156 deletions.
46 changes: 30 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneD
* [忽略文件类型](#忽略文件类型)
* [文件预览](#文件预览)
* [显示README](#显示README)
* [负载均衡](#负载均衡)
* [Nginx/Caddy反代注意事项](#Nginx/Caddy反代注意事项)
* [插件开发](#插件开发)


## 功能说明
## 功能说明
- 多种网盘系统快速挂载。
- 支持虚拟目录和虚拟文件。
- 支持目录加密。
Expand All @@ -34,15 +35,15 @@ ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneD


## 使用示例
### 挂载GoogleDrive
### 挂载GoogleDrive
#### 1. 使用分享ID挂载
[plugins/drive.gd.js](drive.gd)插件实现。
```
挂载标示:gd
挂载内容:分享的文件ID
```

#### 2. 使用官方API挂载
#### 2. 使用官方API挂载
[plugins/drive.gd.api.js](drive.gd.api)插件实现。
```
挂载标示:gda
Expand All @@ -53,7 +54,7 @@ ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneD
```
ShareList会根据填写的挂载内容的不同形式,自动开启挂载向导,按指示操作即可。

### 挂载OneDrive
### 挂载OneDrive
#### 1. 使用分享ID挂载
[plugins/drive.od.js](plugins/drive.od.js)插件实现。
```
Expand Down Expand Up @@ -98,7 +99,7 @@ ShareList会根据填写的挂载内容,自动开启挂载向导,按指示
```
**注意:仅用于浏览,不支持 ```git clone``` 等git操作。**

### 挂载蓝奏云
### 挂载蓝奏云
[plugins/drive.lanzou.js](drive.lanzou)插件实现。提供对[蓝奏云](https://www.lanzou.com/)的访问支持。
```
挂载标示:lanzou
Expand Down Expand Up @@ -143,13 +144,13 @@ gd:0BwfTxffUGy_GNF9KQ25Xd0xxxxxxx
系统内置了一种单文件虚拟目录系统,使用yaml构建,以```sld```作为后缀保存。参考[example/ShareListDrive.sld](example/sharelist_drive.sld)


### 虚拟文件
### 虚拟文件
与虚拟目录类似,目标指向具体文件。
在需创建虚拟文件处新建```文件名.后缀名.ln```文件。 其内容为```挂载标识:挂载路径```
如:创建一个```ubuntu_18.iso```的虚拟文件,请参考[example/linkTo_download_ubuntu_18.iso.ln](example)


### 目录加密
### 目录加密
在需加密目录内新建 ```.passwd``` 文件,```type```为验证方式,```data```为验证内容。
目前只支持用户名密码对加密(由[auth.basic](app/plugins/auth.basic.js)插件实现)。
例如:
Expand All @@ -162,27 +163,40 @@ data:
```user1```用户可使用密码```111111```验证,```user2```用户可使用密码```aaaaaa```验证。请参考[example/secret_folder/.passwd](example)。

### 流量中转
### 流量中转
后台管理,常规设置,将```中转(包括预览)```设为启用即可实现中转代理。

### 忽略文件类型
### 负载均衡
由[drive.lb.js](app/plugins/drive.lb.js)插件实现。用于将请求转发到多个对等的网盘。
```
挂载标示:lb
挂载路径:
用;分割多个路径地址
```
例如,已经在```http://localhost/a```和```http://localhost/b```路径上挂载了内容相同的两个网盘,需要将两者的请求其合并到```http://localhost/c```路径下,在后台虚拟路径处,选择LoadBalancer类型,挂载路径填写为```/a;/b```即可。
**注意:负载目录建立后,其目标目录将被自动隐藏(管理员模式可见)。**
### 忽略文件类型
后台管理,常规设置,```忽略文件类型```可定义忽略的文件类型。例如忽略图片:```jpg,png,gif,webp,bmp,jpeg```。
### 显示README
### 显示README
后台管理,常规设置,将```显示README.md内容```设为启用,当前目录包含```README.md```时,将自动显示在页面。
### 文件预览
### 文件预览
后台管理,常规设置,将```详情预览```设为启用即可对特定文件进行预览。目前支持:
#### 文档类
#### 文档类
由[preview.document](plugins/drive.document.js)插件实现,可预览md、word、ppt、excel。
#### 多媒体
#### 多媒体
由[preview.media](plugins/drive.media.js)插件实现,可预览图片、音频、视频提供。
后台管理,插件设置,```支持预览的视频后缀```可定义可预览视频类型。
#### Torrent
#### Torrent
由[preview.torrent](plugins/drive.torrent.js)插件实现,为种子文件提供在线预览。
### Nginx/Caddy反代注意事项
### Nginx/Caddy反代注意事项
使用反代时,请添加以下配置。
Nginx
```ini
Expand All @@ -199,7 +213,7 @@ Caddy
header_upstream X-Forwarded-Proto {scheme}
```

## 插件开发
## 插件开发
待完善


Expand Down
15 changes: 14 additions & 1 deletion app/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ const db = createFiledb(configPath , {raw:true} , {

readme_enable:1,

ignore_paths:{},

plugin_option:[]
});

Expand All @@ -42,6 +44,17 @@ const installed = () => {

const getConfig = (key) => db.get(key)

const setIgnorePaths = (key , paths) => {
let p = db.get('ignore_paths')
p[key] = paths
db.save()
}

const getIgnorePaths = (key , paths) => {
return [].concat(...Object.values(db.get('ignore_paths') || {}))
}


const getAllConfig = (key) => db.all

const getPath = () => [].concat( db.get('path') || [] )
Expand Down Expand Up @@ -112,4 +125,4 @@ const getDrives = (protocols) => {
return ret
}

module.exports = { getConfig , getAllConfig, save , installed , getPath , setRuntime , getRuntime , saveDrive , getDrive , getSkin , getDrives , getPluginOption , setPluginOption }
module.exports = { getConfig, setIgnorePaths, getIgnorePaths, getAllConfig, save , installed , getPath , setRuntime , getRuntime , saveDrive , getDrive , getSkin , getDrives , getPluginOption , setPluginOption }
118 changes: 53 additions & 65 deletions app/controllers/sharelist.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,16 @@ const output = async (ctx , data)=>{

module.exports = {
async index(ctx){
let data = await service.path(ctx.paths , ctx.query , ctx.paths , ctx.method)
let data = await service.path(ctx.runtime)

let base_url = ctx.path == '/' ? '' : ctx.path
let parent = ctx.paths.length ? ('/' + ctx.paths.slice(0,-1).join('/')) : ''
let ignoreexts = (config.getConfig('ignore_file_extensions') || '').split(',')
let ignorefiles = (config.getConfig('ignore_files') || '').split(',')
let ignorepaths = config.getIgnorePaths()

let isAdmin = ctx.session.admin

//data is readonly
if( data === false){
ctx.status = 404
Expand All @@ -69,53 +74,60 @@ module.exports = {
return
}
else if(data.type == 'folder'){

let ra = requireAuth(data)
if( ra !== false && !ctx.session.access.has( data.id )){
//验证界面
await ctx.renderSkin('auth',{
parent ,
id:data.protocol+':'+data.id ,
name:decodeURIComponent(ctx.paths[ctx.paths.length-1] || '')
})

}else{
let ret = { base_url , parent , data:[] }

let preview_enable = config.getConfig('preview_enable')

for(let i of data.children){
if(i.type == 'folder' || (i.type != 'folder' && !ignoreexts.includes(i.ext) && !ignorefiles.includes(i.name))){
let href = ''
if( i.url && isRelativePath(i.url) ){
href = pathNormalize(base_url + '/' + i.url)
}else{
href = pathNormalize(base_url + '/' + encodeURIComponent(i.name))
}

if(await service.isPreviewable(i) && preview_enable){
href += (href.indexOf('?')>=0 ? '&' : '?') + 'preview'
}
if(i.hidden !== true)
ret.data.push( { href , type : i.type , size: i.displaySize , updated_at:i.updated_at , name:i.name})
let ret = { base_url , parent , data:[] }

let preview_enable = config.getConfig('preview_enable')

for(let i of data.children){
if(
isAdmin ||
(i.type == 'folder' && !ignorepaths.includes(base_url + '/' + i.name)) ||
(i.type != 'folder' && !ignoreexts.includes(i.ext) && !ignorefiles.includes(i.name))){
let href = ''
if( i.url && isRelativePath(i.url) ){
href = pathNormalize(base_url + '/' + i.url)
}else{
href = pathNormalize(base_url + '/' + encodeURIComponent(i.name))
}
}

let readme_enable = !!config.getConfig('readme_enable')
if( readme_enable ){
let readmeFile = data.children.find(i => i.name.toLocaleUpperCase() == 'README.MD')
if(readmeFile){
ret.readme = markdownParse(await service.source(readmeFile.id , readmeFile.protocol))
if(await service.isPreviewable(i) && preview_enable){
href += (href.indexOf('?')>=0 ? '&' : '?') + 'preview'
}
if(i.hidden !== true)
ret.data.push( { href , type : i.type , size: i.displaySize , updated_at:i.updated_at , name:i.name})
}

if( !ctx.webdav ){
await ctx.renderSkin('index',ret)
}
}

let readme_enable = !!config.getConfig('readme_enable')
if( readme_enable ){
let readmeFile = data.children.find(i => i.name.toLocaleUpperCase() == 'README.MD')
if(readmeFile){
ret.readme = markdownParse(await service.source(readmeFile.id , readmeFile.protocol))
}
}

}else{
if( !ctx.webdav ){
await ctx.renderSkin('index',ret)
}

}
else if(data.type == 'auth'){
await ctx.renderSkin('auth',{
parent ,
id:data.protocol+':'+data.id ,
name:decodeURIComponent(ctx.paths[ctx.paths.length-1] || ''),
// target:data.target
})
}
else if(data.type == 'auth_response'){
let result = {status:0 , message:"success"}
if(!data.result){
result.status = 403
result.message = '验证失败'
}
ctx.body = result
}
else{
if( ignoreexts.includes(data.ext) || ignorefiles.includes(data.name) ){
ctx.status = 404
}else{
Expand Down Expand Up @@ -161,29 +173,5 @@ module.exports = {
return { ...data }
}

},

async auth(ctx){
let { path , user , passwd } = ctx.request.body
let [paths , paths_raw] = parsePath(path.substring(1))

let data = await service.path(paths , ctx.query , paths_raw)
let result = { status : 0 , message:''}
let ra = requireAuth(data)

//需要验证
if( ra ){
let access = await service.auth(data , user , passwd)
if( access ){
ctx.session.access.add( data.id )
}else{
result.status = 403
result.message = '验证失败'
}
}else{
result.message = '此目录不需要验证'
}

ctx.body = result
}
}
13 changes: 10 additions & 3 deletions app/middleware/koa-paths.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,22 @@ module.exports = async(ctx, next) => {
ctx.paths = paths
ctx.paths_raw = paths_raw

setRuntime('req' , {
let runtime = {
href:ctx.href,
path:ctx.path,
query:ctx.query,
body:ctx.request.body,
method:ctx.method,
host:ctx.host,
origin:ctx.origin,
protocol:ctx.protocol
})
protocol:ctx.protocol,
paths:paths,
isAdmin:!!ctx.session.admin,
access:ctx.session.access
}

ctx.runtime = runtime
setRuntime('req' , runtime)
/*
setLocation({
href:ctx.href,
Expand Down
Loading

0 comments on commit 303ed9c

Please sign in to comment.