added set value
All checks were successful
BlockStorage/repertory/pipeline/head This commit looks good

This commit is contained in:
Scott E. Graves 2025-03-02 17:43:11 -06:00
parent 5a19ada15d
commit cc4991e211
6 changed files with 105 additions and 52 deletions

View File

@ -66,6 +66,8 @@ private:
void handle_post_mount(auto &&req, auto &&res) const; void handle_post_mount(auto &&req, auto &&res) const;
void handle_put_set_value_by_name(auto &&req, auto &&res);
static auto read_process(provider_type prov, std::string_view name, static auto read_process(provider_type prov, std::string_view name,
std::string_view command) std::string_view command)
-> std::vector<std::string>; -> std::vector<std::string>;

View File

@ -86,6 +86,10 @@ handlers::handlers(mgmt_app_config *config, httplib::Server *server)
server->Post("/api/v1/mount", server->Post("/api/v1/mount",
[this](auto &&req, auto &&res) { handle_post_mount(req, res); }); [this](auto &&req, auto &&res) { handle_post_mount(req, res); });
server->Put("/api/v1/set_value_by_name", [this](auto &&req, auto &&res) {
handle_put_set_value_by_name(req, res);
});
event_system::instance().start(); event_system::instance().start();
static std::atomic<httplib::Server *> this_server{server_}; static std::atomic<httplib::Server *> this_server{server_};
@ -215,6 +219,18 @@ void handlers::handle_post_mount(auto &&req, auto &&res) const {
res.status = http_error_codes::ok; res.status = http_error_codes::ok;
} }
void handlers::handle_put_set_value_by_name(auto &&req, auto &&res) {
auto type = req.get_param_value("type");
auto name = req.get_param_value("name");
auto prov = provider_type_from_string(type);
auto key = req.get_param_value("key");
auto value = req.get_param_value("value");
read_process(prov, name, fmt::format("-set {} \'{}\'", key, value));
res.status = http_error_codes::ok;
}
auto handlers::read_process(provider_type prov, std::string_view name, auto handlers::read_process(provider_type prov, std::string_view name,
std::string_view command) std::string_view command)
-> std::vector<std::string> { -> std::vector<std::string> {

View File

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:repertory/constants.dart' as constants; import 'package:repertory/constants.dart' as constants;
import 'package:repertory/helpers.dart'; import 'package:repertory/helpers.dart';
import 'package:repertory/models/mount.dart';
import 'package:repertory/models/mount_list.dart'; import 'package:repertory/models/mount_list.dart';
import 'package:repertory/types/mount_config.dart';
import 'package:repertory/widgets/mount_list_widget.dart'; import 'package:repertory/widgets/mount_list_widget.dart';
import 'package:repertory/widgets/mount_settings.dart'; import 'package:repertory/widgets/mount_settings.dart';
@ -40,17 +40,17 @@ class MyApp extends StatelessWidget {
return null; return null;
} }
final mountConfig = settings.arguments as MountConfig; final mount = settings.arguments as Mount;
return MaterialPageRoute( return MaterialPageRoute(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary, backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text( title: Text(
'${initialCaps(mountConfig.type)} [${formatMountName(mountConfig.type, mountConfig.name)}] Settings', '${initialCaps(mount.type)} [${formatMountName(mount.type, mount.name)}] Settings',
), ),
), ),
body: MountSettingsWidget(config: mountConfig), body: MountSettingsWidget(mount: mount),
); );
}, },
); );

View File

@ -64,4 +64,16 @@ class Mount with ChangeNotifier {
await _fetch(); await _fetch();
return _fetchStatus(); return _fetchStatus();
} }
Future<void> setValue(String key, String value) async {
await http.put(
Uri.parse(
Uri.encodeFull(
'${Uri.base.origin}/api/v1/set_value_by_name?name=$name&type=$type&key=$key&value=$value',
),
),
);
return refresh();
}
} }

View File

