69
74
self.button_location = wtree.get_widget("button_location")
70
75
self.treeview_domain = wtree.get_widget("treeview_domain")
71
76
self.checkbutton_hosts = wtree.get_widget("checkbutton_hosts")
77
self.label_hosts = wtree.get_widget("label_hosts")
72
78
self.toolbutton_domain_add = wtree.get_widget("toolbutton_domain_add")
73
79
self.toolbutton_domain_edit = wtree.get_widget("toolbutton_domain_edit")
74
80
self.toolbutton_domain_delete = wtree.get_widget("toolbutton_domain_delete")
81
self.combobox_vhost_backups = wtree.get_widget("combobox_vhost_backups")
75
82
self.notebook = wtree.get_widget("notebook")
76
83
self.button_save = wtree.get_widget("button_save")
77
84
self.error_area = wtree.get_widget("error_area")
85
self.label_path = wtree.get_widget("label_path")
86
self.message_text = wtree.get_widget("message_text")
87
self.error_area = wtree.get_widget("error_area")
88
self.treeview_menu = wtree.get_widget("treeview_menu")
79
"on_toolbutton_domain_add_clicked" : self.on_toolbutton_domain_add_clicked,
80
"on_toolbutton_domain_edit_clicked" : self.on_toolbutton_domain_edit_clicked,
81
"on_toolbutton_domain_delete_clicked" : self.on_toolbutton_domain_delete_clicked,
90
"on_toolbutton_domain_add_clicked" : self.on_toolbutton_domain_add_clicked,
91
"on_toolbutton_domain_edit_clicked" : self.on_toolbutton_domain_edit_clicked,
92
"on_toolbutton_domain_delete_clicked": self.on_toolbutton_domain_delete_clicked,
82
93
"on_button_save_clicked" : self.on_button_save_clicked,
83
94
"on_button_cancel_clicked" : self.on_button_cancel_clicked,
84
"on_entry_domain_changed" : self.on_entry_domain_changed,
95
"on_entry_domain_changed" : self.on_entry_domain_changed,
85
96
"on_button_location_clicked" : self.on_button_location_clicked,
86
"on_entry_domain_focus_out_event" : self.on_entry_domain_focus_out_event,
87
"on_button_location_clear_clicked" : self.on_button_location_clear_clicked
97
"on_entry_domain_focus_out_event" : self.on_entry_domain_focus_out_event,
98
"on_button_location_clear_clicked" : self.on_button_location_clear_clicked,
99
"on_button_restore_version_clicked" : self.on_button_restore_version_clicked,
100
"on_linkbutton_documentation_clicked" : self.on_linkbutton_documentation_clicked,
101
"on_notebook_switch_page" : self.on_notebook_switch_page,
102
"on_treeview_menu_cursor_changed" : self.on_treeview_menu_cursor_changed,
103
"on_button_error_close_clicked" : self.on_button_error_close_clicked
89
105
wtree.signal_autoconnect(signals)
106
# add on destroy to quit loop
107
self.window.connect("destroy", self.on_destroy)
109
self.combobox_vhost_backups.set_active(0)
91
111
self.text_view_vhost_source = GuiUtils.new_apache_sourceview()
92
112
wtree.get_widget( 'text_view_vhost_source_area' ).add( self.text_view_vhost_source )
93
self.text_view_vhost_source.set_editable( False )
94
113
self.text_view_vhost_source.show()
96
self.notebook.get_nth_page( 1 ).hide()
97
self.notebook.get_nth_page( 2 ).hide()
99
# add on destroy to quit loop
100
self.window.connect("destroy", self.on_destroy)
103
116
column = gtk.TreeViewColumn(('Domains'))
113
126
GuiUtils.style_as_tooltip( self.error_area )
114
127
self.on_entry_domain_changed()
123
site = VirtualHostModel( "", self.parent.plugin_manager)
131
column = gtk.TreeViewColumn(('Icon'))
132
column.set_spacing(4)
133
cell = gtk.CellRendererPixbuf()
134
column.pack_start(cell, expand=False)
135
column.set_attributes(cell, pixbuf=0)
136
self.treeview_menu.append_column(column)
138
column = gtk.TreeViewColumn(('Title'))
139
column.set_spacing(4)
140
cell = gtk.CellRendererText()
141
column.pack_start(cell, True)
142
column.set_attributes(cell, markup=1)
143
self.treeview_menu.append_column(column)
145
store = gtk.ListStore(gtk.gdk.Pixbuf, str, int)
146
self.treeview_menu.set_model(store)
148
icon_theme = gtk.icon_theme_get_default()
149
store.append((icon_theme.lookup_icon("applications-internet", 24, 0).load_icon(), "Domain", 0))
151
# init enabled plugins
125
152
for plugin in self.parent.plugin_manager.plugins:
127
154
if plugin.is_enabled():
128
plugin.load_vhost_properties(self.notebook, site.data)
155
content, title, pixbuf = plugin.init_vhost_properties()
156
tab_count = self.notebook.get_n_pages() - 1
157
plugin._tab_number = self.notebook.insert_page(content, gtk.Label(title), tab_count)
158
store.append((pixbuf, title, tab_count))
129
160
self.plugins.append(plugin)
130
161
except Exception:
131
162
traceback.print_exc(file=sys.stdout)
164
store.append((icon_theme.load_icon(gtk.STOCK_EDIT, 24, 0), "Definition File", self.notebook.get_n_pages() - 1))
166
select = self.treeview_menu.get_selection()
167
select.select_path(0)
170
self.__previous_active_tab = 0
172
self.accel_group = gtk.AccelGroup()
173
self.window.add_accel_group(self.accel_group)
175
self.button_save.add_accelerator("clicked", self.accel_group, 13, 0, 0)
177
self.vhost = VirtualHostModel( "")
179
def on_treeview_menu_cursor_changed(self, widget):
180
model, iter = self.treeview_menu.get_selection().get_selected()
182
page_number = model.get_value(iter, 2)
187
if self.__previous_active_tab == self.notebook.get_n_pages() - 1:
188
result, error = self.save_edit_tab()
189
elif self.__previous_active_tab == 0:
190
self.save_domain_tab()
193
result, error = self.save_plugin_tab(self.__previous_active_tab)
197
self.show_error("Sorry can not change tabs, " + error)
198
select = self.treeview_menu.get_selection()
199
select.select_path((self.__previous_active_tab))
205
if page_number == self.notebook.get_n_pages() - 1:
207
elif page_number == 0:
208
self.load_domain_tab()
210
self.update_plugin_tab(page_number)
212
self.window.set_title("VirtualHost Editor - " + self.vhost.get_server_name() )
214
self.__previous_active_tab = page_number
215
self.notebook.set_current_page(page_number)
217
def on_notebook_switch_page(self, notebook, page, page_num):
220
def on_linkbutton_documentation_clicked(self, widget):
221
Desktop.open_url( widget.get_uri() )
223
def on_button_restore_version_clicked(self, widget):
224
buf = self.text_view_vhost_source.get_buffer()
225
if buf.get_modified():
226
md = gtk.MessageDialog(self.window, flags=0, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK_CANCEL, message_format="Are you sure, you will lose all your current changes")
229
if result != gtk.RESPONSE_OK:
232
selected = self.combobox_vhost_backups.get_active()
235
buf.set_text( self.vhost.get_source() )
237
value = self.combobox_vhost_backups.get_active_text()[7:]
238
buf.set_text( self.vhost.get_source_version(value) )
240
buf.set_modified(False)
249
#this should never happen since now we initialize an empty VirtualHostModel
251
raise UnexpectedCase, "Internal error, existing VirtualHostModel expected"
136
def load (self, name ):
137
self.vhost = VirtualHostModel( name )
138
self.create_new = False
140
self.vhost.load(False, self.parent.plugin_manager)
141
print self.vhost.data
142
#self._get( 'has_www' ).set_active( site.data[ 'has_www' ] )
143
server_name = self.vhost.data[ 'ServerName' ]
144
if ( server_name != None ):
145
self.entry_domain.set_text( server_name )
146
document_root = self.vhost.data[ 'DocumentRoot' ]
147
if ( document_root != None ):
148
self.entry_location.set_text( document_root )
149
server_alias = self.vhost.data[ 'ServerAlias' ]
150
if ( server_alias != None ):
151
for domain in server_alias:
152
self.treeview_domain_store.append((domain, None))
153
print self.vhost.data
154
except "VhostUnparsable":
157
buf = self.text_view_vhost_source.get_buffer()
158
buf.set_text( self.vhost.get_source() )
259
def load (self, vhost ):
262
#hosts tooggling not supported on editing
263
#self.checkbutton_hosts.hide()
264
#self.label_hosts.hide()
266
self.checkbutton_hosts.set_active(True)
267
self.load_domain_tab()
269
for file in self.vhost.get_backup_files():
270
self.combobox_vhost_backups.append_text("Backup " + file[0][-21:-4])
272
self.label_path.set_text( self.vhost.get_source_filename() )
273
self.on_entry_domain_changed()
275
def save_edit_tab(self):
276
#print "Save edit tab"
277
buf = self.text_view_vhost_source.get_buffer()
278
content = buf.get_text(buf.get_start_iter(), buf.get_end_iter())
280
return self.vhost.load_from_string( content ), "your edited source does not seem to be valid syntax"
282
def load_edit_tab(self):
283
#print "load edit tab"
284
# open edit tab update content
285
buf = self.text_view_vhost_source.get_buffer()
286
text = self.vhost.get_source_generated()
288
buf.set_modified(False)
290
def load_domain_tab(self):
291
#print "Load domain tab"
293
vhost_name = self.vhost.get_server_name()
294
self.window.set_title("VirtualHost Editor - " + vhost_name )
295
self.window.set_icon_from_file(self.vhost.get_icon())
297
modal = self.treeview_menu.get_model()
298
iter = modal.get_iter(0)
300
modal.set_value(iter, 0, self.window.get_icon())
302
if self.vhost.config and self.vhost.config.servername and self.vhost.config.servername.value:
303
server_name = self.vhost.config.servername.value
305
self.entry_domain.set_text( server_name )
307
if not self.vhost.is_default():
308
self.entry_domain.set_text( server_name )
309
elif self.vhost.config.ServerName:
310
self.entry_domain.set_sensitive(False)
313
document_root = self.vhost.get_document_root()
314
if ( document_root != None ):
315
self.entry_location.set_text( document_root )
318
self.treeview_domain_store.clear()
320
server_alias = self.vhost.get_server_alias()
322
for domain in server_alias:
323
self.treeview_domain_store.append((domain, None))
325
def save_domain_tab(self):
326
#print "Save domain tab"
327
if self.entry_location.get_text() == "" and self.vhost.is_new:
328
self.set_default_values_from_domain( True )
330
#if not self.vhost.is_default():
331
if self.entry_domain.get_text():
332
self.vhost.config.ServerName.value = self.entry_domain.get_text()
333
elif self.vhost.config.ServerName:
334
del self.vhost.config.ServerName
336
self.window.set_title("VirtualHost Editor - " + self.vhost.get_server_name() )
338
if self.vhost.config.DocumentRoot:
339
old_document_root = self.vhost.config.DocumentRoot.value
340
if old_document_root != self.entry_location.get_text():
341
ds = self.vhost.config.Directory.search( [old_document_root] )
344
d.value = self.entry_location.get_text()
345
self.vhost.config.DocumentRoot.value = self.entry_location.get_text()
347
aliases = self.get_server_aliases_list()
349
self.vhost.config.ServerAlias.opts = self.get_server_aliases_list()
350
elif self.vhost.config.ServerAlias:
351
del self.vhost.config.ServerAlias
353
self.hack_hosts = self.checkbutton_hosts.get_active()
357
def update_plugin_tab(self, tab):
358
#print "Update plugin : ", tab
360
for plugin in self.plugins:
362
if plugin.is_enabled() and plugin._tab_number == tab:
363
plugin.load_vhost_properties(self.vhost)
365
traceback.print_exc(file=sys.stdout)
367
def save_plugin_tab(self, tab):
370
#print "Save plugin : ", tab
372
for plugin in self.plugins:
374
if plugin.is_enabled() and plugin._tab_number == tab:
375
result, error = plugin.update_vhost_properties(self.vhost)
377
traceback.print_exc(file=sys.stdout)
162
380
def get_domain (self):
163
381
return self.entry_domain.get_text().strip()
164
382
#url.lower().startswith('http://')
246
463
def on_button_save_clicked(self, widget):
247
if self.entry_location.get_text() == "" and self.create_new:
248
self.set_default_values_from_domain( True )
466
result, error = True, ""
467
if self.__previous_active_tab == self.notebook.get_n_pages() - 1:
468
result, error = self.save_edit_tab()
469
elif self.__previous_active_tab == 0:
470
self.save_domain_tab()
472
result, error = self.save_plugin_tab(self.__previous_active_tab)
251
options[ 'ServerAlias' ] = []
252
options[ 'ServerName' ] = self.entry_domain.get_text()
253
options[ 'hack_hosts' ] = self.checkbutton_hosts.get_active()
254
options[ 'DocumentRoot' ] = self.entry_location.get_text()
255
options[ 'ServerAlias' ] = self.get_server_aliases_list()
476
md = gtk.MessageDialog(self.window, flags=0, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=error)
481
# All plugins on save
259
483
for plugin in self.plugins:
261
485
if plugin.is_enabled():
262
plugin.save_vhost_properties(options)
486
res, message = plugin.save_vhost_properties(self.vhost)
489
if tab_number and plugin._tab_number == tab_number:
490
self.show_error ( message )
263
491
except Exception:
264
492
traceback.print_exc(file=sys.stdout)
269
if ( self.create_new ):
270
site = VirtualHostModel( options[ 'ServerName' ] )
271
site.create ( options )
273
name = self.vhost.data['name']
274
print "Current name:", name
275
site = VirtualHostModel( name )
276
site.update( options, name )
279
#self.parent.create_vhost_list()
280
self.parent.refresh_vhosts()
281
self.parent.please_restart()
282
self.window.destroy()
283
except "VhostExists":
284
print "========================"
285
self.show_error( "A virtual host with the same name already exists" )
495
is_new = self.vhost.is_new
497
self.vhost.hack_hosts = self.checkbutton_hosts.get_active()
499
# save over buffer content
502
#update /etc/hosts only if it's a new vhost
507
if self.vhost.config.ServerName and self.vhost.config.ServerName.value:
508
Shell.command.sudo_execute ( [os.path.join(Configuration.APPPATH, "hosts-manager"), '-a', self.vhost.config.ServerName.value ] )
509
#add an entry for each host
510
if self.vhost.config.ServerAlias:
511
for alias in self.vhost.config.ServerAlias:
512
Shell.command.sudo_execute ( [os.path.join(Configuration.APPPATH, 'hosts-manager'), '-a', alias ])
514
# check apache config
515
returncode, error = self.parent.apache.test_config()
517
error = error.strip()
518
md = gtk.MessageDialog(self.window, flags=0, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK_CANCEL, message_format="Changes have been saved, but an error has been detected: \n\n"+error + "\n\nAre you sure you want to continue? Apache may not start until all errors are resolved.")
521
if result != gtk.RESPONSE_OK:
524
#self.parent.create_vhost_list()
525
self.parent.refresh_vhosts()
526
self.parent.please_restart()
527
self.window.destroy()
288
529
def on_button_cancel_clicked(self, widget):
289
530
self.window.destroy()
533
def on_button_error_close_clicked(self, widget):
291
536
def show_error ( self, message ):
293
self.xml.get_widget( 'message_text' ).set_label( '<b>'+message+'</b>' )
294
self.xml.get_widget( 'message_container' ).show()
537
self.message_text.set_label( '<b>'+message+'</b>' )
538
self.error_area.show()
540
def clear_error ( self):
541
self.error_area.hide()