From ffb50e9e8e1d3b6491bd406c2426317f0e88f9b3 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Fri, 22 Dec 2017 10:16:38 -0800 Subject: [PATCH] Add support for running a standalone geard We don't use the jenkins log client 0mq events anymore with zuulv3. Instead zuul jobs submit the log indexing jobs directly to the gearman queue for log processing. This means we only need a geard to be running so add support for running just that daemon. Change-Id: Iedcb5b29875494b8e18fa125adb08ec2e34d0064 --- files/geard.init | 158 ++++++++++++++++++++++++++++++++++++ manifests/geard.pp | 85 +++++++++++++++++++ templates/geard.default.erb | 6 ++ 3 files changed, 249 insertions(+) create mode 100755 files/geard.init create mode 100644 manifests/geard.pp create mode 100644 templates/geard.default.erb diff --git a/files/geard.init b/files/geard.init new file mode 100755 index 0000000..20bcec8 --- /dev/null +++ b/files/geard.init @@ -0,0 +1,158 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: geard +# Required-Start: $remote_fs $syslog $named $network +# Required-Stop: $remote_fs $syslog $named $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Python gearman server +# Description: Daemon that runs a native python gearman server +### END INIT INFO + +# Do NOT "set -e" + +# PATH should only include /usr/* if it runs after the mountnfs.sh script +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="Geard" +NAME=geard +DAEMON=/usr/local/bin/geard +PIDFILE=/var/run/$NAME/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +USER=logprocessor + +# Exit if the package is not installed +[ -x "$DAEMON" ] || exit 0 + +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME +DAEMON_ARGS="-p $GEARD_PORT --pidfile $PIDFILE" + +# Load the VERBOSE setting and other rcS variables +. /lib/init/vars.sh + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# +# Function that starts the daemon/service +# +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + + mkdir -p /var/run/$NAME + chown $USER /var/run/$NAME + start-stop-daemon --start --quiet --pidfile $PIDFILE -c $USER --exec $DAEMON --test > /dev/null \ + || return 1 + start-stop-daemon --start --quiet --pidfile $PIDFILE -c $USER --exec $DAEMON -- \ + $DAEMON_ARGS \ + || return 2 + # Add code here, if necessary, that waits for the process to be ready + # to handle requests from services started subsequently which depend + # on this one. As a last resort, sleep for some time. +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --signal 9 --pidfile $PIDFILE + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + rm -f /var/run/$NAME/* + return "$RETVAL" +} + +# +# Function that stops the daemon/service +# +#do_graceful_stop() +#{ +# PID=`cat $PIDFILE` +# kill -USR1 $PID +# +# # wait until really stopped +# if [ -n "${PID:-}" ]; then +# i=0 +# while kill -0 "${PID:-}" 2> /dev/null; do +# if [ $i -eq '0' ]; then +# echo -n " ... waiting " +# else +# echo -n "." +# fi +# i=$(($i+1)) +# sleep 1 +# done +# fi +# +# rm -f /var/run/$NAME/* +#} + +# +# Function that sends a SIGHUP to the daemon/service +# +#do_reload() { +# # +# # If the daemon can reload its configuration without +# # restarting (for example, when it is sent a SIGHUP), +# # then implement that here. +# # +# start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name zuul-server +# return 0 +#} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; +# reload) +# # +# # If do_reload() is not implemented then leave this commented out +# # and leave 'force-reload' as an alias for 'restart'. +# # +# log_daemon_msg "Reloading $DESC" "$NAME" +# do_reload +# log_end_msg $? +# ;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + do_start + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: diff --git a/manifests/geard.pp b/manifests/geard.pp new file mode 100644 index 0000000..6567563 --- /dev/null +++ b/manifests/geard.pp @@ -0,0 +1,85 @@ +# Copyright 2012-2013 Hewlett-Packard Development Company, L.P. +# Copyright 2017 OpenStack Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# == Class: log_processor::geard +# +# Run geard as system service +class log_processor::geard ( + $statsd_host = undef, + $geard_port = '4730', +) { + file { '/var/log/geard': + ensure => directory, + owner => 'logprocessor', + group => 'logprocessor', + mode => '0755', + require => User['logprocessor'], + } + + file { '/etc/init.d/geard': + ensure => present, + owner => 'root', + group => 'root', + mode => '0555', + source => 'puppet:///modules/log_processor/geard.init', + require => [ + Package['gear'], + File['/etc/default/geard'], + ], + } + + file { '/etc/default/geard': + ensure => present, + owner => 'root', + group => 'root', + mode => '0444', + content => template('log_processor/geard.default.erb'), + } + + if ($::operatingsystem == 'Ubuntu') and ($::operatingsystemrelease >= '16.04') { + # This is a hack to make sure that systemd is aware of the new service + # before we attempt to start it. + exec { 'geard-systemd-daemon-reload': + command => '/bin/systemctl daemon-reload', + before => Service['geard'], + subscribe => File['/etc/init.d/geard'], + refreshonly => true, + } + } + + service { 'geard': + enable => true, + hasrestart => true, + subscribe => File['/etc/default/geard'], + require => [ + File['/etc/init.d/geard'], + File['/var/log/geard'], + ], + } + + include ::logrotate + logrotate::file { 'rotate-geard.log': + log => '/var/log/geard/geard.log', + options => [ + 'compress', + 'copytruncate', + 'missingok', + 'rotate 7', + 'daily', + 'notifempty', + ], + require => Service['geard'], + } +} diff --git a/templates/geard.default.erb b/templates/geard.default.erb new file mode 100644 index 0000000..6b144d0 --- /dev/null +++ b/templates/geard.default.erb @@ -0,0 +1,6 @@ +<% if @statsd_host != nil %> +export STATSD_HOST=<%= @statsd_host %> +export STATSD_PORT=8125 +export STATSD_PREFIX="logstash.geard" +<% end %> +export GEARD_PORT=<%= @geard_port %>