r3881 - in trunk/varnish-tools/webgui: . Varnish templates

petter at projects.linpro.no petter at projects.linpro.no
Wed Mar 4 16:06:17 CET 2009


Author: petter
Date: 2009-03-04 16:06:17 +0100 (Wed, 04 Mar 2009)
New Revision: 3881

Modified:
   trunk/varnish-tools/webgui/Varnish/DB.pm
   trunk/varnish-tools/webgui/Varnish/Management.pm
   trunk/varnish-tools/webgui/Varnish/Node.pm
   trunk/varnish-tools/webgui/Varnish/NodeManager.pm
   trunk/varnish-tools/webgui/Varnish/RequestHandler.pm
   trunk/varnish-tools/webgui/Varnish/Util.pm
   trunk/varnish-tools/webgui/create_db_data.pl
   trunk/varnish-tools/webgui/templates/node_management.tmpl
   trunk/varnish-tools/webgui/varnish-webui.pl
   trunk/varnish-tools/webgui/varnish_webgui.sql
Log:
Added support for the authentication of the management console. This requires changes to the DB schema, so the DB must be rebuilt.
Added possibility to set the inheritance when moving nodes around.
Fixed sending of correct Content-Type header.


Modified: trunk/varnish-tools/webgui/Varnish/DB.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/DB.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/DB.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -101,14 +101,15 @@
 	sub add_node {
 		my ($self, $node) = @_;
 
-		my $fields = "name, address, port, group_id, management_port";
-		my $sql = "INSERT INTO node($fields) VALUES(?, ?, ?, ?, ?)";
+		my $fields = "name, address, port, group_id, management_port, management_secret";
+		my $sql = "INSERT INTO node($fields) VALUES(?, ?, ?, ?, ?, ?)";
 		$dbh->do($sql, undef,
 			$node->get_name(),
 			$node->get_address(),
 			$node->get_port(),
 			$node->get_group_id(),
-			$node->get_management_port());
+			$node->get_management_port(),
+			$node->get_management_secret());
 		$dbh->commit();
 		
 		$node->set_id($dbh->func('last_insert_rowid'));
@@ -119,9 +120,9 @@
 	
 		my $sql = 
 			"UPDATE node SET name = ?, address = ?, port = ?, group_id = ?, "
-			. "management_port = ? where id = ?";
+			. "management_port = ?, management_secret = ? WHERE id = ?";
 		$dbh->do($sql, undef, $node->get_name, $node->get_address(), $node->get_port(),
-			$node->get_group_id(), $node->get_management_port(),
+			$node->get_group_id(), $node->get_management_port(), $node->get_management_secret(),
 			$node->get_id());
 		$dbh->commit();
 	}

Modified: trunk/varnish-tools/webgui/Varnish/Management.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/Management.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/Management.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -7,19 +7,22 @@
 use Exporter;
 use List::Util qw(first);
 use Varnish::Util qw(set_error get_error no_error);
+use Digest::SHA qw(sha256_hex);
 
 {
 	my %hostname_of;
 	my %port_of;
 	my %socket_of;
+	my %secret_of;
 
 	sub new {
-		my ($class, $hostname, $port) = @_;
+		my ($class, $hostname, $port, $secret) = @_;
 
 		my $new_object = bless \do{ my $anon_scalar; }, $class;
 
 		$hostname_of{$new_object} = $hostname;
 		$port_of{$new_object} = $port;
+		$secret_of{$new_object} = $secret;
 
 		return $new_object;
 	}
@@ -59,13 +62,28 @@
 
 			my $select = IO::Select->new();
 			$select->add($socket);
+			my $status_code;
+			my $response;
 			# wait 100ms, tops, before assuming we don't get a banner
 			if ($select->can_read(0.1)) {
-				_read_cli_response($socket);
+				($status_code, $response) = _read_cli_response($socket);
 			}
 			my $flags = fcntl($socket, F_GETFL, 0);
 			$flags = fcntl($socket, F_SETFL, $flags & ~O_NONBLOCK);
+					
+			if ($status_code && $status_code eq "107") {
+				my ($challenge) = ($response =~ /^(.*)$/m);
+				my $challenge_response_text =
+					"$challenge\n" . $secret_of{$self} . "\n$challenge\n";	
 
+				print $socket "auth " . sha256_hex($challenge_response_text) . "\n";
+				my ($status_code, $response) = _read_cli_response($socket);
+				if ($status_code ne "200") {
+					close($socket);
+					return ("666", "Management port authentication failed.");
+				}
+			}
+
 			$socket_of{$self} = $socket;
 		}
 		my $socket = $socket_of{$self};
