diff --git a/bin/main.dart b/bin/main.dart index 39ba8b2..ab7ce49 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -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++; } } -} \ No newline at end of file +} diff --git a/lib/log/log.dart b/lib/log/log.dart index a4412f9..9bffb76 100644 --- a/lib/log/log.dart +++ b/lib/log/log.dart @@ -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}); } } diff --git a/lib/platform/process.dart b/lib/platform/process.dart index eff242a..7989887 100644 --- a/lib/platform/process.dart +++ b/lib/platform/process.dart @@ -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 start(StringBuffer shell, {Converter, 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 runGetStdout(StringBuffer shell) async { } } -Future findUsePortPid(int port, [bool runSlient = false]) async { +Future findUsePortPid(int port) async { await removeTempBat(); var c = Completer(); 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 findUsePortPid(int port, [bool runSlient = false]) async { return c.future; } -Future> findProcess(String searchWord, - [bool runSlient = false]) async { +Future> findProcess(String searchWord) async { await removeTempBat(); var c = Completer>(); var pList = []; 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 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 parseProcessStd(String stdout) { return pList; } -Future findProcessByPid(int pid, [bool runSlient = false]) async { +Future findProcessByPid(int pid) async { // await removeTempBat(); var c = Completer(); 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 runSlientBat(StringBuffer shell) async { - initialize(); - var c = Completer(); - 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 runSlient(String batchPath) async { - initialize(); - var c = Completer(); - 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++; } diff --git a/lib/socket/protobuf_client.dart b/lib/socket/protobuf_client.dart index 4c3b52a..69c5319 100644 --- a/lib/socket/protobuf_client.dart +++ b/lib/socket/protobuf_client.dart @@ -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 _arrivedData = []; List _onDisconnectListenerList = []; - - ProtobufClient(this._socket, this._heartbeatIntervalTime, this._heartbeatWaitTime, Map)> parserMap) { + ProtobufClient( + this._socket, + this._heartbeatIntervalTime, + this._heartbeatWaitTime, + Map)> 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 data) async { - if(_isAlive) { + if (_isAlive) { try { List 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 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 { _timer = null; return _responser; } -} \ No newline at end of file +}