Browse Source

Restart SOGo from within panel

andryyy 8 years ago
parent
commit
f7b95ae5a0

+ 2 - 2
data/Dockerfiles/php-fpm/Dockerfile

@@ -4,10 +4,10 @@ MAINTAINER Andre Peters <andre.peters@servercow.de>
 ENV DEBIAN_FRONTEND noninteractive
 
 RUN apt-get update \
-        && apt-get install -y zlib1g-dev libicu-dev g++ libidn11-dev
+        && apt-get install -y zlib1g-dev libicu-dev g++ libidn11-dev libxml2-dev
 
 RUN docker-php-ext-configure intl
-RUN docker-php-ext-install intl pdo pdo_mysql
+RUN docker-php-ext-install intl pdo pdo_mysql xmlrpc
 
 COPY ./docker-entrypoint.sh /
 

+ 2 - 2
data/Dockerfiles/sogo/Dockerfile

@@ -32,12 +32,12 @@ RUN echo '* * * * *   sogo   /usr/sbin/sogo-ealarms-notify' > /etc/cron.d/sogo
 RUN echo '* * * * *   sogo   /usr/sbin/sogo-tool expire-sessions 60' >> /etc/cron.d/sogo
 RUN echo '0 0 * * *   sogo   /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds' >> /etc/cron.d/sogo
 
-COPY ./docker-entrypoint.sh /
+COPY ./reconf-domains.sh /
 COPY supervisord.conf /etc/supervisor/supervisord.conf
 
 EXPOSE 20000
+EXPOSE 9191
 
-ENTRYPOINT ["/docker-entrypoint.sh"]
 CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
 
 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

+ 25 - 20
data/Dockerfiles/sogo/docker-entrypoint.sh → data/Dockerfiles/sogo/reconf-domains.sh

@@ -1,14 +1,17 @@
 #!/bin/bash
 
-# Wait for MySQL to warm-up
-while ! mysqladmin ping --host mysql --silent; do
-	sleep 1
-done
+# Go in a 5 minute loop
+while true; do
+
+	# Wait for MySQL to warm-up
+	while ! mysqladmin ping --host mysql --silent; do
+		sleep 1
+	done
 
-mkdir -p /var/lib/sogo/GNUstep/Defaults/
+	mkdir -p /var/lib/sogo/GNUstep/Defaults/
 
-# Generate plist header with timezone data
-cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist
+	# Generate plist header with timezone data
+	cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//GNUstep//DTD plist 0.9//EN" "http://www.gnustep.org/plist-0_9.xml">
 <plist version="0.9">
@@ -33,11 +36,11 @@ cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist
     <dict>
 EOF
 
-# Generate multi-domain setup
-while read line
-do
-DOMAIN_SANE=$(echo ${line} | tr '-' 'b' | tr '.' 'p' | tr -cd '[[:alnum:]]')
-echo "        <key>${line}</key>
+	# Generate multi-domain setup
+	while read line
+	do
+	DOMAIN_SANE=$(echo ${line} | tr '-' 'b' | tr '.' 'p' | tr -cd '[[:alnum:]]')
+	echo "        <key>${line}</key>
         <dict>
             <key>SOGoMailDomain</key>
             <string>$(echo ${line} | tr '-' 'b' | tr '.' 'p')</string>
@@ -73,8 +76,8 @@ echo "        <key>${line}</key>
                 </dict>
             </array>
         </dict>" >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
-mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view_${DOMAIN_SANE}"
-mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
+	mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view_${DOMAIN_SANE}"
+	mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
 CREATE VIEW sogo_view_${DOMAIN_SANE} (c_uid, c_name, c_password, c_cn, mail, aliases, ad_aliases, senderacl, home) AS
 SELECT mailbox.username, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(ga.aliases, ''), IFNULL(gda.ad_alias, ''), IFNULL(gs.send_as, ''), CONCAT('/var/vmail/', maildir) FROM mailbox
 LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username = mailbox.username