@@ -242,8 +260,8 @@
 	sub ping {
 		my ($self) = @_;
 
-		my ($status_code, $response) = _send_command($self, "stats");
-
+		my ($status_code, $response) = _send_command($self, "ping");
+		
 		return no_error($self) if ($status_code eq "200");
 		return set_error($response);
 	}

Modified: trunk/varnish-tools/webgui/Varnish/Node.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/Node.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/Node.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -13,6 +13,7 @@
 	my %group_id_of;
 	my %management_of;
 	my %management_port_of;
+	my %management_secret_of;
 	my %id_of;
 
 	sub new {
@@ -35,8 +36,10 @@
 			$group_id_of{$new_object} = 0;
 		}
 		$management_port_of{$new_object} = $arg_ref->{'management_port'};
+		$management_secret_of{$new_object} = $arg_ref->{'management_secret'};
 		$management_of{$new_object} = Varnish::Management->new($arg_ref->{'address'}, 
-															   $arg_ref->{'management_port'});
+															   $arg_ref->{'management_port'},
+															   $arg_ref->{'management_secret'});
 		return $new_object;
 	}
 
@@ -118,6 +121,20 @@
 		$management_port_of{$self} = $management_port;
 	}
 
+	sub get_management_secret {
+		my ($self) = @_;
+
+		return $management_secret_of{$self};
+	}
+
+	sub set_management_secret {
+		my ($self, $management_secret) = @_;
+
+		$management_secret_of{$self} = $management_secret;
+	}
+
+
+
 	sub set_id {
 		my ($self, $id) = @_;
 

Modified: trunk/varnish-tools/webgui/Varnish/NodeManager.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/NodeManager.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/NodeManager.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -57,7 +57,7 @@
 		$inheritance ||= 0;
 		my $management = $node->get_management();
 		if (!$management->ping()) {
-			return set_error($self, "Could not connect to management port: "
+			return set_error("Could not connect to management port: "
 									. get_error());
 		}
 		Varnish::DB->add_node($node);
@@ -140,14 +140,23 @@
 	}
 
 	sub update_node {
-		my ($self, $node) = @_;
+		my ($self, $node, $inheritance) = @_;
 
+		$inheritance ||= 0;
 		my $current = get_node($self, $node->get_id());
 		if ($current->get_group_id() != $node->get_group_id()
-			&& $node->get_group_id() > 0) {
+			&& $node->get_group_id() > 0
+			&& $inheritance) {
 			my $group = get_group($self, $node->get_group_id());
-			_clone_unit($group, $node);
+
+			if ($inheritance == 1) {
+				_clone_unit($node, $group);
+			}
+			elsif ($inheritance == 2) {
+				_clone_unit($group, $node);
+			}
 		}
+
 		Varnish::DB->update_node($node);
 	}
 

Modified: trunk/varnish-tools/webgui/Varnish/RequestHandler.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/RequestHandler.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/RequestHandler.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -50,8 +50,9 @@
 	sub get_response_header {
 		my ($self) = @_;
 
-		return $response_header_ref_of{$self};
+		return %{$response_header_ref_of{$self}};
 	}
+
 	sub get_response_content {
 		my ($self) = @_;
 
@@ -102,6 +103,7 @@
 
 		my $param;
 		my $use_master_template;
+		$response_header_ref_of{$self}->{'Content-Type'} = "text/html";
 		if ($operation eq 'view_stats' || $operation eq '') {
 			($content_template, $param, $use_master_template) = view_stats(\%request_parameter);
 		}
@@ -764,6 +766,7 @@
 		$param{'address'} = $$parameter_ref{'address'} || "";
 		$param{'port'} ||= "";
 		$param{'management_port'} ||= "";
+		$param{'management_secret'} ||= "";
 		$param{'inheritance'} ||= 0;
 		$param{'edit_node'} ||= -1;
 	
@@ -782,6 +785,7 @@
 		$tmpl_var{'show_add_node'} = 1;
 		$tmpl_var{'show_node_in_backend_health'} = 1;
 		$tmpl_var{'show_inheritance_settings'} = 1;
+		$tmpl_var{'show_management_secret'} = 1;
 		$tmpl_var{'inheritance_settings'} = [];
 
 		my $error = "";
@@ -857,10 +861,17 @@
 					address			=> $param{'address'},
 					port			=> $param{'port'}, 
 					group_id		=> $param{'group_id'}, 
-					management_port	=> $param{'management_port'}
+					management_port	=> $param{'management_port'},
+					management_secret	=> $param{'management_secret'}
 				});
