Files
cloud_archiver/server/bin/server.dart
T

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'},
);
}