process update
This commit is contained in:
parent
eec7858628
commit
7bcd8ffbfb
4 changed files with 108 additions and 141 deletions
|
|
@ -1,6 +1,4 @@
|
|||
import 'dart:io';
|
||||
import 'package:dart_framework/encrypt/encrypt.dart';
|
||||
import 'package:dart_framework/log/log.dart';
|
||||
import 'package:dart_framework/platform/process.dart';
|
||||
import 'package:dart_framework/subtitle/parser_smi.dart';
|
||||
import 'package:dart_framework/subtitle/parser_srt.dart';
|
||||
|
|
@ -11,8 +9,9 @@ import 'package:dart_framework/core/application.dart';
|
|||
import 'package:dart_framework/charset.dart';
|
||||
|
||||
void main() async {
|
||||
Application('dartframework', 'com.toki-labs.dartframework',() async {
|
||||
Application('dartframework', 'com.toki-labs.dartframework', () async {
|
||||
isolate.test();
|
||||
|
||||
// var md5 = generateMd5('test');
|
||||
// print('$md5 / ${md5.length}');
|
||||
// var encrypted = encrypt('test', 'this is test');
|
||||
|
|
@ -20,7 +19,6 @@ void main() async {
|
|||
|
||||
// var raw = decrypt('test', encrypted);
|
||||
// print(raw);
|
||||
|
||||
}, (error, stack) {
|
||||
print(error);
|
||||
print(stack);
|
||||
|
|
@ -56,4 +54,4 @@ void testParse() {
|
|||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import 'dart:io';
|
|||
import 'package:dart_framework/platform/platform_base.dart';
|
||||
import 'package:dart_framework/utils/path.dart';
|
||||
import 'package:dart_framework/utils/string_util.dart';
|
||||
import 'package:dart_framework/utils/system_util.dart';
|
||||
|
||||
/// ********************** Test ************************* ///
|
||||
void test() async {
|
||||
|
|
@ -109,8 +108,8 @@ class Log {
|
|||
}
|
||||
}
|
||||
if (path != null && path!.isNotEmpty) {
|
||||
_writer
|
||||
.start(path!, {'request': _onRequestMessage, 'ready': _onReadyMessage});
|
||||
_writer.start(
|
||||
path!, {'request': _onRequestMessage, 'ready': _onReadyMessage});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import 'dart:io';
|
|||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:args/args.dart';
|
||||
import 'package:dart_framework/cp949.dart';
|
||||
import 'package:dart_framework/log/log.dart';
|
||||
import 'package:dart_framework/utils/system_util.dart';
|
||||
|
||||
|
|
@ -153,6 +155,24 @@ class ProcessExecutor {
|
|||
return dataFutrue(processData);
|
||||
}
|
||||
|
||||
static bool _powershellGranted = false;
|
||||
static Future getPowershellGrant() async {
|
||||
if (!_powershellGranted) {
|
||||
_powershellGranted = true;
|
||||
var result = await Process.run(
|
||||
'powershell.exe',
|
||||
[
|
||||
'-Command',
|
||||
'Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned'
|
||||
],
|
||||
runInShell: true,
|
||||
);
|
||||
print('[Powershell Grant] ${result.stdout}');
|
||||
print('[Powershell Grant] Error: ${result.stderr}');
|
||||
}
|
||||
return simpleFuture;
|
||||
}
|
||||
|
||||
static Future<ProcessData> start(StringBuffer shell,
|
||||
{Converter<List<int>, String>? decoder,
|
||||
String? workspace,
|
||||
|
|
@ -252,22 +272,6 @@ class ProcessExecutor {
|
|||
var shellExe = Platform.isMacOS ? 'zsh' : 'bash';
|
||||
processResult = await Process.run(shellExe, [file.path],
|
||||
workingDirectory: workspace);
|
||||
if (printStdout) {
|
||||
logHandler ??
|
||||
(
|
||||
// ignore: prefer_interpolation_to_compose_strings
|
||||
'[ProcessExecutor] Result: ${processResult.stdout}',
|
||||
LogType.verbose
|
||||
);
|
||||
}
|
||||
if (printStderr) {
|
||||
logHandler ??
|
||||
(
|
||||
// ignore: prefer_interpolation_to_compose_strings
|
||||
'[ProcessExecutor] Exit Code: ${processResult.exitCode}\nError: ${processResult.stderr}',
|
||||
LogType.verbose
|
||||
);
|
||||
}
|
||||
} on Exception catch (e) {
|
||||
logHandler ?? (e, LogType.error);
|
||||
} finally {
|
||||
|
|
@ -277,17 +281,14 @@ class ProcessExecutor {
|
|||
} else if (Platform.isWindows) {
|
||||
file.createSync();
|
||||
file.writeAsStringSync(shell.toString());
|
||||
processResult = await Process.run('cmd', ['/C', file.path],
|
||||
workingDirectory: workspace);
|
||||
if (printStdout) {
|
||||
// print(
|
||||
// // ignore: prefer_interpolation_to_compose_strings
|
||||
// '[ProcessExecutor] Exit Code: ${processResult!.exitCode}\n' +
|
||||
// '==============================================================\n' +
|
||||
// 'Result: ${eucKr.decode()}\n' +
|
||||
// '==============================================================\n' +
|
||||
// 'Error: ${eucKr.decode(processResult!.stderr)}');
|
||||
}
|
||||
|
||||
await getPowershellGrant();
|
||||
|
||||
processResult = await Process.run(
|
||||
'powershell.exe', // PowerShell 실행
|
||||
['-NoProfile', '-File', file.absolute.path],
|
||||
runInShell: true);
|
||||
|
||||
file.deleteSync();
|
||||
c.complete(processResult);
|
||||
} else {
|
||||
|
|
@ -295,6 +296,32 @@ class ProcessExecutor {
|
|||
('This platform not support process executor.', LogType.error);
|
||||
c.complete(null);
|
||||
}
|
||||
if (processResult != null) {
|
||||
if (printStdout) {
|
||||
var stdout = processResult.stdout.toString();
|
||||
if (decoder != null) {
|
||||
stdout = decoder.convert(stdout.codeUnits);
|
||||
}
|
||||
logHandler ??
|
||||
(
|
||||
// ignore: prefer_interpolation_to_compose_strings
|
||||
'[ProcessExecutor] Result: $stdout',
|
||||
LogType.verbose
|
||||
);
|
||||
}
|
||||
if (printStderr) {
|
||||
var stderr = processResult.stderr.toString();
|
||||
if (decoder != null) {
|
||||
stderr = decoder.convert(stderr.codeUnits);
|
||||
}
|
||||
logHandler ??
|
||||
(
|
||||
// ignore: prefer_interpolation_to_compose_strings
|
||||
'[ProcessExecutor] Exit Code: ${processResult.exitCode}\nError: $stderr',
|
||||
LogType.verbose
|
||||
);
|
||||
}
|
||||
}
|
||||
return c.future;
|
||||
}
|
||||
|
||||
|
|
@ -302,7 +329,7 @@ class ProcessExecutor {
|
|||
if (Platform.isMacOS || Platform.isLinux) {
|
||||
return 'temp_${DateTime.now().microsecondsSinceEpoch}.sh';
|
||||
} else {
|
||||
return 'temp_${DateTime.now().microsecondsSinceEpoch}.bat';
|
||||
return 'temp_${DateTime.now().microsecondsSinceEpoch}.ps1';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -379,16 +406,14 @@ Future<String> runGetStdout(StringBuffer shell) async {
|
|||
}
|
||||
}
|
||||
|
||||
Future<NetStatData?> findUsePortPid(int port, [bool runSlient = false]) async {
|
||||
Future<NetStatData?> findUsePortPid(int port) async {
|
||||
await removeTempBat();
|
||||
var c = Completer<NetStatData?>();
|
||||
var shell = StringBuffer('netstat -aon | find "$port"');
|
||||
var stdout = "";
|
||||
try {
|
||||
stdout = runSlient
|
||||
? await ProcessSilentExecutor.runSlientBat(shell)
|
||||
: await runGetStdout(shell);
|
||||
} on Exception catch (e) {}
|
||||
stdout = await runGetStdout(shell);
|
||||
} on Exception {}
|
||||
if (stdout == "") {
|
||||
c.complete(null);
|
||||
} else {
|
||||
|
|
@ -418,17 +443,20 @@ Future<NetStatData?> findUsePortPid(int port, [bool runSlient = false]) async {
|
|||
return c.future;
|
||||
}
|
||||
|
||||
Future<List<ProcessInfo>> findProcess(String searchWord,
|
||||
[bool runSlient = false]) async {
|
||||
Future<List<ProcessInfo>> findProcess(String searchWord) async {
|
||||
await removeTempBat();
|
||||
var c = Completer<List<ProcessInfo>>();
|
||||
var pList = <ProcessInfo>[];
|
||||
if (Platform.isWindows) {
|
||||
var shell = StringBuffer('tasklist /fo "csv" | findstr $searchWord');
|
||||
var stdout = runSlient
|
||||
? await ProcessSilentExecutor.runSlientBat(shell)
|
||||
: await runGetStdout(shell);
|
||||
pList = parseProcessStd(stdout);
|
||||
var csvPath = File(
|
||||
'${Directory.systemTemp.absolute.path}\\temp_${Random().nextInt(100000)}.csv');
|
||||
var shell = StringBuffer(
|
||||
'Get-CimInstance -ClassName Win32_Process | Where-Object { \$_.Name.Contains("$searchWord") } | Select-Object CommandLine, ProcessId | Export-Csv -Path ${csvPath.absolute.path} -NoTypeInformation');
|
||||
var result = await ProcessExecutor.run(shell);
|
||||
if (csvPath.existsSync()) {
|
||||
pList = parseProcessStd(csvPath.readAsStringSync());
|
||||
csvPath.deleteSync();
|
||||
}
|
||||
} else if (Platform.isLinux) {
|
||||
var shell = StringBuffer('ps -ef | grep \'$searchWord\' | grep -v grep');
|
||||
var result = await ProcessExecutor.run(shell, printStdout: false);
|
||||
|
|
@ -495,9 +523,9 @@ List<ProcessInfo> parseProcessStd(String stdout) {
|
|||
var list = stdout.split(returnPattern);
|
||||
for (var item in list) {
|
||||
item = item.replaceAll(returnPattern, '');
|
||||
if (item.isNotEmpty) {
|
||||
if (item.isNotEmpty && !item.contains('CommandLine')) {
|
||||
var categories = item.split(',');
|
||||
if (categories.length > 4) {
|
||||
if (categories.length > 1) {
|
||||
pList.add(ProcessInfo.category(categories));
|
||||
}
|
||||
}
|
||||
|
|
@ -505,14 +533,12 @@ List<ProcessInfo> parseProcessStd(String stdout) {
|
|||
return pList;
|
||||
}
|
||||
|
||||
Future<ProcessInfo?> findProcessByPid(int pid, [bool runSlient = false]) async {
|
||||
Future<ProcessInfo?> findProcessByPid(int pid) async {
|
||||
// await removeTempBat();
|
||||
var c = Completer<ProcessInfo?>();
|
||||
var shell =
|
||||
StringBuffer('tasklist /fi "pid eq ${pid.toString()}" /nh /fo "csv"');
|
||||
var stdout = runSlient
|
||||
? await ProcessSilentExecutor.runSlientBat(shell)
|
||||
: await runGetStdout(shell);
|
||||
var stdout = await runGetStdout(shell);
|
||||
var pList = parseProcessStd(stdout);
|
||||
if (pList.isNotEmpty) {
|
||||
c.complete(pList.first);
|
||||
|
|
@ -540,43 +566,6 @@ class ProcessSilentExecutor {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Future<String> runSlientBat(StringBuffer shell) async {
|
||||
initialize();
|
||||
var c = Completer<String>();
|
||||
var shellStr = shell.toString();
|
||||
print('Execute Shell: $shellStr');
|
||||
var batch = File(
|
||||
'${Directory.systemTemp.path}/silent_bat_${getRnadomPostfix()}.bat');
|
||||
batch.writeAsStringSync(shellStr);
|
||||
var result = await runSlient(batch.path);
|
||||
await batch.delete();
|
||||
c.complete(result);
|
||||
return c.future;
|
||||
}
|
||||
|
||||
static Future<String> runSlient(String batchPath) async {
|
||||
initialize();
|
||||
var c = Completer<String>();
|
||||
var current = Directory.current;
|
||||
String result;
|
||||
var log = File('${current.path}/silent_log_${getRnadomPostfix()}.txt');
|
||||
await Process.run(
|
||||
'${current.path}/assets/bin/silentbatch.exe', [batchPath, log.path])
|
||||
.then((resultData) {
|
||||
Process.killPid(resultData.pid);
|
||||
// print('"$batchPath" => exitCode: ${resultData.exitCode}');
|
||||
});
|
||||
try {
|
||||
result = await log.readAsString();
|
||||
} on Exception catch (e) {
|
||||
print(e);
|
||||
result = '';
|
||||
}
|
||||
await log.delete();
|
||||
c.complete(result);
|
||||
return c.future;
|
||||
}
|
||||
}
|
||||
|
||||
String getRnadomPostfix() {
|
||||
|
|
@ -693,17 +682,6 @@ class ProcessInfo {
|
|||
value ??= -1;
|
||||
pid = value;
|
||||
break;
|
||||
case 2:
|
||||
sessionName = category;
|
||||
break;
|
||||
case 3:
|
||||
var value = int.tryParse(category);
|
||||
value ??= -1;
|
||||
session = value;
|
||||
break;
|
||||
case 4:
|
||||
memory = category;
|
||||
break;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
// ignore_for_file: avoid_init_to_null, prefer_final_fields, avoid_print
|
||||
|
||||
import 'dart:io';
|
||||
|
|
@ -10,8 +9,7 @@ import 'package:protobuf/protobuf.dart';
|
|||
import 'package:dart_framework/communicator.dart';
|
||||
import 'package:dart_framework/socket/packets/message_common.pb.dart';
|
||||
|
||||
abstract class ProtobufClient extends Communicator
|
||||
{
|
||||
abstract class ProtobufClient extends Communicator {
|
||||
final int _headerSize = 4;
|
||||
late int _heartbeatIntervalTime;
|
||||
late int _heartbeatWaitTime;
|
||||
|
|
@ -22,29 +20,33 @@ abstract class ProtobufClient extends Communicator
|
|||
late List<int> _arrivedData = [];
|
||||
List<void Function(ProtobufClient)> _onDisconnectListenerList = [];
|
||||
|
||||
|
||||
ProtobufClient(this._socket, this._heartbeatIntervalTime, this._heartbeatWaitTime, Map<String, GeneratedMessage Function(List<int>)> parserMap) {
|
||||
ProtobufClient(
|
||||
this._socket,
|
||||
this._heartbeatIntervalTime,
|
||||
this._heartbeatWaitTime,
|
||||
Map<String, GeneratedMessage Function(List<int>)> parserMap) {
|
||||
print('Connected New Client');
|
||||
_isAlive = true;
|
||||
parserMap.addAll({
|
||||
(TestData).toString() : TestData.fromBuffer,
|
||||
(HeartBeat).toString() : HeartBeat.fromBuffer
|
||||
(TestData).toString(): TestData.fromBuffer,
|
||||
(HeartBeat).toString(): HeartBeat.fromBuffer
|
||||
});
|
||||
super.initialize(parserMap);
|
||||
_socket.listen(onData, onError: onError)
|
||||
.asFuture().then(onDisconnected);
|
||||
_socket.listen(onData, onError: onError).asFuture().then(onDisconnected);
|
||||
addListener(onHeartBeat);
|
||||
sendHeartBeat();
|
||||
}
|
||||
|
||||
void sendHeartBeat() {
|
||||
if(_isAlive) {
|
||||
if (_isAlive) {
|
||||
_heartbeatChecker?.responsed();
|
||||
_heartbeatChecker = ResponseChecker.second(this, _heartbeatIntervalTime, (client) {
|
||||
if(_isAlive) {
|
||||
_heartbeatChecker =
|
||||
ResponseChecker.second(this, _heartbeatIntervalTime, (client) {
|
||||
if (_isAlive) {
|
||||
send(HeartBeat());
|
||||
_heartbeatChecker = ResponseChecker.second(this, _heartbeatWaitTime, (client) {
|
||||
if(_isAlive) {
|
||||
_heartbeatChecker =
|
||||
ResponseChecker.second(this, _heartbeatWaitTime, (client) {
|
||||
if (_isAlive) {
|
||||
dispose();
|
||||
onDisconnected(null);
|
||||
}
|
||||
|
|
@ -59,23 +61,20 @@ abstract class ProtobufClient extends Communicator
|
|||
}
|
||||
|
||||
void addDisconnectListener(void Function(ProtobufClient) handler) {
|
||||
if(!_onDisconnectListenerList.contains(handler))
|
||||
{
|
||||
if (!_onDisconnectListenerList.contains(handler)) {
|
||||
_onDisconnectListenerList.add(handler);
|
||||
}
|
||||
}
|
||||
|
||||
void removeDisconnectListener(void Function(ProtobufClient) handler) {
|
||||
if(_onDisconnectListenerList.contains(handler))
|
||||
{
|
||||
if (_onDisconnectListenerList.contains(handler)) {
|
||||
_onDisconnectListenerList.remove(handler);
|
||||
}
|
||||
}
|
||||
|
||||
void onDisconnected(dynamic data) {
|
||||
//client disconnected
|
||||
if(_isAlive)
|
||||
{
|
||||
if (_isAlive) {
|
||||
for (var item in _onDisconnectListenerList) {
|
||||
item.call(this);
|
||||
}
|
||||
|
|
@ -88,22 +87,17 @@ abstract class ProtobufClient extends Communicator
|
|||
}
|
||||
|
||||
void onData(Uint8List data) async {
|
||||
try
|
||||
{
|
||||
try {
|
||||
// printPacket('## Received', data);
|
||||
if(_length == null)
|
||||
{
|
||||
if (_length == null) {
|
||||
var header = data.sublist(0, _headerSize);
|
||||
_length = header.buffer.asByteData().getInt32(0);
|
||||
_arrivedData.addAll(data.sublist(_headerSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
_arrivedData.addAll(data);
|
||||
}
|
||||
|
||||
if(_arrivedData.length == _length)
|
||||
{
|
||||
if (_arrivedData.length == _length) {
|
||||
var common = PacketBase.fromBuffer(_arrivedData);
|
||||
var nonce = common.nonce;
|
||||
onReceivedData(common.typeName, common.data);
|
||||
|
|
@ -112,14 +106,14 @@ abstract class ProtobufClient extends Communicator
|
|||
|
||||
sendHeartBeat();
|
||||
}
|
||||
} on Exception catch(e) {
|
||||
} on Exception catch (e) {
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future send<T extends GeneratedMessage>(T data) async {
|
||||
if(_isAlive) {
|
||||
if (_isAlive) {
|
||||
try {
|
||||
List<int> packet = [];
|
||||
var base = PacketBase();
|
||||
|
|
@ -129,7 +123,7 @@ abstract class ProtobufClient extends Communicator
|
|||
var baseBytes = base.writeToBuffer();
|
||||
int length = baseBytes.length + _headerSize;
|
||||
var header = Uint8List(_headerSize)
|
||||
..buffer.asByteData().setInt32(0, length);
|
||||
..buffer.asByteData().setInt32(0, length);
|
||||
packet.addAll(header);
|
||||
packet.addAll(baseBytes);
|
||||
|
||||
|
|
@ -137,7 +131,7 @@ abstract class ProtobufClient extends Communicator
|
|||
|
||||
_socket.add(packet);
|
||||
await _socket.flush();
|
||||
} catch(e, s) {
|
||||
} catch (e) {
|
||||
onDisconnected(null);
|
||||
}
|
||||
}
|
||||
|
|
@ -146,22 +140,20 @@ abstract class ProtobufClient extends Communicator
|
|||
|
||||
void printPacket(String prefix, List<int> packet) {
|
||||
var s = StringBuffer();
|
||||
for(var item in packet)
|
||||
{
|
||||
for (var item in packet) {
|
||||
s.write('$item, ');
|
||||
}
|
||||
print('$prefix: ${s.toString()}');
|
||||
}
|
||||
|
||||
void dispose() async {
|
||||
if(_isAlive)
|
||||
{
|
||||
if (_isAlive) {
|
||||
_isAlive = false;
|
||||
_heartbeatChecker?.responsed();
|
||||
try {
|
||||
await _socket.close();
|
||||
_socket.destroy();
|
||||
} catch (e, s) {}
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -192,4 +184,4 @@ class ResponseChecker<T> {
|
|||
_timer = null;
|
||||
return _responser;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue