fdroid
Kherel 2021-01-19 13:05:40 +01:00
parent 4bfc3058a5
commit 21215685dd
13 changed files with 154 additions and 48 deletions

View File

@ -1,8 +1,10 @@
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'package:selfprivacy/logic/get_it/console.dart'; import 'package:selfprivacy/logic/get_it/console.dart';
import 'package:selfprivacy/logic/get_it/timer.dart';
final getIt = GetIt.instance; final getIt = GetIt.instance;
void getItSetup() { void getItSetup() {
getIt.registerSingleton<ConsoleModel>(ConsoleModelImplementation()); getIt.registerSingleton<ConsoleModel>(ConsoleModel());
getIt.registerSingleton<TimerModel>(TimerModel());
} }

View File

@ -10,8 +10,10 @@ import 'package:selfprivacy/logic/models/user.dart';
class HetznerApi extends ApiMap { class HetznerApi extends ApiMap {
HetznerApi([String token]) { HetznerApi([String token]) {
if (token != null) { if (token != null) {
loggedClient.options = loggedClient.options = BaseOptions(
BaseOptions(headers: {'Authorization': 'Bearer $token'}); headers: {'Authorization': 'Bearer $token'},
baseUrl: rootAddress,
);
} }
} }
@ -42,7 +44,7 @@ class HetznerApi extends ApiMap {
@required String domainName, @required String domainName,
}) async { }) async {
var data = jsonDecode( var data = jsonDecode(
'''{"name":"selfprivacy-server","server_type":"cx11","start_after_create":true,"image":"ubuntu-20.04", "volumes":[],"networks":[],"user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-20.09 DOMAIN=$domainName USER=${rootUser.login} PASSWORD=${rootUser.password} HASHED_PASSWORD=${rootUser.hashPassword} bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":false}'''); '''{"name":"selfprivacy-server","server_type":"cx11","start_after_create":false,"image":"ubuntu-20.04", "volumes":[],"networks":[],"user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-20.09 DOMAIN=$domainName USER=${rootUser.login} PASSWORD=${rootUser.password} HASHED_PASSWORD=${rootUser.hashPassword} bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":false}''');
Response response = await loggedClient.post( Response response = await loggedClient.post(
rootAddress, rootAddress,
@ -52,6 +54,16 @@ class HetznerApi extends ApiMap {
return HetznerServerDetails( return HetznerServerDetails(
id: response.data['server']['id'], id: response.data['server']['id'],
ip4: response.data['server']['public_net']['ipv4']['ip'], ip4: response.data['server']['public_net']['ipv4']['ip'],
createTime: DateTime.now(),
);
}
Future<HetznerServerDetails> startServer({
HetznerServerDetails server,
}) async {
await loggedClient.post('/${server.id}/actions/poweron');
return server.copyWith(
startTime: DateTime.now(), startTime: DateTime.now(),
); );
} }

View File

@ -11,6 +11,7 @@ import 'package:selfprivacy/logic/models/message.dart';
import 'package:selfprivacy/logic/models/server_details.dart'; import 'package:selfprivacy/logic/models/server_details.dart';
import 'package:selfprivacy/logic/models/user.dart'; import 'package:selfprivacy/logic/models/user.dart';
import 'package:basic_utils/basic_utils.dart'; import 'package:basic_utils/basic_utils.dart';
import 'package:selfprivacy/config/get_it_config.dart';
part 'app_config_state.dart'; part 'app_config_state.dart';
@ -27,7 +28,7 @@ class AppConfigCubit extends Cubit<AppConfigState> {
domain: box.get(BNames.domain), domain: box.get(BNames.domain),
rootUser: box.get(BNames.rootUser), rootUser: box.get(BNames.rootUser),
hetznerServer: box.get(BNames.hetznerServer), hetznerServer: box.get(BNames.hetznerServer),
isDnsCheckedAndDkimSet: box.get(BNames.isDnsCheckedAndDkimSet), serverStarted: box.get(BNames.isDnsCheckedAndDkimSet),
), ),
); );
} }
@ -77,13 +78,13 @@ class AppConfigCubit extends Cubit<AppConfigState> {
getIt.get<ConsoleModel>().addMessage( getIt.get<ConsoleModel>().addMessage(
Message( Message(
text: text:
'DnsLookup: address:$address, $RRecordType, provider: CLOUDFLARE', 'DnsLookup: address: $address, $RRecordType, provider: CLOUDFLARE, ip4: $ip4',
), ),
); );
getIt.get<ConsoleModel>().addMessage( getIt.get<ConsoleModel>().addMessage(
Message( Message(
text: text:
'DnsLookup: address:$address, $RRecordType, provider: CLOUDFLARE', 'DnsLookup: ${res.isEmpty ? (res[0].data != ip4 ? 'wrong ip4' : 'right ip4') : 'empty'}',
), ),
); );
if (res.isEmpty || res[0].data != ip4) { if (res.isEmpty || res[0].data != ip4) {
@ -92,10 +93,26 @@ class AppConfigCubit extends Cubit<AppConfigState> {
} }
} }
if (hasError) { if (hasError) {
emit(state.copyWith(error: Exception('dns cloudflare checking error'))); emit(state.copyWith(lastDnsCheckTime: DateTime.now()));
} else { } else {
print('check complete'); var hetznerApi = HetznerApi(state.hetznerKey);
var serverDetails = await hetznerApi.startServer(server: state.server);
await box.put(BNames.hetznerServer, serverDetails);
hetznerApi.close();
emit(
state.copyWith(
serverStarted: true,
isLoading: false,
hetznerServer: serverDetails,
),
);
} }
print('check complete: $hasError, time:' + DateTime.now().toString());
} }
void createServer() async { void createServer() async {

View File

@ -7,9 +7,10 @@ class AppConfigState extends Equatable {
this.cloudFlareDomain, this.cloudFlareDomain,
this.rootUser, this.rootUser,
this.server, this.server,
this.isDnsCheckedAndDkimSet = false, this.isDnsChecked = false,
this.isLoading = false, this.isLoading = false,
this.error, this.error,
this.lastDnsCheckTime,
}); });
@override @override
@ -19,9 +20,10 @@ class AppConfigState extends Equatable {
cloudFlareDomain, cloudFlareDomain,
rootUser, rootUser,
server, server,
isDnsCheckedAndDkimSet, isDnsChecked,
isLoading, isLoading,
error error,
lastDnsCheckTime
]; ];
final String hetznerKey; final String hetznerKey;
@ -29,7 +31,8 @@ class AppConfigState extends Equatable {
final CloudFlareDomain cloudFlareDomain; final CloudFlareDomain cloudFlareDomain;
final User rootUser; final User rootUser;
final HetznerServerDetails server; final HetznerServerDetails server;
final bool isDnsCheckedAndDkimSet; final bool isDnsChecked;
final DateTime lastDnsCheckTime;
final bool isLoading; final bool isLoading;
final Exception error; final Exception error;
@ -40,10 +43,10 @@ class AppConfigState extends Equatable {
CloudFlareDomain domain, CloudFlareDomain domain,
User rootUser, User rootUser,
HetznerServerDetails hetznerServer, HetznerServerDetails hetznerServer,
bool isDnsCheckedAndDkimSet, bool serverStarted,
bool isLoading, bool isLoading,
DateTime serverInitStart,
Exception error, Exception error,
DateTime lastDnsCheckTime,
}) => }) =>
AppConfigState( AppConfigState(
hetznerKey: hetznerKey ?? this.hetznerKey, hetznerKey: hetznerKey ?? this.hetznerKey,
@ -51,10 +54,10 @@ class AppConfigState extends Equatable {
cloudFlareDomain: domain ?? this.cloudFlareDomain, cloudFlareDomain: domain ?? this.cloudFlareDomain,
rootUser: rootUser ?? this.rootUser, rootUser: rootUser ?? this.rootUser,
server: hetznerServer ?? this.server, server: hetznerServer ?? this.server,
isDnsCheckedAndDkimSet: isDnsChecked: serverStarted ?? this.isDnsChecked,
isDnsCheckedAndDkimSet ?? this.isDnsCheckedAndDkimSet,
isLoading: isLoading ?? this.isLoading, isLoading: isLoading ?? this.isLoading,
error: error ?? this.error, error: error ?? this.error,
lastDnsCheckTime: lastDnsCheckTime ?? this.lastDnsCheckTime,
); );
bool get isHetznerFilled => hetznerKey != null; bool get isHetznerFilled => hetznerKey != null;
@ -73,7 +76,7 @@ class AppConfigState extends Equatable {
isDomainFilled, isDomainFilled,
isUserFilled, isUserFilled,
isServerFilled, isServerFilled,
isDnsCheckedAndDkimSet, isDnsChecked,
]; ];
} }

