83 lines
2.3 KiB
Dart
83 lines
2.3 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:args/args.dart';
|
|
import 'package:file/local.dart';
|
|
import 'package:shelf/shelf.dart';
|
|
import 'package:shelf/shelf_io.dart';
|
|
import 'package:shelf_dav/shelf_dav.dart';
|
|
|
|
void main(List<String> args) async {
|
|
var parser = ArgParser();
|
|
parser.addOption('port', abbr: 'p', defaultsTo: '8800', help: '服务运行端口号');
|
|
parser.addOption('dir', abbr: 'd', defaultsTo: './repo/', help: '文件存储路径');
|
|
parser.addOption('user', abbr: 'u', help: 'DAV服务用户名', mandatory: true);
|
|
parser.addOption('auth', abbr: 'a', help: 'DAV服务密码', mandatory: true);
|
|
|
|
var argResults = parser.parse(args);
|
|
|
|
if (args.isEmpty) {
|
|
stdout.writeln(parser.usage);
|
|
return;
|
|
}
|
|
|
|
final fs = const LocalFileSystem();
|
|
final rootDir = fs.directory(argResults.option('dir') ?? './repo/');
|
|
if (!rootDir.existsSync()) {
|
|
rootDir.createSync(recursive: true);
|
|
}
|
|
var user = argResults.option('user')!;
|
|
final config = DAVConfig(
|
|
root: rootDir,
|
|
prefix: '/dav',
|
|
allowAnonymous: false,
|
|
// 1G
|
|
maxUploadSize: 1024 * 1024 * 1024,
|
|
readOnly: false,
|
|
propertyStorageType: PropertyStorageType.file,
|
|
authenticationProvider: BasicAuthenticationProvider.plaintext(
|
|
users: {user: argResults.option('auth')!},
|
|
),
|
|
);
|
|
|
|
final dav = ShelfDAV.withConfig(config);
|
|
|
|
final ip = InternetAddress.anyIPv4;
|
|
|
|
final port = int.parse(argResults.option('port') ?? '8800');
|
|
final server = await serve(
|
|
(request) {
|
|
if (request.method == 'GET' && request.url.path == 'info/$user') {
|
|
return getInfo(rootDir);
|
|
}
|
|
|
|
return dav.handler.call(request);
|
|
},
|
|
ip,
|
|
port,
|
|
);
|
|
print('WebDAV server listening on port ${server.port}');
|
|
}
|
|
|
|
Response getInfo(Directory dir) {
|
|
var du = Process.runSync('du', [
|
|
'-h',
|
|
'--time',
|
|
dir.absolute.path,
|
|
]).stdout.toString();
|
|
var result = <String>[];
|
|
for (var line in du.split('\n')) {
|
|
var parts = line.split(dir.absolute.path);
|
|
if (parts.length == 2) {
|
|
if (parts.last.trim().isEmpty) {
|
|
result.insert(0, '${parts.first}总占用\n');
|
|
} else {
|
|
result.add('${parts.first}${Uri.decodeComponent(parts.last)}');
|
|
}
|
|
}
|
|
}
|
|
return Response.ok(
|
|
result.join('\n'),
|
|
headers: {'content-type': 'text/plain'},
|
|
);
|
|
}
|