summaryrefslogtreecommitdiffstats
path: root/lib/config.dart
diff options
context:
space:
mode:
authorOpenEmbedded <oe.patch@oe>2023-09-13 14:37:41 +0000
committerScott Murray <scott.murray@konsulko.com>2023-09-14 14:34:04 -0400
commite389b9fa646f90d50e853c2dbf870cdf9f9b80b7 (patch)
tree9d7b93e3e6e300a7e40dd03993ed8da129c98369 /lib/config.dart
parentadc3fca51b9ebfc23b503126065d97d692d0ec64 (diff)
Rework to use KUKSA.val databroker gRPC API
Rework to move from the WebSocket API with the older KUKSA.val server to the gRPC "VAL" API of the databroker. Changes include: - All VISS WebSocket API code has been removed, and the signal providers replumbed to be driven by a new VssClient class with a dashboard-specific child class to hold all the gRPC API handling. - The generated code for the VAL API and its dependencies has been checked in under lib/generated, as there still does not seem to be a good way to generate it during the Flutter build. - The configuration file is now expected to be "dashboard.yaml" instead of "dashboard.yaml". The authorization token field name has been renamed to "authorization", and there are new "use-tls" and "ca-certificate" configuration fields. TLS is disabled by default for now, and the default CA certificate is /etc/kuksa.val/CA.pem. - Bumped minimum SDK version to 2.18 in pubspec.yaml to enable "super" keyword support. This matches what the version was set to in flutter-homescreen. - Removed .dart_tool generated output that had been checked in, and added .gitignore file from flutter-homescreen so that things will hopefully stay clean in the future. Bug-AGL: SPEC-4762 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: Ie23091b759458b5a131bc2d85e62925238839166
Diffstat (limited to 'lib/config.dart')
-rw-r--r--lib/config.dart179
1 files changed, 88 insertions, 91 deletions
diff --git a/lib/config.dart b/lib/config.dart
index 817d46f..d87026c 100644
--- a/lib/config.dart
+++ b/lib/config.dart
@@ -1,111 +1,108 @@
// SPDX-License-Identifier: Apache-2.0
import 'dart:io';
-import 'package:flutter/material.dart';
+import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:yaml/yaml.dart';
-import 'vehicle-signals/intial_connection.dart';
+class KuksaConfig {
+ final String hostname;
+ final int port;
+ final String authorization;
+ final bool use_tls;
+ final List<int> ca_certificate;
+ final String tls_server_name;
-class GetConfig extends ConsumerStatefulWidget {
- const GetConfig({Key? key, required this.client}) : super(key: key);
- final HttpClient client;
+ static String configFilePath = '/etc/xdg/AGL/dashboard.yaml';
+ static String defaultHostname = 'localhost';
+ static int defaultPort = 55555;
+ static String defaultCaCertPath = '/etc/kuksa-val/CA.pem';
- @override
- ConsumerState<GetConfig> createState() => _GetConfigState();
+ KuksaConfig({required this.hostname, required this.port, required this.authorization,
+ required this.use_tls, required this.ca_certificate, required this.tls_server_name});
}
-class _GetConfigState extends ConsumerState<GetConfig> {
- @override
- void initState() {
- super.initState();
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
- final configStateProvider = ref.read(ConfigStateprovider.notifier);
-
- String configFilePath = '/etc/xdg/AGL/dashboard_config.yaml';
+// NOTE: This may need to be changed to a FutureProvider to avoid slowing
+// down the top-level widget initState...
+final kuksaConfigProvider = Provider((ref) {
+ final configFile = File(KuksaConfig.configFilePath);
+ try {
+ print("Reading configuration ${KuksaConfig.configFilePath}");
+ String content = configFile.readAsStringSync();
+ final dynamic yamlMap = loadYaml(content);
+ String hostname = KuksaConfig.defaultHostname;
+ if (yamlMap.containsKey('hostname')) {
+ hostname = yamlMap['hostname'];
+ }
- final configFile = File(configFilePath);
- configFile.readAsString().then((content) {
- final dynamic yamlMap = loadYaml(content);
- configStateProvider.update(
- hostname: yamlMap['hostname'],
- port: yamlMap['port'],
- kuksaAuthToken: yamlMap['kuskaAuthToken'],
- );
- });
- });
- }
-
- @override
- Widget build(BuildContext context) {
- final config = ref.watch(ConfigStateprovider);
- if (config.hostname == "" ||
- config.port == 0 ||
- config.kuksaAuthToken == ""
- ) {
- return Scaffold(
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: const [
- Text("ERROR",
- style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
- Text(
- "Something Wrong with config file! Check config.yaml file and restart"),
- ],
- )),
- );
+ int port = KuksaConfig.defaultPort;
+ if (yamlMap.containsKey('port')) {
+ port = yamlMap['port'];
}
- return InitialScreen(client: widget.client);
- }
-}
-class Config {
- Config({
- required this.hostname,
- required this.port,
- required this.kuksaAuthToken,
+ String token = "";
+ if (yamlMap.containsKey('authorization')) {
+ String s = yamlMap['authorization'];
+ if (s.isNotEmpty) {
+ if (s.startsWith("/")) {
+ debugPrint("Reading authorization token $s");
+ try {
+ token = File(s).readAsStringSync();
+ } on Exception catch(_) {
+ print("ERROR: Could not read authorization token file $token");
+ token = "";
+ }
+ } else {
+ token = s;
+ }
+ }
+ }
+ //debugPrint("authorization = $token");
- });
- final String hostname;
- final int port;
- final String kuksaAuthToken;
+ bool use_tls = false;
+ if (yamlMap.containsKey('use-tls')) {
+ var value = yamlMap['use-tls'];
+ if (value is bool)
+ use_tls = value;
+ }
+ //debugPrint("Use TLS = $use_tls");
- Config copywith({
- String? hostname,
- int? port,
- String? kuksaAuthToken,
- }) =>
- Config(
- hostname: hostname ?? this.hostname,
- port: port ?? this.port,
- kuksaAuthToken: kuksaAuthToken ?? this.kuksaAuthToken,
- );
-}
+ List<int> ca_cert = [];
+ String ca_path = KuksaConfig.defaultCaCertPath;
+ if (yamlMap.containsKey('ca-certificate')) {
+ ca_path = yamlMap['ca-certificate'];
+ }
+ try {
+ ca_cert = File(ca_path).readAsBytesSync();
+ } on Exception catch(_) {
+ print("ERROR: Could not read CA certificate file $ca_path");
+ ca_cert = [];
+ }
+ //debugPrint("CA cert = $ca_cert");
-final ConfigStateprovider =
-StateNotifierProvider<ConfigStateNotifier, Config>(
- (ref) => ConfigStateNotifier());
+ String tls_server_name = "";
+ if (yamlMap.containsKey('tls-server-name')) {
+ tls_server_name = yamlMap['tls_server_name'];
+ }
-class ConfigStateNotifier extends StateNotifier<Config> {
- ConfigStateNotifier() : super(_initialValue);
- static final Config _initialValue = Config(
- hostname: "",
- port: 0,
- kuksaAuthToken: "",
- );
- void update({
- String? hostname,
- int? port,
- String? kuksaAuthToken,
- }) {
- state = state.copywith(
- hostname: hostname,
- port: port,
- kuksaAuthToken: kuksaAuthToken,
- );
+ return KuksaConfig(
+ hostname: hostname,
+ port: port,
+ authorization: token,
+ use_tls: use_tls,
+ ca_certificate: ca_cert,
+ tls_server_name: tls_server_name
+ );
+ } on Exception catch(_) {
+ return KuksaConfig(
+ hostname: KuksaConfig.defaultHostname,
+ port: KuksaConfig.defaultPort,
+ authorization: "",
+ use_tls: false,
+ ca_certificate: [],
+ tls_server_name: ""
+ );
}
-}
+});