@@ -84,13 +87,15 @@ WHERE mailbox.active = '1' AND domain = '${line}';
 EOF
 done < <(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain;" -B -N)
 
-# Generate footer
-echo '    </dict>
+	# Generate footer
+	echo '    </dict>
 </dict>
 </plist>' >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
 
-# Fix permissions
-chown sogo:sogo -R /var/lib/sogo/
-chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist
+	# Fix permissions
+	chown sogo:sogo -R /var/lib/sogo/
+	chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist
 
-exec "$@"
+	sleep 300
+
+done

+ 17 - 3
data/Dockerfiles/sogo/supervisord.conf

@@ -7,10 +7,19 @@ redirect_stderr=true
 autostart=true
 stdout_syslog=true
 
+[group:sogo-group]
+programs=reconf-domains,sogo
+
 [program:sogo]
 command=/usr/sbin/sogod
 user=sogo
 autorestart=true
+priority=20
+
+[program:reconf-domains]
+command=/reconf-domains.sh
+autorestart=true
+priority=10
 
 [program:sogo-syslog]
 command=/usr/bin/tail -f /var/log/syslog -f /var/log/sogo/sogo.log
@@ -21,6 +30,11 @@ stdout_logfile_maxbytes=0
 command=/usr/sbin/cron -f
 autorestart=true
 
-#[unix_http_server]
-#file=/var/run/controller/supervisord.sock
-#chown=www-data:nogroup
+[inet_http_server]
+port=9191
+
+[rpcinterface:supervisor]
+supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
+
+[supervisorctl]
+serverurl=http://localhost:9191

+ 40 - 0
data/web/call_sogo_ctrl.php

@@ -0,0 +1,40 @@
+<?php
+session_start();
+$AuthUsers = array("admin");
+if (!isset($_SESSION['mailcow_cc_role']) OR !in_array($_SESSION['mailcow_cc_role'], $AuthUsers)) {
+	echo "Not allowed." . PHP_EOL;
+	exit();
+}
+if ($_GET['ACTION'] == "start") {
+	$request = xmlrpc_encode_request("supervisor.startProcessGroup", 'sogo-group', array('encoding'=>'utf-8'));
+	$context = stream_context_create(array('http' => array(
+	'method' => "POST",
+	'header' => "Content-Length: " . strlen($request),
+	'content' => $request
+	)));
+	$file = @file_get_contents("http://sogo:9191/RPC2", false, $context) or die("Cannot connect to $remote_server:$listener_port");
+	$response = xmlrpc_decode($file);
+	if (isset($response['faultString'])) {
+		echo '<b><span class="pull-right text-warning">' . $response['faultString'] . '</span></b>';
+	}
+	else {
+		echo '<b><span class="pull-right text-success">OK</span></b>';
+	}
+}
+elseif ($_GET['ACTION'] == "stop") {
+	$request = xmlrpc_encode_request("supervisor.stopProcessGroup", 'sogo-group', array('encoding'=>'utf-8'));
+	$context = stream_context_create(array('http' => array(
+	'method' => "POST",
+	'header' => "Content-Length: " . strlen($request),
+	'content' => $request
+	)));
+	$file = @file_get_contents("http://sogo:9191/RPC2", false, $context) or die("Cannot connect to $remote_server:$listener_port");
+	$response = xmlrpc_decode($file);
+	if (isset($response['faultString'])) {
+		echo '<b><span class="pull-right text-warning">' . $response['faultString'] . '</span></b>';
+	}
+	else {
+		echo '<b><span class="pull-right text-success">OK</span></b>';
+	}
+}
+?>

+ 51 - 0
data/web/inc/footer.inc.php

@@ -1,3 +1,26 @@
+<?php
+if ($_SESSION['mailcow_cc_role'] == "admin"):
+?>
+<div id="RestartSOGo" class="modal fade" role="dialog">
+	<div class="modal-dialog">
+		<div class="modal-content">
+		<div class="modal-header">
+			<button type="button" class="close" data-dismiss="modal">&times;</button>
+			<h4 class="modal-title">Restart SOGo</h4>
+		</div>
+		<div class="modal-body">
+			<p>Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.</p>
+			<hr />
+			<button class="btn btn-md btn-primary" id="triggerRestartSogo">Restart SOGo</button>
+			<br /><br />
+			<div id="statusTriggerRestartSogo"></div>
+		</div>
+		</div>
+	</div>
+</div>
+<?php
+endif;
+?>
 <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-switch/3.3.2/js/bootstrap-switch.min.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/7.0.2/bootstrap-slider.min.js"></script>
@@ -59,6 +82,34 @@ $(document).ready(function() {
 	// Init Bootstrap Selectpicker
 	$('select').selectpicker();
 
+	// Trigger SOGo restart
+	$('#triggerRestartSogo').click(function(){
+		$(this).prop("disabled",true);
+		$('#statusTriggerRestartSogo').text('Stopping SOGo workers, this may take a while... ');
+		$.ajax({
+			method: 'get',
+			url: 'call_sogo_ctrl.php',
+			data: {
+				'ajax': true,
+				'ACTION': 'stop'
+			},
+			success: function(data) {
+				$('#statusTriggerRestartSogo').append(data);
+				$('#statusTriggerRestartSogo').append('<br />Starting SOGo... ');
+				$.ajax({
+					method: 'get',
+					url: 'call_sogo_ctrl.php',
+					data: {
+						'ajax': true,
+						'ACTION': 'start'
+					},
+					success: function(data) {
+						$('#statusTriggerRestartSogo').append(data);
+					}
+				});
+			}
+		});
+	});
 });
 </script>
 <?php

+ 7 - 0
data/web/inc/header.inc.php

@@ -199,6 +199,13 @@ endif;
 						?>
 					</ul>
 				</li>
+				<?php
+				if ($_SESSION['mailcow_cc_role'] == "admin"):
+				?>
+				<li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Restart SOGo</a></li>
+				<?php
+				endif;
+				?>
 					<?php
 				}
 				if (isset($_SESSION['mailcow_cc_username'])):