-				Varnish::NodeManager->add_node($node, $param{'inheritance'});
-				$status .= "Node " . $node->get_name() . " added successfully.";
+				if (Varnish::NodeManager->add_node($node, $param{'inheritance'})) {
+					$status .= "Node " . $node->get_name() . " added successfully.";
+				}
+				else {
+					$error .= "Could not add node " . $node->get_name() . ": " . get_error();
+					@tmpl_var{'new_name', 'new_address', 'new_port', 'new_management_port', 'new_management_secret'} = 
+						@param{'name', 'address', 'port', 'management_port', 'management_secret'};
+				}
 				
 				my $group = Varnish::NodeManager->get_group($param{'group_id'});
 				my $group_name = ($group ? $group->get_name() : "");
@@ -873,6 +884,7 @@
 					. " [port=" . $node->get_port() . "]"
 					. " [group=" . $group_name . "]"
 					. " [management_port=" . $node->get_management_port() . "]"
+					. " [management_port=******]"
 					. " [settings_inheritance=$inheritance]");
 			}
 			else {
@@ -880,6 +892,7 @@
 				$error .= "Name: " . $param{'name'} . ":\n"; 
 				$error .= "Address: " . $param{'address'} . ":\n"; 
 				$error .= "Port: " . $param{'port'} . ":\n"; 
+				$error .= "Management secret: ******\n";
 				$error .= "Management port: " . $param{'management_port'} . ":\n"; 
 			}
 		}
@@ -892,8 +905,9 @@
 				$node->set_port($param{'port'});
 				$node->set_group_id($param{'node_group_id'});
 				$node->set_management_port($param{'management_port'});
+				$node->set_management_secret($param{'management_secret'});
 				
-				Varnish::NodeManager->update_node($node);
+				Varnish::NodeManager->update_node($node, $param{'inheritance'});
 
 				$status .= "Node " . $node->get_name() . " updated successfully.";
 
@@ -904,6 +918,7 @@
 					. " [address=" . $node->get_address() . "]"
 					. " [port=" . $node->get_port() . "]"
 					. " [group=" . $group_name . "]"
+					. " [management_secret=******]"
 					. " [management_port=" . $node->get_management_port() . "]");
 			}
 		}
@@ -1000,6 +1015,7 @@
 					address					=> $node->get_address(),	
 					port					=> $node->get_port(),	
 					management_port			=> $node->get_management_port(),
+					management_secret		=> $node->get_management_secret() ? "******" : "",
 					group					=> $group_name,
 					edit					=> $node->get_id() == $param{'edit_node'},
 				};
@@ -1020,7 +1036,8 @@
 			$tmpl_var{'add_group'} = 1;
 		}
 
