개정판 d8792307
issue #1650: 보안 기능 적용
Change-Id: I46afff48766fdfd215f60928cc40ba6df8d41045
App.spec | ||
---|---|---|
38 | 38 |
console=False, |
39 | 39 |
icon='HYTOS.ico', |
40 | 40 |
version='version.rc') |
41 |
|
|
41 | 42 |
coll = COLLECT(exe, |
42 | 43 |
a.binaries, |
43 | 44 |
a.zipfiles, |
44 | 45 |
a.datas, |
45 | 46 |
strip=False, |
46 | 47 |
upx=True, |
47 |
name='App') |
|
48 |
name='App') |
|
49 |
|
|
50 |
foo = Analysis(['.\\HYTOS\\HYTOS\\License.py'], |
|
51 |
pathex=['.\\HYTOS\\HYTOS', '.\\HYTOS\\HYTOS\\UI'], |
|
52 |
binaries=[], |
|
53 |
datas=[], |
|
54 |
hiddenimports=['tkinter'], |
|
55 |
hookspath=[], |
|
56 |
runtime_hooks=[], |
|
57 |
excludes=[], |
|
58 |
win_no_prefer_redirects=False, |
|
59 |
win_private_assemblies=False, |
|
60 |
cipher=block_cipher, |
|
61 |
noarchive=False) |
|
62 |
license = EXE(pyz, |
|
63 |
foo.scripts, |
|
64 |
[], |
|
65 |
exclude_binaries=True, |
|
66 |
name='License', |
|
67 |
debug=False, |
|
68 |
bootloader_ignore_signals=False, |
|
69 |
strip=False, |
|
70 |
upx=True, |
|
71 |
console=False, |
|
72 |
icon='HYTOS.ico', |
|
73 |
version='version.rc') |
|
74 |
coll = COLLECT(license, |
|
75 |
foo.binaries, |
|
76 |
foo.zipfiles, |
|
77 |
foo.datas, |
|
78 |
strip=False, |
|
79 |
upx=True, |
|
80 |
name='License') |
HYTOS/HYTOS/App.py | ||
---|---|---|
114 | 114 |
sys._excepthook = sys.excepthook |
115 | 115 |
sys.excepthook = exceptionHandler.handler |
116 | 116 |
|
117 |
app_doc_data = AppDocData.instance() |
|
118 |
configs = app_doc_data.getAppConfigs('app', 'SingleID') |
|
119 |
if not (configs and configs[0].value): |
|
120 |
dlg = QSystemInformationDialog() |
|
121 |
dlg.exec_() |
|
122 |
|
|
123 |
configs = app_doc_data.getAppConfigs('app', 'SingleID') |
|
124 |
if configs and configs[0].value: |
|
117 |
if QSystemInformationDialog.check_license_key(): |
|
118 |
app_doc_data = AppDocData.instance() |
|
125 | 119 |
app_doc_data.ex = exceptionHandler |
126 | 120 |
app._mainWnd = MainWindow.instance() |
127 | 121 |
if len(sys.argv) == 2 and os.path.exists(sys.argv[1]): |
HYTOS/HYTOS/License.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
|
|
3 |
from PyQt5 import QtCore, QtGui, QtWidgets |
|
4 |
from PyQt5.QtWidgets import * |
|
5 |
import os |
|
6 |
import sys |
|
7 |
import socket |
|
8 |
import platform |
|
9 |
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\UI') |
|
10 |
import UI.License_UI |
|
11 |
|
|
12 |
|
|
13 |
class QLicenseDialog(QDialog): |
|
14 |
SECRET_KEY = '795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m' |
|
15 |
|
|
16 |
def __init__(self): |
|
17 |
QDialog.__init__(self) |
|
18 |
|
|
19 |
self.ui = UI.License_UI.Ui_LicenseDialog() |
|
20 |
self.ui.setupUi(self) |
|
21 |
|
|
22 |
def accept(self): |
|
23 |
"""generate license key using computer name""" |
|
24 |
from SystemInformation import QSystemInformationDialog |
|
25 |
import jwt |
|
26 |
|
|
27 |
if self.ui.lineEditComputerName.text(): |
|
28 |
computer_name = self.ui.lineEditComputerName.text() |
|
29 |
dt = self.ui.dateEditExpireDate.dateTime().toPyDateTime() |
|
30 |
exp = dt.timestamp() |
|
31 |
license_key = jwt.encode({'COMPUTERNAME': computer_name, 'exp': exp}, QSystemInformationDialog.SECRET_KEY, |
|
32 |
algorithm="HS256") |
|
33 |
self.ui.lineEditLicenseKey.setText(license_key) |
|
34 |
else: |
|
35 |
QMessageBox.information(self, self.tr('Information'), self.tr('Please input computer name')) |
|
36 |
|
|
37 |
def reject(self): |
|
38 |
QDialog.reject(self) |
|
39 |
|
|
40 |
|
|
41 |
if __name__ == '__main__': |
|
42 |
from App import App |
|
43 |
|
|
44 |
app = App(sys.argv) |
|
45 |
|
|
46 |
dlg = QLicenseDialog() |
|
47 |
dlg.exec_() |
|
48 |
|
|
49 |
sys.exit(app.exec_()) |
HYTOS/HYTOS/SystemInformation.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 |
|
3 |
# Form implementation generated from reading ui file 'ProjectDialog.ui' |
|
4 |
# |
|
5 |
# Created by: PyQt5 UI code generator 5.6 |
|
6 |
# |
|
7 |
# WARNING! All changes made in this file will be lost! |
|
8 |
|
|
9 | 3 |
from PyQt5 import QtCore, QtGui, QtWidgets |
10 | 4 |
from PyQt5.QtWidgets import * |
11 | 5 |
import os |
... | ... | |
15 | 9 |
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\UI') |
16 | 10 |
from AppDocData import AppDocData, Config |
17 | 11 |
import SystemInformation_UI |
18 |
import math |
|
19 | 12 |
|
20 | 13 |
|
21 | 14 |
class QSystemInformationDialog(QDialog): |
15 |
SECRET_KEY = '795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m' |
|
16 |
|
|
22 | 17 |
def __init__(self): |
23 | 18 |
QDialog.__init__(self) |
24 | 19 |
|
25 | 20 |
self.ui = SystemInformation_UI.Ui_SystemInfoDialog() |
26 | 21 |
self.ui.setupUi(self) |
27 | 22 |
|
23 |
app_doc_data = AppDocData.instance() |
|
24 |
configs = app_doc_data.getAppConfigs('app', 'SingleID') |
|
25 |
if configs and configs[0].value: |
|
26 |
self.ui.lineEditSingleID.setText(configs[0].value) |
|
28 | 27 |
self.ui.lineEditSingleID.setFocus() |
28 |
|
|
29 | 29 |
self.ui.lineEditComputerName.setText(f"{os.environ['COMPUTERNAME']}") |
30 | 30 |
ip = self.get_my_ip_address() |
31 | 31 |
self.ui.lineEditIP.setText(f"{ip}") |
32 | 32 |
self.ui.textEditComputerInformation.setText(f"{platform.uname()}") |
33 | 33 |
|
34 |
# license key를 보여준다 |
|
35 |
configs = app_doc_data.getAppConfigs('app', 'License') |
|
36 |
if configs and configs[0].value: |
|
37 |
self.ui.lineEditLicense.setText(configs[0].value) |
|
38 |
|
|
34 | 39 |
def get_my_ip_address(self, remote_server="google.com"): |
35 | 40 |
""" Return the/a network-facing IP number for this system. """ |
36 | 41 |
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: |
37 | 42 |
s.connect((remote_server, 80)) |
38 | 43 |
return s.getsockname()[0] |
39 | 44 |
|
45 |
@staticmethod |
|
46 |
def process_running(): |
|
47 |
"""check if program is running inside samsung engineering""" |
|
48 |
import subprocess |
|
49 |
|
|
50 |
n = 0 # number of instances of the program running |
|
51 |
CREATE_NO_WINDOW = 0x08000000 |
|
52 |
prog = [line.split() for line in |
|
53 |
subprocess.check_output("tasklist", creationflags=CREATE_NO_WINDOW).splitlines()] |
|
54 |
[prog.pop(e) for e in [0, 0, 0]] # useless |
|
55 |
|
|
56 |
names = [] |
|
57 |
for task in prog: |
|
58 |
name = task[0].decode().replace('"', '').split(',')[0] |
|
59 |
names.append(name) |
|
60 |
if (name.upper() == 'EPTRAY.EXE') or (name.upper() == 'ICTRAY.EXE') or (name.upper() == 'ICTRAY64.EXE'): |
|
61 |
n = n + 1 |
|
62 |
|
|
63 |
return n >= 2 |
|
64 |
|
|
65 |
@staticmethod |
|
66 |
def check_license_key(sender=None): |
|
67 |
""" check license key with computer name """ |
|
68 |
from AppDocData import AppDocData |
|
69 |
import jwt |
|
70 |
|
|
71 |
try: |
|
72 |
if QSystemInformationDialog.process_running(): |
|
73 |
appDocData = AppDocData.instance() |
|
74 |
configs = appDocData.getAppConfigs('app', 'License') |
|
75 |
if configs and 1 == len(configs) and 3 == len(configs[0].value.split('.')): |
|
76 |
payload = jwt.decode(configs[0].value, QSystemInformationDialog.SECRET_KEY, 'HS256') |
|
77 |
if payload['COMPUTERNAME'].upper() == os.environ['COMPUTERNAME'].upper(): |
|
78 |
return True |
|
79 |
else: |
|
80 |
QMessageBox.information(None, 'Information', 'The license is invalid.') |
|
81 |
else: |
|
82 |
QMessageBox.information(None, 'Information', 'The processes are not running.') |
|
83 |
except jwt.ExpiredSignatureError: |
|
84 |
"""기간 만료""" |
|
85 |
message = f"The license has expired" |
|
86 |
QMessageBox.critical(None, 'Error', message) |
|
87 |
except jwt.InvalidSignatureError as ex: |
|
88 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
89 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
90 |
QMessageBox.critical(None, 'Error', message) |
|
91 |
except Exception as ex: |
|
92 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
93 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
94 |
QMessageBox.critical(None, 'Error', message) |
|
95 |
|
|
96 |
if not sender: |
|
97 |
dialog = QSystemInformationDialog() |
|
98 |
return QDialog.Accepted == dialog.exec_() |
|
99 |
|
|
100 |
return False |
|
101 |
|
|
40 | 102 |
def accept(self): |
41 |
""" set tag no and nozzle data """
|
|
103 |
"""save single id, computer name, license, ip"""
|
|
42 | 104 |
|
43 | 105 |
if self.ui.lineEditSingleID.text(): |
44 | 106 |
app_doc_data = AppDocData.instance() |
45 | 107 |
|
46 | 108 |
configs = [Config('app', 'SingleID', self.ui.lineEditSingleID.text()), |
47 | 109 |
Config('app', 'ComputerName', self.ui.lineEditComputerName.text()), |
110 |
Config('app', 'License', self.ui.lineEditLicense.text()), |
|
48 | 111 |
Config('app', 'IP', self.ui.lineEditIP.text())] |
49 | 112 |
app_doc_data.saveAppConfigs(configs) |
50 | 113 |
|
51 |
QDialog.accept(self) |
|
114 |
if QSystemInformationDialog.check_license_key(sender=self): |
|
115 |
QDialog.accept(self) |
|
52 | 116 |
else: |
53 | 117 |
QMessageBox.information(self, self.tr('Information'), self.tr('Please input user name')) |
54 | 118 |
|
55 | 119 |
def reject(self): |
56 | 120 |
QDialog.reject(self) |
121 |
|
|
122 |
|
|
123 |
if __name__ == '__main__': |
|
124 |
import jwt |
|
125 |
import time |
|
126 |
from datetime import datetime |
|
127 |
from time import mktime |
|
128 |
|
|
129 |
var = input('Enter Computer Name: ') |
|
130 |
dt = datetime(2021, 4, 12, 0, 0, 0) |
|
131 |
exp = dt.timestamp() |
|
132 |
# exp = iat + 3600 |
|
133 |
license = jwt.encode({'COMPUTERNAME': var, 'exp': exp}, QSystemInformationDialog.SECRET_KEY, algorithm="HS256") |
|
134 |
print(license) |
HYTOS/HYTOS/UI/License.ui | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8"?> |
|
2 |
<ui version="4.0"> |
|
3 |
<class>LicenseDialog</class> |
|
4 |
<widget class="QDialog" name="LicenseDialog"> |
|
5 |
<property name="geometry"> |
|
6 |
<rect> |
|
7 |
<x>0</x> |
|
8 |
<y>0</y> |
|
9 |
<width>643</width> |
|
10 |
<height>121</height> |
|
11 |
</rect> |
|
12 |
</property> |
|
13 |
<property name="windowTitle"> |
|
14 |
<string>License</string> |
|
15 |
</property> |
|
16 |
<property name="windowIcon"> |
|
17 |
<iconset> |
|
18 |
<normaloff>:/newPrefix/ID2.png</normaloff>:/newPrefix/ID2.png</iconset> |
|
19 |
</property> |
|
20 |
<property name="sizeGripEnabled"> |
|
21 |
<bool>true</bool> |
|
22 |
</property> |
|
23 |
<layout class="QGridLayout" name="gridLayout_2"> |
|
24 |
<item row="0" column="0"> |
|
25 |
<layout class="QGridLayout" name="gridLayout"> |
|
26 |
<item row="2" column="0"> |
|
27 |
<widget class="QLabel" name="label_2"> |
|
28 |
<property name="text"> |
|
29 |
<string>License Key : </string> |
|
30 |
</property> |
|
31 |
</widget> |
|
32 |
</item> |
|
33 |
<item row="0" column="0"> |
|
34 |
<widget class="QLabel" name="label"> |
|
35 |
<property name="text"> |
|
36 |
<string>Computer Name : </string> |
|
37 |
</property> |
|
38 |
</widget> |
|
39 |
</item> |
|
40 |
<item row="0" column="1"> |
|
41 |
<widget class="QLineEdit" name="lineEditComputerName"/> |
|
42 |
</item> |
|
43 |
<item row="2" column="1"> |
|
44 |
<widget class="QLineEdit" name="lineEditLicenseKey"> |
|
45 |
<property name="readOnly"> |
|
46 |
<bool>true</bool> |
|
47 |
</property> |
|
48 |
</widget> |
|
49 |
</item> |
|
50 |
<item row="1" column="0"> |
|
51 |
<widget class="QLabel" name="label_3"> |
|
52 |
<property name="text"> |
|
53 |
<string>Expire Date : </string> |
|
54 |
</property> |
|
55 |
</widget> |
|
56 |
</item> |
|
57 |
<item row="1" column="1"> |
|
58 |
<widget class="QDateEdit" name="dateEditExpireDate"> |
|
59 |
<property name="dateTime"> |
|
60 |
<datetime> |
|
61 |
<hour>0</hour> |
|
62 |
<minute>0</minute> |
|
63 |
<second>0</second> |
|
64 |
<year>2021</year> |
|
65 |
<month>4</month> |
|
66 |
<day>12</day> |
|
67 |
</datetime> |
|
68 |
</property> |
|
69 |
</widget> |
|
70 |
</item> |
|
71 |
</layout> |
|
72 |
</item> |
|
73 |
<item row="1" column="0"> |
|
74 |
<widget class="QDialogButtonBox" name="buttonBox"> |
|
75 |
<property name="orientation"> |
|
76 |
<enum>Qt::Horizontal</enum> |
|
77 |
</property> |
|
78 |
<property name="standardButtons"> |
|
79 |
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
|
80 |
</property> |
|
81 |
</widget> |
|
82 |
</item> |
|
83 |
</layout> |
|
84 |
</widget> |
|
85 |
<resources> |
|
86 |
<include location="../res/Resource.qrc"/> |
|
87 |
</resources> |
|
88 |
<connections> |
|
89 |
<connection> |
|
90 |
<sender>buttonBox</sender> |
|
91 |
<signal>accepted()</signal> |
|
92 |
<receiver>LicenseDialog</receiver> |
|
93 |
<slot>accept()</slot> |
|
94 |
<hints> |
|
95 |
<hint type="sourcelabel"> |
|
96 |
<x>248</x> |
|
97 |
<y>254</y> |
|
98 |
</hint> |
|
99 |
<hint type="destinationlabel"> |
|
100 |
<x>157</x> |
|
101 |
<y>274</y> |
|
102 |
</hint> |
|
103 |
</hints> |
|
104 |
</connection> |
|
105 |
<connection> |
|
106 |
<sender>buttonBox</sender> |
|
107 |
<signal>rejected()</signal> |
|
108 |
<receiver>LicenseDialog</receiver> |
|
109 |
<slot>reject()</slot> |
|
110 |
<hints> |
|
111 |
<hint type="sourcelabel"> |
|
112 |
<x>316</x> |
|
113 |
<y>260</y> |
|
114 |
</hint> |
|
115 |
<hint type="destinationlabel"> |
|
116 |
<x>286</x> |
|
117 |
<y>274</y> |
|
118 |
</hint> |
|
119 |
</hints> |
|
120 |
</connection> |
|
121 |
</connections> |
|
122 |
</ui> |
HYTOS/HYTOS/UI/License_UI.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
|
|
3 |
# Form implementation generated from reading ui file '.\HYTOS\UI\License.ui' |
|
4 |
# |
|
5 |
# Created by: PyQt5 UI code generator 5.15.2 |
|
6 |
# |
|
7 |
# WARNING: Any manual changes made to this file will be lost when pyuic5 is |
|
8 |
# run again. Do not edit this file unless you know what you are doing. |
|
9 |
|
|
10 |
|
|
11 |
from PyQt5 import QtCore, QtGui, QtWidgets |
|
12 |
|
|
13 |
|
|
14 |
class Ui_LicenseDialog(object): |
|
15 |
def setupUi(self, LicenseDialog): |
|
16 |
LicenseDialog.setObjectName("LicenseDialog") |
|
17 |
LicenseDialog.resize(643, 121) |
|
18 |
icon = QtGui.QIcon() |
|
19 |
icon.addPixmap(QtGui.QPixmap(":/newPrefix/ID2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
|
20 |
LicenseDialog.setWindowIcon(icon) |
|
21 |
LicenseDialog.setSizeGripEnabled(True) |
|
22 |
self.gridLayout_2 = QtWidgets.QGridLayout(LicenseDialog) |
|
23 |
self.gridLayout_2.setObjectName("gridLayout_2") |
|
24 |
self.gridLayout = QtWidgets.QGridLayout() |
|
25 |
self.gridLayout.setObjectName("gridLayout") |
|
26 |
self.label_2 = QtWidgets.QLabel(LicenseDialog) |
|
27 |
self.label_2.setObjectName("label_2") |
|
28 |
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) |
|
29 |
self.label = QtWidgets.QLabel(LicenseDialog) |
|
30 |
self.label.setObjectName("label") |
|
31 |
self.gridLayout.addWidget(self.label, 0, 0, 1, 1) |
|
32 |
self.lineEditComputerName = QtWidgets.QLineEdit(LicenseDialog) |
|
33 |
self.lineEditComputerName.setObjectName("lineEditComputerName") |
|
34 |
self.gridLayout.addWidget(self.lineEditComputerName, 0, 1, 1, 1) |
|
35 |
self.lineEditLicenseKey = QtWidgets.QLineEdit(LicenseDialog) |
|
36 |
self.lineEditLicenseKey.setReadOnly(True) |
|
37 |
self.lineEditLicenseKey.setObjectName("lineEditLicenseKey") |
|
38 |
self.gridLayout.addWidget(self.lineEditLicenseKey, 2, 1, 1, 1) |
|
39 |
self.label_3 = QtWidgets.QLabel(LicenseDialog) |
|
40 |
self.label_3.setObjectName("label_3") |
|
41 |
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) |
|
42 |
self.dateEditExpireDate = QtWidgets.QDateEdit(LicenseDialog) |
|
43 |
self.dateEditExpireDate.setDateTime(QtCore.QDateTime(QtCore.QDate(2021, 4, 12), QtCore.QTime(0, 0, 0))) |
|
44 |
self.dateEditExpireDate.setObjectName("dateEditExpireDate") |
|
45 |
self.gridLayout.addWidget(self.dateEditExpireDate, 1, 1, 1, 1) |
|
46 |
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) |
|
47 |
self.buttonBox = QtWidgets.QDialogButtonBox(LicenseDialog) |
|
48 |
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) |
|
49 |
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) |
|
50 |
self.buttonBox.setObjectName("buttonBox") |
|
51 |
self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1) |
|
52 |
|
|
53 |
self.retranslateUi(LicenseDialog) |
|
54 |
self.buttonBox.accepted.connect(LicenseDialog.accept) |
|
55 |
self.buttonBox.rejected.connect(LicenseDialog.reject) |
|
56 |
QtCore.QMetaObject.connectSlotsByName(LicenseDialog) |
|
57 |
|
|
58 |
def retranslateUi(self, LicenseDialog): |
|
59 |
_translate = QtCore.QCoreApplication.translate |
|
60 |
LicenseDialog.setWindowTitle(_translate("LicenseDialog", "License")) |
|
61 |
self.label_2.setText(_translate("LicenseDialog", "License Key : ")) |
|
62 |
self.label.setText(_translate("LicenseDialog", "Computer Name : ")) |
|
63 |
self.label_3.setText(_translate("LicenseDialog", "Expire Date : ")) |
|
64 |
import Resource_rc |
HYTOS/HYTOS/UI/SystemInformation.ui | ||
---|---|---|
31 | 31 |
<layout class="QGridLayout" name="gridLayout_3"> |
32 | 32 |
<item row="0" column="0"> |
33 | 33 |
<layout class="QGridLayout" name="gridLayout_2"> |
34 |
<item row="1" column="1"> |
|
35 |
<widget class="QLineEdit" name="lineEditComputerName"> |
|
36 |
<property name="readOnly"> |
|
37 |
<bool>true</bool> |
|
34 |
<item row="0" column="1"> |
|
35 |
<widget class="QLineEdit" name="lineEditSingleID"/> |
|
36 |
</item> |
|
37 |
<item row="4" column="0"> |
|
38 |
<widget class="QLabel" name="label_4"> |
|
39 |
<property name="text"> |
|
40 |
<string>Computer Information : </string> |
|
38 | 41 |
</property> |
39 | 42 |
</widget> |
40 | 43 |
</item> |
41 |
<item row="2" column="1">
|
|
42 |
<widget class="QLineEdit" name="lineEditIP">
|
|
44 |
<item row="4" column="1">
|
|
45 |
<widget class="QTextEdit" name="textEditComputerInformation">
|
|
43 | 46 |
<property name="readOnly"> |
44 | 47 |
<bool>true</bool> |
45 | 48 |
</property> |
46 | 49 |
</widget> |
47 | 50 |
</item> |
48 |
<item row="1" column="0"> |
|
49 |
<widget class="QLabel" name="label_3"> |
|
50 |
<property name="text"> |
|
51 |
<string>Computer Name : </string> |
|
52 |
</property> |
|
53 |
</widget> |
|
54 |
</item> |
|
55 | 51 |
<item row="0" column="0"> |
56 | 52 |
<widget class="QLabel" name="label"> |
57 | 53 |
<property name="text"> |
... | ... | |
59 | 55 |
</property> |
60 | 56 |
</widget> |
61 | 57 |
</item> |
62 |
<item row="2" column="0">
|
|
58 |
<item row="3" column="0">
|
|
63 | 59 |
<widget class="QLabel" name="label_2"> |
64 | 60 |
<property name="text"> |
65 | 61 |
<string>IP : </string> |
66 | 62 |
</property> |
67 | 63 |
</widget> |
68 | 64 |
</item> |
69 |
<item row="0" column="1"> |
|
70 |
<widget class="QLineEdit" name="lineEditSingleID"/> |
|
71 |
</item> |
|
72 |
<item row="3" column="0"> |
|
73 |
<widget class="QLabel" name="label_4"> |
|
65 |
<item row="1" column="0"> |
|
66 |
<widget class="QLabel" name="label_3"> |
|
74 | 67 |
<property name="text"> |
75 |
<string>Computer Information : </string>
|
|
68 |
<string>Computer Name : </string>
|
|
76 | 69 |
</property> |
77 | 70 |
</widget> |
78 | 71 |
</item> |
79 | 72 |
<item row="3" column="1"> |
80 |
<widget class="QTextEdit" name="textEditComputerInformation">
|
|
73 |
<widget class="QLineEdit" name="lineEditIP">
|
|
81 | 74 |
<property name="readOnly"> |
82 | 75 |
<bool>true</bool> |
83 | 76 |
</property> |
84 | 77 |
</widget> |
85 | 78 |
</item> |
79 |
<item row="1" column="1"> |
|
80 |
<widget class="QLineEdit" name="lineEditComputerName"> |
|
81 |
<property name="readOnly"> |
|
82 |
<bool>true</bool> |
|
83 |
</property> |
|
84 |
</widget> |
|
85 |
</item> |
|
86 |
<item row="2" column="0"> |
|
87 |
<widget class="QLabel" name="label_5"> |
|
88 |
<property name="text"> |
|
89 |
<string>License : </string> |
|
90 |
</property> |
|
91 |
</widget> |
|
92 |
</item> |
|
93 |
<item row="2" column="1"> |
|
94 |
<widget class="QLineEdit" name="lineEditLicense"/> |
|
95 |
</item> |
|
86 | 96 |
</layout> |
87 | 97 |
</item> |
88 | 98 |
</layout> |
HYTOS/HYTOS/UI/SystemInformation_UI.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 |
|
3 |
# Form implementation generated from reading ui file '.\UI\SystemInformation.ui' |
|
3 |
# Form implementation generated from reading ui file '.\HYTOS\UI\SystemInformation.ui'
|
|
4 | 4 |
# |
5 |
# Created by: PyQt5 UI code generator 5.13.0
|
|
5 |
# Created by: PyQt5 UI code generator 5.15.2
|
|
6 | 6 |
# |
7 |
# WARNING! All changes made in this file will be lost! |
|
7 |
# WARNING: Any manual changes made to this file will be lost when pyuic5 is |
|
8 |
# run again. Do not edit this file unless you know what you are doing. |
|
8 | 9 |
|
9 | 10 |
|
10 | 11 |
from PyQt5 import QtCore, QtGui, QtWidgets |
... | ... | |
28 | 29 |
self.gridLayout_3.setObjectName("gridLayout_3") |
29 | 30 |
self.gridLayout_2 = QtWidgets.QGridLayout() |
30 | 31 |
self.gridLayout_2.setObjectName("gridLayout_2") |
31 |
self.lineEditComputerName = QtWidgets.QLineEdit(self.groupBox) |
|
32 |
self.lineEditComputerName.setReadOnly(True) |
|
33 |
self.lineEditComputerName.setObjectName("lineEditComputerName") |
|
34 |
self.gridLayout_2.addWidget(self.lineEditComputerName, 1, 1, 1, 1) |
|
35 |
self.lineEditIP = QtWidgets.QLineEdit(self.groupBox) |
|
36 |
self.lineEditIP.setReadOnly(True) |
|
37 |
self.lineEditIP.setObjectName("lineEditIP") |
|
38 |
self.gridLayout_2.addWidget(self.lineEditIP, 2, 1, 1, 1) |
|
39 |
self.label_3 = QtWidgets.QLabel(self.groupBox) |
|
40 |
self.label_3.setObjectName("label_3") |
|
41 |
self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1) |
|
42 |
self.label = QtWidgets.QLabel(self.groupBox) |
|
43 |
self.label.setObjectName("label") |
|
44 |
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) |
|
45 |
self.label_2 = QtWidgets.QLabel(self.groupBox) |
|
46 |
self.label_2.setObjectName("label_2") |
|
47 |
self.gridLayout_2.addWidget(self.label_2, 2, 0, 1, 1) |
|
48 | 32 |
self.lineEditSingleID = QtWidgets.QLineEdit(self.groupBox) |
49 | 33 |
self.lineEditSingleID.setObjectName("lineEditSingleID") |
50 | 34 |
self.gridLayout_2.addWidget(self.lineEditSingleID, 0, 1, 1, 1) |
51 | 35 |
self.label_4 = QtWidgets.QLabel(self.groupBox) |
52 | 36 |
self.label_4.setObjectName("label_4") |
53 |
self.gridLayout_2.addWidget(self.label_4, 3, 0, 1, 1)
|
|
37 |
self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
|
|
54 | 38 |
self.textEditComputerInformation = QtWidgets.QTextEdit(self.groupBox) |
55 | 39 |
self.textEditComputerInformation.setReadOnly(True) |
56 | 40 |
self.textEditComputerInformation.setObjectName("textEditComputerInformation") |
57 |
self.gridLayout_2.addWidget(self.textEditComputerInformation, 3, 1, 1, 1) |
|
41 |
self.gridLayout_2.addWidget(self.textEditComputerInformation, 4, 1, 1, 1) |
|
42 |
self.label = QtWidgets.QLabel(self.groupBox) |
|
43 |
self.label.setObjectName("label") |
|
44 |
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) |
|
45 |
self.label_2 = QtWidgets.QLabel(self.groupBox) |
|
46 |
self.label_2.setObjectName("label_2") |
|
47 |
self.gridLayout_2.addWidget(self.label_2, 3, 0, 1, 1) |
|
48 |
self.label_3 = QtWidgets.QLabel(self.groupBox) |
|
49 |
self.label_3.setObjectName("label_3") |
|
50 |
self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1) |
|
51 |
self.lineEditIP = QtWidgets.QLineEdit(self.groupBox) |
|
52 |
self.lineEditIP.setReadOnly(True) |
|
53 |
self.lineEditIP.setObjectName("lineEditIP") |
|
54 |
self.gridLayout_2.addWidget(self.lineEditIP, 3, 1, 1, 1) |
|
55 |
self.lineEditComputerName = QtWidgets.QLineEdit(self.groupBox) |
|
56 |
self.lineEditComputerName.setReadOnly(True) |
|
57 |
self.lineEditComputerName.setObjectName("lineEditComputerName") |
|
58 |
self.gridLayout_2.addWidget(self.lineEditComputerName, 1, 1, 1, 1) |
|
59 |
self.label_5 = QtWidgets.QLabel(self.groupBox) |
|
60 |
self.label_5.setObjectName("label_5") |
|
61 |
self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1) |
|
62 |
self.lineEditLicense = QtWidgets.QLineEdit(self.groupBox) |
|
63 |
self.lineEditLicense.setObjectName("lineEditLicense") |
|
64 |
self.gridLayout_2.addWidget(self.lineEditLicense, 2, 1, 1, 1) |
|
58 | 65 |
self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 1) |
59 | 66 |
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) |
60 | 67 |
self.buttonBox = QtWidgets.QDialogButtonBox(SystemInfoDialog) |
... | ... | |
72 | 79 |
_translate = QtCore.QCoreApplication.translate |
73 | 80 |
SystemInfoDialog.setWindowTitle(_translate("SystemInfoDialog", "System Information")) |
74 | 81 |
self.groupBox.setTitle(_translate("SystemInfoDialog", "System Information")) |
75 |
self.label_3.setText(_translate("SystemInfoDialog", "Computer Name : "))
|
|
82 |
self.label_4.setText(_translate("SystemInfoDialog", "Computer Information : "))
|
|
76 | 83 |
self.label.setText(_translate("SystemInfoDialog", "Single ID : ")) |
77 | 84 |
self.label_2.setText(_translate("SystemInfoDialog", "IP : ")) |
78 |
self.label_4.setText(_translate("SystemInfoDialog", "Computer Information : ")) |
|
85 |
self.label_3.setText(_translate("SystemInfoDialog", "Computer Name : ")) |
|
86 |
self.label_5.setText(_translate("SystemInfoDialog", "License : ")) |
|
79 | 87 |
import Resource_rc |
HYTOS_html.template | ||
---|---|---|
137 | 137 |
<td>PROGRAM</td> |
138 | 138 |
</tr> |
139 | 139 |
<tr> |
140 |
<td><a href="http://www.devdoftech.co.kr:8081/artifactory/${project.name}/Setup/${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi">${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi </a></td>
|
|
140 |
<td><a href="http://www.devdoftech.co.kr:8081/artifactory/${project.name}/Setup/<%= build.getEnvVars()["OUTPUT_FILE_NAME"]-build.getEnvVars()["BUILD_NAME"] %>x86.msi">${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi </a></td>
|
|
141 | 141 |
</tr> |
142 | 142 |
</table> |
143 | 143 |
<% } %> |
requirements.txt | ||
---|---|---|
2 | 2 |
Pillow==8.1.0 |
3 | 3 |
pyinstaller==4.1 |
4 | 4 |
PyQt5==5.15.2 |
5 |
Shapely==1.7.1 |
|
5 |
Shapely==1.7.1 |
|
6 |
PyJWT==2.0.1 |
내보내기 Unified diff