process update

This commit is contained in:
leedongmyung 2025-01-02 01:45:22 +09:00
parent eec7858628
commit 7bcd8ffbfb
4 changed files with 108 additions and 141 deletions

View file

@ -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++;
}
}
}
}

View file

@ -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});
}
}

View file

@ -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++;
}

View file

@ -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;
}
}
}