-		if ($tmpl_var{'group_id'} > 0) {
+		if ($tmpl_var{'group_id'} > 0 
+			|| $param{'edit_node'} > -1) {
 			my @inheritance_settings;
 			push @inheritance_settings, {
 				value		=>  2,
@@ -1049,6 +1066,7 @@
 			$tmpl_var{'group_name'} = $selected_group->get_name();
 		}
 		$tmpl_var{'show_group_controls'} = $tmpl_var{'group_id'} > 0;
+		$tmpl_var{'show_management_secret'} = $tmpl_var{'group_id'} >= 0;
 		$tmpl_var{'show_group'} = $tmpl_var{'group_id'} == -1 || $param{'edit_node'} > -1;
 		$tmpl_var{'show_add_node'} = $tmpl_var{'group_id'} >= 0;
 		$tmpl_var{'error'} = $error;

Modified: trunk/varnish-tools/webgui/Varnish/Util.pm
===================================================================
--- trunk/varnish-tools/webgui/Varnish/Util.pm	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/Varnish/Util.pm	2009-03-04 15:06:17 UTC (rev 3881)
@@ -52,17 +52,18 @@
 
 	sub set_config {
 		my ($config_ref) = @_;
+			
+		my @keys = keys %$config_ref;
+		for my $key (@keys) {
+			$config{$key} = $config_ref->{$key};
+		}
 
-		%config = %{$config_ref};
-
 		if ($config{'log_filename'}) {
 			if (!open($log_handle, ">>" . $config{'log_filename'})) {
 				die "Could not open log file " . $config{'log_filename'} . " for writing";
 			}
 			$log_handle->autoflush(1); # FIXME: Remove it, or is it usefull?
 		}
-
-		Varnish::DB->init($config{'db_filename'});
 	}
 
 	sub print_config {
@@ -128,7 +129,7 @@
 
 	sub set_error {
 		my ($new_error) = @_;
-
+		
 		$error = $new_error;
 
 		return;
@@ -136,7 +137,7 @@
 
 	sub get_error {
 		
-		return $error;
+		return $error ? $error : '';
 	}
 
 	sub no_error {

Modified: trunk/varnish-tools/webgui/create_db_data.pl
===================================================================
--- trunk/varnish-tools/webgui/create_db_data.pl	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/create_db_data.pl	2009-03-04 15:06:17 UTC (rev 3881)
@@ -82,7 +82,7 @@
 	port TEXT,
 	group_id INTEGER,
 	management_port TEXT,
-	is_master BOOLEAN
+	management_secret TEXT
 );
 
 CREATE TABLE stat (

Modified: trunk/varnish-tools/webgui/templates/node_management.tmpl
===================================================================
--- trunk/varnish-tools/webgui/templates/node_management.tmpl	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/templates/node_management.tmpl	2009-03-04 15:06:17 UTC (rev 3881)
@@ -43,6 +43,9 @@
 <td class="header">Address</td>
 <td class="header">Port</td>
 <td class="header">Management<br/>port</td>
+<TMPL_IF NAME=SHOW_MANAGEMENT_SECRET>
+<td class="header">Management<br/>secret</td>
+</TMPL_IF>
 <TMPL_IF NAME=SHOW_INHERITANCE_SETTINGS>
 <td class="header">Inheritance<br/>settings</td>
 </TMPL_IF>
@@ -91,8 +94,17 @@
 <td><input type="text" name="address" value="<TMPL_VAR NAME=ADDRESS>"/></td>
 <td><input type="text" name="port" value="<TMPL_VAR NAME=PORT>" size=5/></td>
 <td><input type="text" name="management_port" value="<TMPL_VAR NAME=MANAGEMENT_PORT>"/></td>
+<TMPL_IF NAME=SHOW_MANAGEMENT_SECRET>
+<td><input type="password" name="management_secret" value="<TMPL_VAR NAME=MANAGEMENT_SECRET>"/></td>
+</TMPL_IF>
 <TMPL_IF NAME=SHOW_INHERITANCE_SETTINGS>
-<td></td>
+<td> 
+<select name="inheritance">
+<TMPL_LOOP NAME=INHERITANCE_SETTINGS>
+<option value="<TMPL_VAR NAME=VALUE>" <TMPL_IF NAME=SELECTED>selected</TMPL_IF>><TMPL_VAR NAME=NAME></option>
+</TMPL_LOOP>
+</select>
+</td>
 </TMPL_IF>
 <td>
 <input type="hidden" name="node_id" value="<TMPL_VAR NAME=ID>">
@@ -111,6 +123,9 @@
 <td><TMPL_VAR NAME=ADDRESS></td>
 <td><TMPL_VAR NAME=PORT></td>
 <td><a href="/management_console?node_id=<TMPL_VAR NAME=ID>"><TMPL_VAR NAME=MANAGEMENT_PORT></a></td>
+<TMPL_IF NAME=SHOW_MANAGEMENT_SECRET>
+<td><TMPL_VAR NAME=MANAGEMENT_SECRET></td>
+</TMPL_IF>
 <TMPL_IF NAME=SHOW_INHERITANCE_SETTINGS>
 <td></td>
 </TMPL_IF>
@@ -156,13 +171,16 @@
 <input type="hidden" name="operation" value="add_node"/>
 <td></td>
 <td></td>
-<td><input type="text" name="name" id="new_node_name"/></td>
+<td><input type="text" name="name" id="new_node_name" value="<TMPL_VAR NAME=NEW_NAME>"/></td>
 <TMPL_IF NAME=SHOW_GROUP>
 <td><TMPL_VAR NAME=GROUP_NAME></td>
 </TMPL_IF>
-<td><input type="text" name="address"/></td>
-<td><input type="text" name="port" size=5/></td>
-<td><input type="text" name="management_port" value="<TMPL_VAR NAME=DEFAULT_MANAGEMENT_PORT>"/></td>
+<td><input type="text" name="address" value="<TMPL_VAR NAME=NEW_ADDRESS>"/></td>
+<td><input type="text" name="port" value="<TMPL_VAR NAME=NEW_PORT>" size=5/></td>
+<td><input type="text" name="management_port"  value="<TMPL_VAR NAME=NEW_MANAGEMENT_PORT>"/></td>
+<TMPL_IF NAME=SHOW_MANAGEMENT_SECRET>
+<td><input type="password" name="management_secret" value="<TMPL_VAR NAME=NEW_MANAGEMENT_SECRET>"/></td>
+</TMPL_IF>
 <TMPL_IF NAME=SHOW_INHERITANCE_SETTINGS>
 <td> 
 <select name="inheritance">

Modified: trunk/varnish-tools/webgui/varnish-webui.pl
===================================================================
--- trunk/varnish-tools/webgui/varnish-webui.pl	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/varnish-webui.pl	2009-03-04 15:06:17 UTC (rev 3881)
@@ -70,6 +70,9 @@
 #	print "Pipe ignored\n";
 };
 
+
+log_info("Initiating DB");
+Varnish::DB->init(get_config_value('db_filename'));
 log_info("Starting HTTP daemon");
 my $daemon = HTTP::Daemon->new(	LocalPort => get_config_value('port'), 
 								LocalAddr => get_config_value('address'),

Modified: trunk/varnish-tools/webgui/varnish_webgui.sql
===================================================================
--- trunk/varnish-tools/webgui/varnish_webgui.sql	2009-03-04 13:00:18 UTC (rev 3880)
+++ trunk/varnish-tools/webgui/varnish_webgui.sql	2009-03-04 15:06:17 UTC (rev 3881)
@@ -19,7 +19,7 @@
 	port TEXT,
 	group_id INTEGER,
 	management_port TEXT,
-	is_master BOOLEAN
+	management_secret TEXT
 );
 
 CREATE TABLE stat (



More information about the varnish-commit mailing list