View File

@ -1,19 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:selfprivacy/logic/models/message.dart'; import 'package:selfprivacy/logic/models/message.dart';
abstract class ConsoleModel extends ChangeNotifier { class ConsoleModel extends ChangeNotifier {
void addMessage(Message message);
List<Message> get messages;
}
class ConsoleModelImplementation extends ConsoleModel {
List<Message> _messages = []; List<Message> _messages = [];
@override
List<Message> get messages => _messages; List<Message> get messages => _messages;
@override
void addMessage(Message message) { void addMessage(Message message) {
messages.add(message); messages.add(message);
notifyListeners(); notifyListeners();

View File

@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
class TimerModel extends ChangeNotifier {
DateTime _time = DateTime.now();
DateTime get messages => _time;
void restart() {
_time = DateTime.now();
notifyListeners();
}
}

View File

@ -8,7 +8,8 @@ class HetznerServerDetails {
HetznerServerDetails({ HetznerServerDetails({
@required this.ip4, @required this.ip4,
@required this.id, @required this.id,
@required this.startTime, @required this.createTime,
this.startTime,
}); });
@HiveField(0) @HiveField(0)
@ -20,5 +21,17 @@ class HetznerServerDetails {
@HiveField(2) @HiveField(2)
final DateTime startTime; final DateTime startTime;
@HiveField(3)
final DateTime createTime;
HetznerServerDetails copyWith({DateTime startTime}) {
return HetznerServerDetails(
startTime: startTime ?? this.startTime,
createTime: createTime,
id: id,
ip4: ip4,
);
}
String toString() => id.toString(); String toString() => id.toString();
} }

View File

@ -19,6 +19,7 @@ class HetznerServerDetailsAdapter extends TypeAdapter<HetznerServerDetails> {
return HetznerServerDetails( return HetznerServerDetails(
ip4: fields[0] as String, ip4: fields[0] as String,
id: fields[1] as int, id: fields[1] as int,
createTime: fields[3] as DateTime,
startTime: fields[2] as DateTime, startTime: fields[2] as DateTime,
); );
} }
@ -26,13 +27,15 @@ class HetznerServerDetailsAdapter extends TypeAdapter<HetznerServerDetails> {
@override @override
void write(BinaryWriter writer, HetznerServerDetails obj) { void write(BinaryWriter writer, HetznerServerDetails obj) {
writer writer
..writeByte(3) ..writeByte(4)
..writeByte(0) ..writeByte(0)
..write(obj.ip4) ..write(obj.ip4)
..writeByte(1) ..writeByte(1)
..write(obj.id) ..write(obj.id)
..writeByte(2) ..writeByte(2)
..write(obj.startTime); ..write(obj.startTime)
..writeByte(3)
..write(obj.createTime);
} }
@override @override

View File

@ -6,6 +6,8 @@ import 'package:selfprivacy/ui/pages/initializing/initializing.dart';
import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:selfprivacy/ui/pages/rootRoute.dart'; import 'package:selfprivacy/ui/pages/rootRoute.dart';
import 'package:wakelock/wakelock.dart';
import 'config/bloc_config.dart'; import 'config/bloc_config.dart';
import 'config/bloc_observer.dart'; import 'config/bloc_observer.dart';
import 'config/brand_theme.dart'; import 'config/brand_theme.dart';
@ -18,6 +20,7 @@ final navigatorKey = GlobalKey<NavigatorState>();
void main() async { void main() async {
await HiveConfig.init(); await HiveConfig.init();
Bloc.observer = SimpleBlocObserver(navigatorKey: navigatorKey); Bloc.observer = SimpleBlocObserver(navigatorKey: navigatorKey);
Wakelock.enable();
getItSetup(); getItSetup();
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();

View File

@ -26,6 +26,11 @@ class _BrandTimerState extends State<BrandTimer> {
@override @override
void initState() { void initState() {
_timerStart();
super.initState();
}
_timerStart() {
_timeString = diffenceFromStart; _timeString = diffenceFromStart;
timer = Timer.periodic(Duration(seconds: 1), (Timer t) { timer = Timer.periodic(Duration(seconds: 1), (Timer t) {
var timePassed = DateTime.now().difference(widget.startDateTime); var timePassed = DateTime.now().difference(widget.startDateTime);
@ -36,7 +41,15 @@ class _BrandTimerState extends State<BrandTimer> {
_getTime(); _getTime();
} }
}); });
super.initState(); }
@override
void didUpdateWidget(BrandTimer oldWidget) {
if (timer.isActive) {
timer.cancel();
}
_timerStart();
super.didUpdateWidget(oldWidget);
} }
@override @override
@ -60,10 +73,9 @@ class _BrandTimerState extends State<BrandTimer> {
String _durationToString(Duration duration) { String _durationToString(Duration duration) {
String twoDigits(int n) => n.toString().padLeft(2, "0"); String twoDigits(int n) => n.toString().padLeft(2, "0");
String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); String twoDigitSeconds = twoDigits(60 - duration.inSeconds.remainder(60));
String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
return "$twoDigitMinutes:$twoDigitSeconds"; return "$twoDigitSeconds cек";
} }
@override @override

View File

@ -287,33 +287,27 @@ class InitializingPage extends StatelessWidget {
Widget _stepCheck(AppConfigCubit appConfigCubit) { Widget _stepCheck(AppConfigCubit appConfigCubit) {
var state = appConfigCubit.state; var state = appConfigCubit.state;
var error = state.error;
return Builder(builder: (context) { return Builder(builder: (context) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Spacer(flex: 2), Spacer(flex: 2),
BrandText.h2(error == null ? 'Создание началось' : 'Error'),
SizedBox(height: 10), SizedBox(height: 10),
error == null BrandText.body2(
? BrandText.body2( 'Мы начали процесс инциализации сервера, раз в минуты мы будем проверять наличие DNS записей, как только они вступят в силу мы закончим инциализацию',
'Мы начали процесс инциализации сервера, через 10 минут, мы проверим правильность DNS записей, и закончим инциализацию', ),
)
: BrandText.body2(
error.toString(),
style: TextStyle(color: BrandColors.red1),
),
SizedBox(height: 10), SizedBox(height: 10),
Row( Row(
children: [ children: [
BrandText.body2('Времени прошло: '), BrandText.body2('До следующей проверки: '),
BrandTimer( BrandTimer(
startDateTime: state.server.startTime, startDateTime:
duration: Duration(minutes: 10), state.lastDnsCheckTime ?? state.server.createTime,
duration: Duration(seconds: 10),
callback: () { callback: () {
appConfigCubit.checkDns(); appConfigCubit.checkDns();
}, },
), )
], ],
), ),
Spacer( Spacer(

View File

@ -176,6 +176,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "2.1.5"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.2"
cubit_form: cubit_form:
dependency: "direct main" dependency: "direct main"
description: description:
@ -350,6 +357,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.2" version: "0.8.2"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.0+4"
http: http:
dependency: transitive dependency: transitive
description: description:
@ -378,6 +392,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.19" version: "2.1.19"
import_js_library:
dependency: transitive
description:
name: import_js_library
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
intl: intl:
dependency: transitive dependency: transitive
description: description:
@ -803,6 +824,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0-nullsafety.3" version: "2.1.0-nullsafety.3"
wakelock:
dependency: "direct main"
description:
name: wakelock
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.1+1"
wakelock_platform_interface:
dependency: transitive
description:
name: wakelock_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0+1"
wakelock_web:
dependency: transitive
description:
name: wakelock_web
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0+3"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:

View File

@ -25,6 +25,7 @@ dependencies:
package_info: ^0.4.3+2 package_info: ^0.4.3+2
provider: ^4.3.2+2 provider: ^4.3.2+2
url_launcher: ^5.7.10 url_launcher: ^5.7.10
wakelock: ^0.2.1+1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: