-
Notifications
You must be signed in to change notification settings - Fork 0
/
kontena.py
executable file
·139 lines (109 loc) · 4.14 KB
/
kontena.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env python3
"""
Kontena
Copyright (C) 2016 Jesus Hernandez Gormaz <jhg.jesus@gmail.com>
Under license: Affero Gnu Public License V3
"""
import sys
import os
from io import BytesIO
from zipfile import ZipFile, is_zipfile
from PyQt4.QtGui import QApplication, QTableWidget, QTableWidgetItem
from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget, QHeaderView
from PyQt4.QtCore import QUrl, QVariant, QTimer, SIGNAL
from PyQt4.QtWebKit import QWebView, QWebPage
from PyQt4.QtNetwork import QNetworkAccessManager
from PyQt4.QtNetwork import QNetworkRequest, QNetworkReply
class RequestsTable(QTableWidget):
header = ["url", "status", "content-type"]
def __init__(self):
super(RequestsTable, self).__init__()
self.setColumnCount(3)
self.setHorizontalHeaderLabels(self.header)
header = self.horizontalHeader()
header.setStretchLastSection(True)
header.setResizeMode(QHeaderView.ResizeToContents)
def update(self, data):
last_row = self.rowCount()
next_row = last_row + 1
self.setRowCount(next_row)
for col, dat in enumerate(data, 0):
if not dat:
continue
self.setItem(last_row, col, QTableWidgetItem(dat))
class KontenaFileReply(QNetworkReply):
def __init__(self, parent, url):
super(KontenaFileReply, self).__init__(parent)
# self.setHeader(
# QNetworkRequest.ContentTypeHeader,
# QVariant('text/html; charset=utf-8')
# )
QTimer.singleShot(0, self, SIGNAL("readyRead()"))
QTimer.singleShot(0, self, SIGNAL("finished()"))
self.open(self.ReadOnly | self.Unbuffered)
self.setUrl(url)
self.content = parent.kontena.read_file(str(url.path()[1:]))
self.offset = 0
def abort(self):
pass
def isSequential(self):
return True
def bytesAvailable(self):
return len(self.content)
def readData(self, maxSize):
_offset = min(maxSize, self.bytesAvailable())
_content = self.content[self.offset:_offset]
self.offset = _offset
return _content
class KontenaManager(QNetworkAccessManager):
def __init__(self, kontena, table):
QNetworkAccessManager.__init__(self)
self.finished.connect(self._finished)
self.table = table
self.kontena = kontena
def _finished(self, reply):
headers = reply.rawHeaderPairs()
headers = {str(k): str(v) for k, v in headers}
content_type = headers.get("Content-Type")
url = reply.url().toString()
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
if status is not None:
status, ok = status.toInt()
str(status)
else:
status = 'null'
self.table.update([url, status, content_type])
def createRequest(self, operation, request, data):
if request.url().scheme() == "file":
return KontenaFileReply(self, request.url())
return super(KontenaManager, self).createRequest(operation, request, data)
class KontenaApp(object):
def __init__(self, argv):
self.app = app = QApplication(argv)
self.browser = QWebView()
requests_table = RequestsTable()
manager = KontenaManager(self, requests_table)
page = QWebPage()
page.setNetworkAccessManager(manager)
self.browser.setPage(page)
grid = QGridLayout()
grid.addWidget(self.browser, 0, 0)
# grid.addWidget(requests_table, 4, 0)
self.window = QWidget()
self.window.setLayout(grid)
def open_app(self, data):
data.seek(23)
self.kontena = ZipFile(data)
def read_file(self, file_name):
return self.kontena.read(file_name)
def exe(self):
self.browser.load(QUrl('file:///index.html'))
self.window.show()
sys.exit(self.app.exec_())
if __name__ == "__main__" and len(sys.argv) >= 2:
kontena_file = os.path.abspath(sys.argv[1])
del sys.argv[1]
with open(kontena_file, 'rb') as kontena_file:
kontena = KontenaApp(sys.argv)
kontena.open_app(BytesIO(kontena_file.read()))
kontena.exe()