+ 1 - 1
data/web/js/mailbox.js

@@ -9,7 +9,7 @@ $(document).ready(function() {
 	$("#numRowsDomain").text(rowCountDomain);
 	$("#numRowsMailbox").text(rowCountMailbox);
 	$("#numRowsAlias").text(rowCountAlias);
-	
+
 	// Filter table function
 	$.fn.extend({
 		filterTable: function(){

+ 4 - 4
data/web/mailbox.php

@@ -150,7 +150,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 					<tfoot>
 						<tr id="no-data">
 							<td colspan="8" style="text-align: center; font-style: normal; border-top: 1px solid #e7e7e7;">
-								<a href="/add.php?domain" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_domain'];?></a>
+								<a href="/add.php?domain"><?=$lang['mailbox']['add_domain'];?></a>
 							</td>
 						</tr>
 					</tfoot>
@@ -238,7 +238,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 					<tfoot>
 						<tr id="no-data">
 							<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
-								<a href="/add.php?aliasdomain" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_domain_alias'];?></a>
+								<a href="/add.php?aliasdomain"><?=$lang['mailbox']['add_domain_alias'];?></a>
 							</td>
 						</tr>
 					</tfoot>
@@ -368,7 +368,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 					<tfoot>
 						<tr id="no-data">
 							<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
-								<a href="/add.php?mailbox" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_mailbox'];?></a>
+								<a href="/add.php?mailbox"><?=$lang['mailbox']['add_mailbox'];?></a>
 							</td>
 						</tr>
 					</tfoot>
@@ -479,7 +479,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 					<tfoot>
 						<tr id="no-data">
 							<td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
-								<a href="/add.php?alias" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_alias'];?></a>
+								<a href="/add.php?alias"><?=$lang['mailbox']['add_alias'];?></a>
 							</td>
 						</tr>
 					</tfoot>