pywebexec 2.3.10__py3-none-any.whl → 2.3.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pywebexec/static/css/form.css +2 -0
- pywebexec/static/js/schemaform.js +4 -0
- pywebexec/version.py +2 -2
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/METADATA +1 -1
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/RECORD +9 -11
- pywebexec/cmdscript.py +0 -150
- pywebexec/cmdscript.py.ok +0 -85
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/WHEEL +0 -0
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/entry_points.txt +0 -0
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/licenses/LICENSE +0 -0
- {pywebexec-2.3.10.dist-info → pywebexec-2.3.12.dist-info}/top_level.txt +0 -0
pywebexec/static/css/form.css
CHANGED
@@ -356,6 +356,10 @@ function createSchemaForm($form, schema, onSubmit, schemaName) {
|
|
356
356
|
adjustInputWidth(e.target);
|
357
357
|
}
|
358
358
|
});
|
359
|
+
schemaForm.addEventListener('mouseup', (e) => {
|
360
|
+
// save form values when clicking on array buttons
|
361
|
+
setTimeout(() => validateSchemaForm(schemaForm, formDesc, schema, jsform.root.getFormValues(), schemaName), 1);
|
362
|
+
});
|
359
363
|
divopt = schemaForm.querySelector("fieldset.expandable > div");
|
360
364
|
formInputHandle();
|
361
365
|
return jsform;
|
pywebexec/version.py
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
pywebexec/__init__.py,sha256=197fHJy0UDBwTTpGCGortZRr-w2kTaD7MxqdbVmTEi0,61
|
2
|
-
pywebexec/cmdscript.py,sha256=TCYfWTPYn5LEWiMPm0zc9iyHm2AV4uH5E-gOL3hGoDc,6182
|
3
|
-
pywebexec/cmdscript.py.ok,sha256=nWB11LXjQahCUwJ8jK0XuU1ekoMyN9Zu_FaOdVTpOwk,2859
|
4
2
|
pywebexec/host_ip.py,sha256=oiCMlo2o3AkkgXDarUSx8T3FWXKI0vk1-EPnx5FGBd8,1332
|
5
3
|
pywebexec/pywebexec.py,sha256=1M5CtxKr5YkEMBhuVSrwnMNcVRuf7iQf-uxF4Lf0ouQ,48375
|
6
4
|
pywebexec/swagger.yaml,sha256=I_oLpp7Hqel8SDEEykvpmCT-Gv3ytGlziq9bvQOrtZY,7598
|
7
|
-
pywebexec/version.py,sha256=
|
8
|
-
pywebexec/static/css/form.css,sha256=
|
5
|
+
pywebexec/version.py,sha256=joxpi5tVTL5LL2B2j6lZDiCaftcd7q6F9z-wABndm5Q,513
|
6
|
+
pywebexec/static/css/form.css,sha256=riFFi02xtUXusTTZOU3RSZykutJWMFfK65-eR5RbhY8,7252
|
9
7
|
pywebexec/static/css/markdown.css,sha256=br4-iK9wigTs54N2KHtjgZ4KLH0THVSvJo-XZAdMHiE,1970
|
10
8
|
pywebexec/static/css/style.css,sha256=pUmylXwbFIoXrdaJRVOUohlKIhOIilapH97NyIlgGV4,10343
|
11
9
|
pywebexec/static/css/swagger-ui.css,sha256=xhXN8fnUaIACGHuPIEIr9-qmyYr6Zx0k2wv4Qy7Bg1Y,154985
|
@@ -37,7 +35,7 @@ pywebexec/static/images/success.svg,sha256=NVwezvVMplt46ElW798vqGfrL21Mw_DWHUp_q
|
|
37
35
|
pywebexec/static/images/swagger-ui.svg,sha256=FR0yeOVwe4zCYKZAjCGcT_m0Mf25NexIVaSXifIkoU0,2117
|
38
36
|
pywebexec/static/js/executables.js,sha256=cTgCFHr_F9bFCirtfG_uR32vOY3vNUr4Ih3Wglj5lFc,11988
|
39
37
|
pywebexec/static/js/popup.js,sha256=IaKmk2U2hEn-Nv6krf_PPW6LaG8NcpCkJKb7lUX0qZo,11457
|
40
|
-
pywebexec/static/js/schemaform.js,sha256=
|
38
|
+
pywebexec/static/js/schemaform.js,sha256=2AIjwdjSDTE2ide8UMmQt4tS-7-JKqidKdopq9mNzvo,12458
|
41
39
|
pywebexec/static/js/script.js,sha256=TI3TSylgBxh_a6QvYWlg4CyJ6LMPxnhFl8WRtRDGD0Y,20810
|
42
40
|
pywebexec/static/js/swagger-form.js,sha256=CLcSHMhk5P4-_2MIRBoJLgEnIj_9keDDSzUugXHZjio,4565
|
43
41
|
pywebexec/static/js/js-yaml/LICENSE,sha256=oHvCRGi5ZUznalR9R6LbKC0HcztxXbTHOpi9Y5YflVA,1084
|
@@ -69,9 +67,9 @@ pywebexec/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
69
67
|
pywebexec/templates/index.html,sha256=w18O2plH_yS8bqlPsu5hwFFmCj9H2hWLSV8B6ADcSwU,3900
|
70
68
|
pywebexec/templates/popup.html,sha256=3kpMccKD_OLLhJ4Y9KRw6Ny8wQWjVaRrUfV9y5-bDiQ,1580
|
71
69
|
pywebexec/templates/swagger_ui.html,sha256=MAPr-z96VERAecDvX37V8q2Nxph-O0fNDBul1x2w9SI,1147
|
72
|
-
pywebexec-2.3.
|
73
|
-
pywebexec-2.3.
|
74
|
-
pywebexec-2.3.
|
75
|
-
pywebexec-2.3.
|
76
|
-
pywebexec-2.3.
|
77
|
-
pywebexec-2.3.
|
70
|
+
pywebexec-2.3.12.dist-info/licenses/LICENSE,sha256=gRJf0JPT_wsZJsUGlWPTS8Vypfl9vQ1qjp6sNbKykuA,1064
|
71
|
+
pywebexec-2.3.12.dist-info/METADATA,sha256=aWLzt0bcF4EmtZwXhY5T9giS0WkJFDY-6BiZYFeaGX0,13016
|
72
|
+
pywebexec-2.3.12.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
73
|
+
pywebexec-2.3.12.dist-info/entry_points.txt,sha256=l52GBkPCXRkmlHfEyoVauyfBdg8o-CAtC8qQpOIjJK0,55
|
74
|
+
pywebexec-2.3.12.dist-info/top_level.txt,sha256=vHoHyzngrfGdm_nM7Xn_5iLmaCrf10XO1EhldgNLEQ8,10
|
75
|
+
pywebexec-2.3.12.dist-info/RECORD,,
|
pywebexec/cmdscript.py
DELETED
@@ -1,150 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
import msvcrt
|
4
|
-
import shutil
|
5
|
-
import time
|
6
|
-
import signal
|
7
|
-
from datetime import datetime
|
8
|
-
from winpty import PTY, WinptyError
|
9
|
-
|
10
|
-
class CmdInteractive:
|
11
|
-
def __init__(self, logfile=None):
|
12
|
-
self.logfile = logfile
|
13
|
-
cols, rows = shutil.get_terminal_size()
|
14
|
-
self.pty = PTY(cols, rows)
|
15
|
-
# Set up Ctrl+C handling
|
16
|
-
signal.signal(signal.SIGINT, self._handle_sigint)
|
17
|
-
self.pid = self.pty.spawn('cmd.exe')
|
18
|
-
if not self.pid:
|
19
|
-
raise RuntimeError("Failed to spawn cmd.exe")
|
20
|
-
self.command_buffer = []
|
21
|
-
self.history = []
|
22
|
-
self.history_index = 0
|
23
|
-
self.cursor_pos = 0 # Track cursor position in command buffer
|
24
|
-
|
25
|
-
def _handle_sigint(self, signum, frame):
|
26
|
-
"""Handle Ctrl+C by forwarding it to the child process"""
|
27
|
-
try:
|
28
|
-
self.pty.write('\x03')
|
29
|
-
except:
|
30
|
-
pass
|
31
|
-
|
32
|
-
def log(self, text, direction='>>'):
|
33
|
-
if self.logfile:
|
34
|
-
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
|
35
|
-
with open(self.logfile, 'a', encoding='utf-8') as f:
|
36
|
-
f.write(f'{timestamp} {direction} {text}')
|
37
|
-
|
38
|
-
def handle_special_key(self, char):
|
39
|
-
"""Handle special key sequences"""
|
40
|
-
if char == b'\xe0': # Extended key
|
41
|
-
key = msvcrt.getch()
|
42
|
-
if key == b'H': # Up arrow
|
43
|
-
if self.history and self.history_index > 0:
|
44
|
-
self.history_index -= 1
|
45
|
-
cmd = self.history[self.history_index]
|
46
|
-
self._replace_line(cmd)
|
47
|
-
elif key == b'P': # Down arrow
|
48
|
-
if self.history_index < len(self.history) - 1:
|
49
|
-
self.history_index += 1
|
50
|
-
cmd = self.history[self.history_index]
|
51
|
-
self._replace_line(cmd)
|
52
|
-
elif key == b'K': # Left arrow
|
53
|
-
if self.cursor_pos > 0:
|
54
|
-
self.cursor_pos -= 1
|
55
|
-
self.pty.write('\x1b[D')
|
56
|
-
elif key == b'M': # Right arrow
|
57
|
-
if self.cursor_pos < len(self.command_buffer):
|
58
|
-
self.cursor_pos += 1
|
59
|
-
self.pty.write('\x1b[C')
|
60
|
-
return True
|
61
|
-
return False
|
62
|
-
|
63
|
-
def _replace_line(self, new_text):
|
64
|
-
"""Replace current line with new text"""
|
65
|
-
# Clear current line
|
66
|
-
self.pty.write('\r' + ' ' * len(self.command_buffer) + '\r')
|
67
|
-
# Write new line
|
68
|
-
self.command_buffer = list(new_text)
|
69
|
-
self.cursor_pos = len(self.command_buffer)
|
70
|
-
self.pty.write(''.join(self.command_buffer))
|
71
|
-
|
72
|
-
def interact(self):
|
73
|
-
try:
|
74
|
-
while True:
|
75
|
-
try:
|
76
|
-
try:
|
77
|
-
output = self.pty.read()
|
78
|
-
if output:
|
79
|
-
if isinstance(output, str):
|
80
|
-
output = output.encode('utf-8')
|
81
|
-
sys.stdout.buffer.write(output)
|
82
|
-
sys.stdout.buffer.flush()
|
83
|
-
self.log(output.decode('utf-8', errors='replace'), '>>')
|
84
|
-
except (EOFError, WinptyError):
|
85
|
-
break
|
86
|
-
|
87
|
-
if msvcrt.kbhit():
|
88
|
-
char = msvcrt.getch()
|
89
|
-
if self.handle_special_key(char):
|
90
|
-
continue
|
91
|
-
|
92
|
-
if char == b'\r': # Enter
|
93
|
-
self.pty.write('\r\n')
|
94
|
-
if self.command_buffer:
|
95
|
-
cmd = ''.join(self.command_buffer)
|
96
|
-
self.history.append(cmd)
|
97
|
-
self.history_index = len(self.history)
|
98
|
-
self.command_buffer = []
|
99
|
-
self.cursor_pos = 0
|
100
|
-
elif char == b'\x08': # Backspace
|
101
|
-
if self.cursor_pos > 0:
|
102
|
-
# Remove character at cursor position
|
103
|
-
self.command_buffer.pop(self.cursor_pos - 1)
|
104
|
-
self.cursor_pos -= 1
|
105
|
-
# Rewrite the line from cursor position
|
106
|
-
remain = ''.join(self.command_buffer[self.cursor_pos:])
|
107
|
-
self.pty.write('\x08' + remain + ' ')
|
108
|
-
# Move cursor back to position
|
109
|
-
if remain:
|
110
|
-
self.pty.write('\x1b[' + str(len(remain)) + 'D')
|
111
|
-
elif char == b'\x03': # Ctrl+C
|
112
|
-
self.pty.write('\x03')
|
113
|
-
self.command_buffer = []
|
114
|
-
self.cursor_pos = 0
|
115
|
-
continue
|
116
|
-
else:
|
117
|
-
# Insert character at cursor position
|
118
|
-
if isinstance(char, bytes):
|
119
|
-
char = char.decode('cp437', errors='replace')
|
120
|
-
self.command_buffer.insert(self.cursor_pos, char)
|
121
|
-
self.cursor_pos += 1
|
122
|
-
# Write new char and remaining text
|
123
|
-
remain = ''.join(self.command_buffer[self.cursor_pos-1:])
|
124
|
-
self.pty.write(remain)
|
125
|
-
# Move cursor back if needed
|
126
|
-
if self.cursor_pos < len(self.command_buffer):
|
127
|
-
self.pty.write('\x1b[' + str(len(remain)-1) + 'D')
|
128
|
-
self.log(char, '<<')
|
129
|
-
|
130
|
-
except (IOError, OSError) as e:
|
131
|
-
if "handle is closed" in str(e):
|
132
|
-
break
|
133
|
-
raise
|
134
|
-
|
135
|
-
except KeyboardInterrupt:
|
136
|
-
pass
|
137
|
-
finally:
|
138
|
-
self.close()
|
139
|
-
|
140
|
-
def close(self):
|
141
|
-
if hasattr(self, 'pty'):
|
142
|
-
del self.pty
|
143
|
-
|
144
|
-
if __name__ == '__main__':
|
145
|
-
log_file = 'cmd_session.log'
|
146
|
-
try:
|
147
|
-
cmd = CmdInteractive(log_file)
|
148
|
-
cmd.interact()
|
149
|
-
except ImportError:
|
150
|
-
print("Please install pywinpty: pip install pywinpty")
|
pywebexec/cmdscript.py.ok
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
import msvcrt
|
4
|
-
import shutil
|
5
|
-
import time
|
6
|
-
import signal
|
7
|
-
from datetime import datetime
|
8
|
-
from winpty import PTY, WinptyError
|
9
|
-
|
10
|
-
class CmdInteractive:
|
11
|
-
def __init__(self, logfile=None):
|
12
|
-
self.logfile = logfile
|
13
|
-
cols, rows = shutil.get_terminal_size()
|
14
|
-
self.pty = PTY(cols, rows)
|
15
|
-
# Set up Ctrl+C handling
|
16
|
-
signal.signal(signal.SIGINT, self._handle_sigint)
|
17
|
-
self.pid = self.pty.spawn('cmd.exe')
|
18
|
-
if not self.pid:
|
19
|
-
raise RuntimeError("Failed to spawn cmd.exe")
|
20
|
-
|
21
|
-
def _handle_sigint(self, signum, frame):
|
22
|
-
"""Handle Ctrl+C by forwarding it to the child process"""
|
23
|
-
try:
|
24
|
-
self.pty.write('\x03')
|
25
|
-
except:
|
26
|
-
pass
|
27
|
-
|
28
|
-
def log(self, text, direction='>>'):
|
29
|
-
if self.logfile:
|
30
|
-
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
|
31
|
-
with open(self.logfile, 'a', encoding='utf-8') as f:
|
32
|
-
f.write(f'{timestamp} {direction} {text}')
|
33
|
-
|
34
|
-
def interact(self):
|
35
|
-
try:
|
36
|
-
while True:
|
37
|
-
try:
|
38
|
-
try:
|
39
|
-
output = self.pty.read()
|
40
|
-
if output:
|
41
|
-
if isinstance(output, str):
|
42
|
-
output = output.encode('utf-8')
|
43
|
-
sys.stdout.buffer.write(output)
|
44
|
-
sys.stdout.buffer.flush()
|
45
|
-
self.log(output.decode('utf-8', errors='replace'), '>>')
|
46
|
-
except (EOFError, WinptyError):
|
47
|
-
break
|
48
|
-
|
49
|
-
if msvcrt.kbhit():
|
50
|
-
char = msvcrt.getch()
|
51
|
-
if char == b'\x03': # Ctrl+C
|
52
|
-
# Forward Ctrl+C to child process
|
53
|
-
self.pty.write('\x03')
|
54
|
-
continue
|
55
|
-
if char == b'\x1d': # Ctrl+]
|
56
|
-
break
|
57
|
-
if isinstance(char, bytes):
|
58
|
-
char = char.decode('cp437', errors='replace')
|
59
|
-
try:
|
60
|
-
self.pty.write(char)
|
61
|
-
self.log(char, '<<')
|
62
|
-
except (EOFError, WinptyError):
|
63
|
-
break
|
64
|
-
|
65
|
-
except (IOError, OSError) as e:
|
66
|
-
if "handle is closed" in str(e):
|
67
|
-
break
|
68
|
-
raise
|
69
|
-
|
70
|
-
except KeyboardInterrupt:
|
71
|
-
pass
|
72
|
-
finally:
|
73
|
-
self.close()
|
74
|
-
|
75
|
-
def close(self):
|
76
|
-
if hasattr(self, 'pty'):
|
77
|
-
del self.pty
|
78
|
-
|
79
|
-
if __name__ == '__main__':
|
80
|
-
log_file = 'cmd_session.log'
|
81
|
-
try:
|
82
|
-
cmd = CmdInteractive(log_file)
|
83
|
-
cmd.interact()
|
84
|
-
except ImportError:
|
85
|
-
print("Please install pywinpty: pip install pywinpty")
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|