@ -1,18 +1,21 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:repertory/types/mount_config.dart'; import 'package:repertory/models/mount.dart';
import 'package:settings_ui/settings_ui.dart'; import 'package:settings_ui/settings_ui.dart';
class MountSettingsWidget extends StatefulWidget { class MountSettingsWidget extends StatefulWidget {
final MountConfig config; final Mount mount;
const MountSettingsWidget({super.key, required this.config}); const MountSettingsWidget({super.key, required this.mount});
@override @override
State<MountSettingsWidget> createState() => _MountSettingsWidgetState(); State<MountSettingsWidget> createState() => _MountSettingsWidgetState();
} }
class _MountSettingsWidgetState extends State<MountSettingsWidget> { class _MountSettingsWidgetState extends State<MountSettingsWidget> {
Map<String, dynamic>? _settings; Map<String, dynamic> _settings = {};
void _addBooleanSetting(list, root, key, value) { void _addBooleanSetting(list, root, key, value) {
list.add( list.add(
@ -22,12 +25,12 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
initialValue: (value as bool), initialValue: (value as bool),
onPressed: (_) { onPressed: (_) {
setState(() { setState(() {
root?[key] = !value; root[key] = !value;
}); });
}, },
onToggle: (bool nextValue) { onToggle: (bool nextValue) {
setState(() { setState(() {
root?[key] = nextValue; root[key] = nextValue;
}); });
}, },
), ),
@ -57,7 +60,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
child: Text('OK'), child: Text('OK'),
onPressed: () { onPressed: () {
setState(() { setState(() {
root?[key] = int.parse(updatedValue); root[key] = int.parse(updatedValue);
}); });
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
@ -98,7 +101,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
value: value.toString(), value: value.toString(),
onChanged: (newValue) { onChanged: (newValue) {
setState(() { setState(() {
root?[key] = int.parse(newValue ?? defaultValue.toString()); root[key] = int.parse(newValue ?? defaultValue.toString());
}); });
}, },
items: items:
@ -119,7 +122,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
value: value, value: value,
onChanged: (newValue) { onChanged: (newValue) {
setState(() { setState(() {
root?[key] = newValue; root[key] = newValue;
}); });
}, },
items: items:
@ -164,7 +167,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
child: Text('OK'), child: Text('OK'),
onPressed: () { onPressed: () {
setState(() { setState(() {
root?[key] = updatedValue; root[key] = updatedValue;
}); });
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
@ -196,7 +199,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
List<SettingsTile> s3ConfigSettings = []; List<SettingsTile> s3ConfigSettings = [];
List<SettingsTile> siaConfigSettings = []; List<SettingsTile> siaConfigSettings = [];
_settings?.forEach((key, value) { _settings.forEach((key, value) {
if (key == "ApiAuth") { if (key == "ApiAuth") {
_addPasswordSetting(commonSettings, _settings, key, value); _addPasswordSetting(commonSettings, _settings, key, value);
} else if (key == "ApiPort") { } else if (key == "ApiPort") {
@ -256,14 +259,14 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == "EncryptionToken") { if (subKey == "EncryptionToken") {
_addPasswordSetting( _addPasswordSetting(
encryptConfigSettings, encryptConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "Path") { } else if (subKey == "Path") {
_addStringSetting( _addStringSetting(
encryptConfigSettings, encryptConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.folder, Icons.folder,
@ -275,7 +278,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == "AgentString") { if (subKey == "AgentString") {
_addStringSetting( _addStringSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.support_agent, Icons.support_agent,
@ -283,21 +286,21 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "ApiPassword") { } else if (subKey == "ApiPassword") {
_addPasswordSetting( _addPasswordSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "ApiPort") { } else if (subKey == "ApiPort") {
_addIntSetting( _addIntSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "ApiUser") { } else if (subKey == "ApiUser") {
_addStringSetting( _addStringSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.person, Icons.person,
@ -305,7 +308,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "HostNameOrIp") { } else if (subKey == "HostNameOrIp") {
_addStringSetting( _addStringSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.computer, Icons.computer,
@ -313,7 +316,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "Path") { } else if (subKey == "Path") {
_addStringSetting( _addStringSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.route, Icons.route,
@ -321,7 +324,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "Protocol") { } else if (subKey == "Protocol") {
_addListSetting( _addListSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
["http", "https"], ["http", "https"],
@ -330,7 +333,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "TimeoutMs") { } else if (subKey == "TimeoutMs") {
_addIntSetting( _addIntSetting(
hostConfigSettings, hostConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
@ -341,21 +344,21 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == "ApiPort") { if (subKey == "ApiPort") {
_addIntSetting( _addIntSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "EncryptionToken") { } else if (subKey == "EncryptionToken") {
_addPasswordSetting( _addPasswordSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "HostNameOrIp") { } else if (subKey == "HostNameOrIp") {
_addStringSetting( _addStringSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.computer, Icons.computer,
@ -363,21 +366,21 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "MaxConnections") { } else if (subKey == "MaxConnections") {
_addIntSetting( _addIntSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "ReceiveTimeoutMs") { } else if (subKey == "ReceiveTimeoutMs") {
_addIntSetting( _addIntSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "SendTimeoutMs") { } else if (subKey == "SendTimeoutMs") {
_addIntSetting( _addIntSetting(
remoteConfigSettings, remoteConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
@ -387,26 +390,26 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
value.forEach((subKey, subValue) { value.forEach((subKey, subValue) {
if (subKey == "Enable") { if (subKey == "Enable") {
List<SettingsTile> tempSettings = []; List<SettingsTile> tempSettings = [];
_addBooleanSetting(tempSettings, _settings?[key], subKey, subValue); _addBooleanSetting(tempSettings, _settings[key], subKey, subValue);
remoteMountSettings.insertAll(0, tempSettings); remoteMountSettings.insertAll(0, tempSettings);
} else if (subKey == "ApiPort") { } else if (subKey == "ApiPort") {
_addIntSetting( _addIntSetting(
remoteMountSettings, remoteMountSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "ClientPoolSize") { } else if (subKey == "ClientPoolSize") {
_addIntSetting( _addIntSetting(
remoteMountSettings, remoteMountSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "EncryptionToken") { } else if (subKey == "EncryptionToken") {
_addPasswordSetting( _addPasswordSetting(
remoteMountSettings, remoteMountSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
@ -417,14 +420,14 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == "AccessKey") { if (subKey == "AccessKey") {
_addPasswordSetting( _addPasswordSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "Bucket") { } else if (subKey == "Bucket") {
_addStringSetting( _addStringSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.folder, Icons.folder,
@ -432,14 +435,14 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "EncryptionToken") { } else if (subKey == "EncryptionToken") {
_addPasswordSetting( _addPasswordSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "Region") { } else if (subKey == "Region") {
_addStringSetting( _addStringSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.map, Icons.map,
@ -447,16 +450,16 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "SecretKey") { } else if (subKey == "SecretKey") {
_addPasswordSetting( _addPasswordSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "TimeoutMs") { } else if (subKey == "TimeoutMs") {
_addIntSetting(s3ConfigSettings, _settings?[key], subKey, subValue); _addIntSetting(s3ConfigSettings, _settings[key], subKey, subValue);
} else if (subKey == "URL") { } else if (subKey == "URL") {
_addStringSetting( _addStringSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.http, Icons.http,
@ -464,14 +467,14 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == "UsePathStyle") { } else if (subKey == "UsePathStyle") {
_addBooleanSetting( _addBooleanSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
} else if (subKey == "UseRegionInURL") { } else if (subKey == "UseRegionInURL") {
_addBooleanSetting( _addBooleanSetting(
s3ConfigSettings, s3ConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
); );
@ -482,7 +485,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == "Bucket") { if (subKey == "Bucket") {
_addStringSetting( _addStringSetting(
siaConfigSettings, siaConfigSettings,
_settings?[key], _settings[key],
subKey, subKey,
subValue, subValue,
Icons.folder, Icons.folder,
@ -524,7 +527,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
SettingsSection( SettingsSection(
title: const Text('Remote Mount'), title: const Text('Remote Mount'),
tiles: tiles:
_settings?["RemoteMount"]["Enable"] as bool _settings["RemoteMount"]["Enable"] as bool
? remoteMountSettings ? remoteMountSettings
: [remoteMountSettings[0]], : [remoteMountSettings[0]],
), ),
@ -533,9 +536,33 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
); );
} }
@override
void dispose() {
var settings = widget.mount.mountConfig.settings;
if (!DeepCollectionEquality().equals(_settings, settings)) {
_settings.forEach((key, value) {
if (!DeepCollectionEquality().equals(settings[key], value)) {
if (value is Map<String, dynamic>) {
value.forEach((subKey, subValue) {
if (!DeepCollectionEquality().equals(
settings[key][subKey],
subValue,
)) {
widget.mount.setValue('$key.$subKey', subValue.toString());
}
});
} else {
widget.mount.setValue(key, value.toString());
}
}
});
}
super.dispose();
}
@override @override
void initState() { void initState() {
_settings = Map.from(widget.config.settings); _settings = jsonDecode(jsonEncode(widget.mount.mountConfig.settings));
super.initState(); super.initState();
} }
} }

View File

@ -38,11 +38,7 @@ class _MountWidgetState extends State<MountWidget> {
leading: IconButton( leading: IconButton(
icon: Icon(Icons.settings, color: subTextColor), icon: Icon(Icons.settings, color: subTextColor),
onPressed: () { onPressed: () {
Navigator.pushNamed( Navigator.pushNamed(context, '/settings', arguments: mount);
context,
'/settings',
arguments: mount.mountConfig,
);
}, },
), ),
subtitle: subtitle: