-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmw2.pyw
More file actions
298 lines (254 loc) · 10.3 KB
/
mw2.pyw
File metadata and controls
298 lines (254 loc) · 10.3 KB
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# Import the compiled UI module
import os, sys, platform
from PyQt4 import QtCore
from PyQt4.QtGui import QMainWindow, QDialog, QApplication, QMessageBox, QTreeWidgetItem, QFont, QFontMetrics, QColor, QIcon
from PyQt4.Qsci import QsciScintilla, QsciScintillaBase, QsciLexerTCL
from ui.Ui_F5Editor1 import Ui_mw_F5Editor
from ui.Ui_connect import Ui_dia_connect
from ui.Ui_createscript import Ui_dia_createscript
from ui.Ui_datagroups import Ui_dia_datagroups
import pycontrol.pycontrol as pc
__version__ = '0.0.1'
__author__ = 'j.rahm@f5.com'
ltm_rules = []
gtm_rules = []
ltm, gtm, dg, sysinfo = '','','',''
# Create a class for our main window
class Main(QMainWindow, Ui_mw_F5Editor):
def __init__(self):
QMainWindow.__init__(self)
# This is always the same
self.setupUi(self)
# QActions on Editor Menubar / Toolbar
self.actionConnect.triggered.connect(self.connectDialog)
self.actionNew.triggered.connect(self.newDialog)
self.actionSave.triggered.connect(self.saveRule)
self.actionRefresh.triggered.connect(self.refreshRules)
self.actionAbout_F5_Editor.triggered.connect(self.about)
self.actionData_Group_Editor.triggered.connect(self.dgDialog)
self.treeWidget_iRulesList.itemClicked.connect(self.displayRule)
self.actionCheck_Syntax.triggered.connect(self.checkSyntax)
self.textEdit_ScriptCanvas.clear()
# define the font
font = QFont()
font.setFamily('Consolas')
font.setFixedPitch(True)
font.setPointSize(9)
# font metrics will help build margins
fm = QFontMetrics(font)
# set default font for lines / linenumbers
self.textEdit_ScriptCanvas.setFont(font)
self.textEdit_ScriptCanvas.setMarginsFont(font)
# line numbers
self.textEdit_ScriptCanvas.setMarginWidth(0, fm.width('0000') + 5)
self.textEdit_ScriptCanvas.setMarginLineNumbers(0, True)
# Edge Mode
self.textEdit_ScriptCanvas.setEdgeMode(QsciScintilla.EdgeLine)
self.textEdit_ScriptCanvas.setEdgeColumn(80)
self.textEdit_ScriptCanvas.setEdgeColor(QColor('#FF0000'))
# folding
self.textEdit_ScriptCanvas.setFolding(QsciScintilla.BoxedTreeFoldStyle)
# Braces Matching
self.textEdit_ScriptCanvas.setBraceMatching(QsciScintilla.SloppyBraceMatch)
# active line color
self.textEdit_ScriptCanvas.setCaretLineVisible(True)
self.textEdit_ScriptCanvas.setCaretLineBackgroundColor(QColor('#CCCCCC'))
#margins colors
# line number colors
self.textEdit_ScriptCanvas.setMarginsBackgroundColor(QColor('#000000'))
self.textEdit_ScriptCanvas.setMarginsForegroundColor(QColor('#FFFFFF'))
# fold colors
self.textEdit_ScriptCanvas.setFoldMarginColors(QColor('#99CC66'), QColor('#333300'))
# lexer
lex = QsciLexerTCL()
lex.setDefaultFont(font)
self.textEdit_ScriptCanvas.setLexer(lex)
self.textEdit_ScriptCanvas.setText('\n\n\n\t\tAre you ready to iRule?')
def displayRule(self, item):
self.textEdit_ScriptCanvas.clear()
for i in ltm_rules:
if i.rule_name == item.text(0):
self.textEdit_ScriptCanvas.setText(i.rule_definition)
for i in gtm_rules:
if i.rule_name == item.text(0):
self.textEdit_ScriptCanvas.setText(i.rule_definition)
def saveRule(self):
cur_ruleName = self.treeWidget_iRulesList.currentItem()
cur_module = cur_ruleName.parent()
cur_ruleContents = unicode(self.textEdit_ScriptCanvas.text())
if cur_module.text(0) == 'Global Traffic Manager':
ruledef = gtm.typefactory.create('GlobalLB.Rule.RuleDefinition')
ruledef.rule_name = cur_ruleName.text(0)
ruledef.rule_definition = cur_ruleContents
try:
gtm.modify_rule(rules = [ruledef])
self.labelSyntaxCheckResults.setText('Rule Saved.')
except Exception, e:
gre_qmb = QMessageBox()
QMessageBox.about(gre_qmb, 'Error', '''<b>Save Error</b><p>%s''' % e)
if cur_module.text(0) == 'Local Traffic Manager':
ruledef = ltm.typefactory.create('LocalLB.Rule.RuleDefinition')
ruledef.rule_name = cur_ruleName.text(0)
ruledef.rule_definition = cur_ruleContents
try:
ltm.modify_rule(rules = [ruledef])
self.labelSyntaxCheckResults.setText('Rule Saved.')
except Exception, e:
lre_qmb = QMessageBox()
QMessageBox.about(lre_qmb, 'Error', '''<b>Save Error</b><p>%s''' % e)
def checkSyntax(self):
cur_ruleName = self.treeWidget_iRulesList.currentItem()
cur_module = cur_ruleName.parent()
cur_ruleContents = unicode(self.textEdit_ScriptCanvas.text())
if cur_module.text(0) == 'Global Traffic Manager':
ruledef = gtm.typefactory.create('GlobalLB.Rule.RuleDefinition')
ruledef.rule_name = 'checkSyntax_tmpRule'
ruledef.rule_definition = cur_ruleContents
try:
gtm.create(rules = [ruledef])
gtm.delete_rule(rule_names = ['checkSyntax_tmpRule'])
gre_qmb = QMessageBox()
QMessageBox.about(gre_qmb, 'Syntax Check', '<b>iRule Syntax OK</b>')
except Exception, e:
gre_qmb = QMessageBox()
QMessageBox.about(gre_qmb, 'Error', '''<b>Save Error</b><p>%s''' % e)
if cur_module.text(0) == 'Local Traffic Manager':
ruledef = ltm.typefactory.create('LocalLB.Rule.RuleDefinition')
ruledef.rule_name = 'checkSyntax_tmpRule'
ruledef.rule_definition = cur_ruleContents
try:
ltm.create(rules = [ruledef])
ltm.delete_rule(rule_names = ['checkSyntax_tmpRule'])
lre_qmb = QMessageBox()
QMessageBox.about(lre_qmb, 'Syntax Check', 'iRule Syntax OK')
except Exception, e:
lre_qmb = QMessageBox()
QMessageBox.about(lre_qmb, 'Error', '''<b>Save Error</b><p>%s''' % e)
def connectDialog(self):
global ltm, gtm, dg, sysinfo
if self.actionConnect.isChecked():
self.connectdlg = ConnectDlg()
self.connectdlg.exec_()
if self.connectdlg.result() == QDialog.Accepted:
ltm, gtm, dg, sysinfo = self.get_objects(self.connectdlg.host, self.connectdlg.uname, self.connectdlg.upass)
self.loadData()
self.labelSyntaxCheckResults.clear()
self.labelSyntaxCheckResults.setText('Connected to %s' % self.connectdlg.host)
self.actionConnect.setIcon(QIcon('icons/default/ToolbarDisconnect.png'))
self.actionConnect.setText('Disconnect')
else:
self.labelSyntaxCheckResults.setText('Disconnected')
self.actionConnect.setIcon(QIcon('icons/default/ToolbarConnect.png'))
self.actionConnect.setText('Disconnect')
self.textEdit_ScriptCanvas.clear()
self.treeWidget_iRulesList.clear()
ltm, gtm, dq, sysinfo = '','','',''
def refreshRules(self):
if self.actionConnect.isChecked():
self.labelSyntaxCheckResults.setText('Refreshing...')
self.textEdit_ScriptCanvas.clear()
self.treeWidget_iRulesList.clear()
self.loadData()
self.labelSyntaxCheckResults.setText('Rules refreshed.')
def get_objects(self, host, uname, upass):
try:
b = pc.BIGIP(
hostname = host,
username = uname,
password = upass,
fromurl = True,
wsdls = ['LocalLB.Rule', 'LocalLB.Class', 'GlobalLB.Rule', 'System.SystemInfo'])
global ltm, gtm, dg, sysinfo
ltm = b.LocalLB.Rule
gtm = b.GlobalLB.Rule
dg = b.LocalLB.Class
sysinfo = b.System.SystemInfo
return ltm, gtm, dg, sysinfo
except Exception, e:
qmb = QMessageBox()
QMessageBox.about(qmb, 'Error', '''<b>Connection Error</b><p>%s''' % e)
def loadData(self):
self.treeWidget_iRulesList.clear()
self.treeWidget_iRulesList.setColumnCount(1)
self.treeWidget_iRulesList.setHeaderLabels(["Rules"])
self.treeWidget_iRulesList.setItemsExpandable(True)
# Get LTM & GTM iRules
global ltm_rules, gtm_rules
ltm_rules = ltm.query_all_rules()
gtm_rules = gtm.query_all_rules()
# Get Datagroups
#ltm_dg_addr = dg.get_address_class(class_names = dg.get_address_class_list())
#ltm_dg_str = dg.get_string_class(class_names = dg.get_string_class_list())
#ltm_dg_int = dg.get_value_class(class_names = dg.get_value_class_list())
#ltm_dg_ext = dg.get_external_class_list()
# Get System Info
ltm_sysinfo = sysinfo.get_system_information()
hdr = QTreeWidgetItem(['Global Traffic Manager'])
self.treeWidget_iRulesList.addTopLevelItem(hdr)
self.treeWidget_iRulesList.expandItem(hdr)
i = []
for i in [x.rule_name for x in gtm_rules]:
rule = QTreeWidgetItem(hdr, [i])
self.treeWidget_iRulesList.addTopLevelItem(rule)
hdr = QTreeWidgetItem(['Local Traffic Manager'])
self.treeWidget_iRulesList.addTopLevelItem(hdr)
self.treeWidget_iRulesList.expandItem(hdr)
i = []
for i in [x.rule_name for x in ltm_rules]:
rule = QTreeWidgetItem(hdr, [i])
self.treeWidget_iRulesList.addTopLevelItem(rule)
self.treeWidget_iRulesList.resizeColumnToContents(0)
def newDialog(self):
self.newdlg = NewDlg()
self.newdlg.exec_()
if self.newdlg.result() == QDialog.Accepted:
print "%s, %s" % (self.newdlg.le_scriptname.text(), self.newdlg.cb_scripttype.itemText(0))
def dgDialog(self):
self.dgdlg = DgDlg()
self.dgdlg.show()
def about(self):
QMessageBox.about(self, "About F5 Editor",
"""<b> F5 Editor </b> v %s
<p>The Initial Developer of the Original
Code is F5 Networks, Inc. Seattle, WA, USA.
Portions created by F5 are Copyright (C) 2011
F5 Networks, Inc. All Rights Reserved. iControl
(TM), BIG-IP and iRules are registered trademarks
or trademarks of F5 Networks, Inc. in the U.S.
and certain other countries. F5 Networks'
trademarks may not be used in connection with any
product or service except as permitted in writing
by F5. Released in accordance with GPL v3 or later
- NO WARRANTIES!<p>Python %s - pyControl %s - on %s""" % \
(__version__, platform.python_version(), pc.__version__, platform.system()))
class ConnectDlg(QDialog, Ui_dia_connect):
def __init__(self):
QDialog.__init__(self)
self.setupUi(self)
self.pb_ok.clicked.connect(self.button_click)
self.pb_cancel.clicked.connect(self.reject)
def button_click(self):
self.host = unicode(self.cb_hostname.currentText())
self.uname = unicode(self.le_username.text())
self.upass = unicode(self.le_username.text())
class NewDlg(QDialog, Ui_dia_createscript):
def __init__(self):
QDialog.__init__(self)
self.setupUi(self)
self.pb_createscript_ok.clicked.connect(self.accept)
self.pb_createscript_cancel.clicked.connect(self.reject)
class DgDlg(QDialog, Ui_dia_datagroups):
def __init__(self):
QDialog.__init__(self)
self.setupUi(self)
self.pb_dg_ok.clicked.connect(self.accept)
def main():
# Again, this is boilerplate, it's going to be the same on
# almost every app you write
app = QApplication(sys.argv)
window=Main()
window.show()
# It's exec_ because exec is a reserved word in Python
sys.exit(app.exec_())
if __name__ == "__main__":
main()