Include SysV init script if built on older system

This commit is contained in:
Honza Horak 2014-07-23 15:26:28 +02:00
parent 1366a527f1
commit ee2d0857de
8 changed files with 316 additions and 59 deletions

View File

@ -5,26 +5,34 @@
source "`dirname ${BASH_SOURCE[0]}`/mariadb-scripts-common"
# Absorb configuration settings from the specified systemd service file,
# or the default "mariadb" service if not specified
SERVICE_NAME="$1"
if [ x"$SERVICE_NAME" = x ]
# If two args given first is user, second is group
# otherwise the arg is the systemd service file
if [ "$#" -eq 2 ]
then
SERVICE_NAME=@RPM_PACKAGE_PREFIX@mariadb.service
fi
myuser="$1"
mygroup="$2"
else
# Absorb configuration settings from the specified systemd service file,
# or the default "mariadb" service if not specified
SERVICE_NAME="$1"
if [ x"$SERVICE_NAME" = x ]
then
SERVICE_NAME=@DAEMON_NAME@.service
fi
myuser=`systemctl show -p User "${SERVICE_NAME}" |
sed 's/^User=//'`
if [ x"$myuser" = x ]
then
myuser=mysql
fi
myuser=`systemctl show -p User "${SERVICE_NAME}" |
sed 's/^User=//'`
if [ x"$myuser" = x ]
then
myuser=mysql
fi
mygroup=`systemctl show -p Group "${SERVICE_NAME}" |
sed 's/^Group=//'`
if [ x"$mygroup" = x ]
then
mygroup=mysql
mygroup=`systemctl show -p Group "${SERVICE_NAME}" |
sed 's/^Group=//'`
if [ x"$mygroup" = x ]
then
mygroup=mysql
fi
fi
# Set up the errlogfile with appropriate permissions

View File

@ -1,7 +1,7 @@
diff -up mariadb-10.0.12/scripts/CMakeLists.txt.systemd mariadb-10.0.12/scripts/CMakeLists.txt
--- mariadb-10.0.12/scripts/CMakeLists.txt.systemd 2014-07-21 10:49:58.491470586 +0200
+++ mariadb-10.0.12/scripts/CMakeLists.txt 2014-07-21 14:21:22.673329708 +0200
@@ -368,6 +368,30 @@ ELSE()
@@ -368,6 +368,31 @@ ELSE()
COMPONENT ${${file}_COMPONENT}
)
ENDFOREACH()
@ -16,6 +16,7 @@ diff -up mariadb-10.0.12/scripts/CMakeLists.txt.systemd mariadb-10.0.12/scripts/
+ mariadb.service
+ mysqld.service
+ mariadb.tmpfiles.d
+ mysql.init
+ )
+ FOREACH(file ${SYSTEMD_SCRIPTS})
+ IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}.sh)

View File

@ -32,6 +32,7 @@ while /bin/true; do
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure." >&2
ret=$mret
break
fi

View File

@ -26,7 +26,7 @@
Description=MariaDB @MAJOR_VERSION@.@MINOR_VERSION@ database server
After=syslog.target
After=network.target
BindsTo=@RPM_PACKAGE_PREFIX@mysqld.service
BindsTo=@DAEMON_NAME2@.service
[Service]
Type=simple
@ -48,4 +48,4 @@ PrivateTmp=true
[Install]
WantedBy=multi-user.target
Also=@RPM_PACKAGE_PREFIX@mysqld.service
Also=@DAEMON_NAME2@.service

View File

@ -14,7 +14,11 @@
# those files may create issues
# ship_my_cnf=1 means this is the only package in distro which ships
# my.cnf and my.cnf.d
%if 0%{?fedora} >= 21
%global ship_my_cnf 1
%else
%global ship_my_cnf 0
%endif
# TokuDB engine is now part of MariaDB, but it is available only for x86_64;
# variable tokudb allows to build with TokuDB storage engine
@ -30,12 +34,19 @@
# fashion; enabled by default
%bcond_without oqgraph
# Name for the systemd unit file
%global daemon_unit %{name}.service
# Include files for SysV init or systemd
%if 0%{?systemd_requires:1}
%bcond_without init_systemd
%bcond_with init_sysv
%global daemon_name %{name}
# Provide temporary service file name that will be removed after some time
# (Fedora 22?)
%global mysqld_unit mysqld.service
%global mysqld_unit mysqld
%else
%bcond_with init_systemd
%bcond_without init_sysv
%global daemon_name mysqld
%endif
# MariaDB 10.0 and later requires pcre >= 8.35, otherwise we need to use
# the bundled library, since the package cannot be build with older version
@ -45,6 +56,15 @@
%bcond_with pcre
%endif
# We define some system's well known locations here so we can use them easily
# later when building to another location (like SCL)
%global logrotateddir %{_sysconfdir}/logrotate.d
%global logfiledir %{_localstatedir}/log/%{name}
%global logfile %{logfiledir}/%{name}.log
%if 0%{?fedora} >= 20
%global old_logfile %{_localstatedir}/log/mysqld.log
%endif
# The evr of mysql we want to obsolete
%global obsoleted_mysql_evr 5.6-0
%global obsoleted_mysql_case_evr 5.5.30-5
@ -87,6 +107,7 @@ Source13: mariadb-wait-ready.sh
Source14: mariadb-check-socket.sh
Source15: mariadb-scripts-common.sh
Source16: mysqld.service.in
Source17: mysql.init.in
Source50: rh-skipped-tests-base.list
Source51: rh-skipped-tests-intel.list
Source52: rh-skipped-tests-arm.list
@ -130,7 +151,7 @@ BuildRequires: perl(Data::Dumper)
BuildRequires: perl(Socket)
BuildRequires: perl(Test::More)
BuildRequires: perl(Time::HiRes)
BuildRequires: systemd
%{?with_init_systemd:BuildRequires: systemd}
Requires: bash
Requires: fileutils
@ -223,12 +244,14 @@ Requires: %{name}-common%{?_isa} = %{epoch}:%{version}-%{release}
Requires: %{name}-errmsg%{?_isa} = %{epoch}:%{version}-%{release}
Requires: sh-utils
Requires(pre): /usr/sbin/useradd
%if %{with init_systemd}
# We require this to be present for %%{_tmpfilesdir}
Requires: systemd
# Make sure it's there when scriptlets run, too
Requires(pre): systemd
Requires(posttrans): systemd
%{?systemd_requires: %systemd_requires}
%endif
# mysqlhotcopy needs DBI/DBD support
Requires: perl-DBI
Requires: perl-DBD-MySQL
@ -386,6 +409,8 @@ MariaDB is a community developed branch of MySQL.
%patch15 -p1
%patch16 -p1
sed -i -e 's/2.8.7/2.6.4/g' cmake/cpack_rpm.cmake
# workaround for upstream bug #56342
rm -f mysql-test/t/ssl_8k_key-master.opt
@ -410,7 +435,7 @@ cat %{SOURCE54} >> mysql-test/rh-skipped-tests.list
%endif
cp %{SOURCE2} %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} %{SOURCE14} \
%{SOURCE15} %{SOURCE16} scripts
%{SOURCE15} %{SOURCE16} %{SOURCE17} scripts
%build
@ -452,7 +477,10 @@ export LDFLAGS
cmake . -DBUILD_CONFIG=mysql_release \
-DFEATURE_SET="community" \
-DINSTALL_LAYOUT=RPM \
-DRPM_PACKAGE_PREFIX="" \
-DDAEMON_NAME="%{daemon_name}" \
%if 0%{?mysqld_unit:1}
-DDAEMON_NAME2="%{mysqld_unit}" \
%endif
-DRPM="%{?rhel:rhel%{rhel}}%{!?rhel:fedora%{fedora}}" \
-DCMAKE_INSTALL_PREFIX="%{_prefix}" \
%if 0%{?fedora} >= 20
@ -531,10 +559,12 @@ mv %{buildroot}%{_pkgdocdir}/MariaDB-server-%{version}/INFO_SRC %{buildroot}%{_l
mv %{buildroot}%{_pkgdocdir}/MariaDB-server-%{version}/INFO_BIN %{buildroot}%{_libdir}/mysql/
rm -rf %{buildroot}%{_pkgdocdir}/MariaDB-server-%{version}/
mkdir -p %{buildroot}%{_localstatedir}/log/%{name}
chmod 0750 %{buildroot}%{_localstatedir}/log/%{name}
touch %{buildroot}%{_localstatedir}/log/%{name}/%{name}.log
ln -s %{_localstatedir}/log/%{name}/%{name}.log %{buildroot}%{_localstatedir}/log/mysqld.log
mkdir -p %{buildroot}%{logfiledir}
chmod 0750 %{buildroot}%{logfiledir}
touch %{buildroot}%{logfile}
%if 0%{?old_logfile:1}
ln -s %{logfile} %{buildroot}%{old_logfile}
%endif
# current setting in my.cnf is to use /var/run/mariadb for creating pid file,
# however since my.cnf is not updated by RPM if changed, we need to create mysqld
@ -545,20 +575,33 @@ install -p -m 0755 -d %{buildroot}%{_localstatedir}/lib/mysql
%if %{ship_my_cnf}
install -D -p -m 0644 %{SOURCE3} %{buildroot}%{_sysconfdir}/my.cnf
%else
rm -f %{buildroot}%{_sysconfdir}/my.cnf.d/mysql-clients.cnf
rm -f %{buildroot}%{_sysconfdir}/my.cnf
%endif
# install systemd unit files and scripts for handling server startup
install -D -p -m 644 scripts/mariadb.service %{buildroot}%{_unitdir}/%{daemon_unit}
%if 0%{?mysqld_unit:1}
install -p -m 644 scripts/mysqld.service %{buildroot}%{_unitdir}/%{mysqld_unit}
%if %{with init_systemd}
install -D -p -m 644 scripts/mariadb.service %{buildroot}%{_unitdir}/%{daemon_name}.service
install -D -p -m 0644 scripts/mariadb.tmpfiles.d %{buildroot}%{_tmpfilesdir}/%{name}.conf
%endif
# install alternative systemd unit file for compatibility reasons
%if 0%{?mysqld_unit:1}
install -p -m 644 scripts/mysqld.service %{buildroot}%{_unitdir}/%{mysqld_unit}.service
%endif
# install SysV init script
%if %{with init_sysv}
install -D -p -m 755 scripts/mysql.init %{buildroot}%{_initddir}/%{daemon_name}
%endif
# helper scripts for service starting
install -p -m 755 scripts/mariadb-prepare-db-dir %{buildroot}%{_libexecdir}/mariadb-prepare-db-dir
install -p -m 755 scripts/mariadb-wait-ready %{buildroot}%{_libexecdir}/mariadb-wait-ready
install -p -m 755 scripts/mariadb-check-socket %{buildroot}%{_libexecdir}/mariadb-check-socket
install -p -m 644 scripts/mariadb-scripts-common %{buildroot}%{_libexecdir}/mariadb-scripts-common
install -D -p -m 0644 scripts/mariadb.tmpfiles.d %{buildroot}%{_tmpfilesdir}/%{name}.conf
# Remove libmysqld.a
rm -f %{buildroot}%{_libdir}/mysql/libmysqld.a
@ -587,9 +630,9 @@ rm -f %{buildroot}%{_mandir}/man1/mysql-test-run.pl.1*
rm -f %{buildroot}%{_bindir}/mytop
# put logrotate script where it needs to be
mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d
mv %{buildroot}%{_datadir}/%{name}/mysql-log-rotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
chmod 644 %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
mkdir -p %{buildroot}%{logrotateddir}
mv %{buildroot}%{_datadir}/%{name}/mysql-log-rotate %{buildroot}%{logrotateddir}/%{name}
chmod 644 %{buildroot}%{logrotateddir}/%{name}
mkdir -p %{buildroot}%{_sysconfdir}/ld.so.conf.d
echo "%{_libdir}/mysql" > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf
@ -610,7 +653,7 @@ rm -rf %{buildroot}%{_datadir}/%{name}/SELinux/
rm -f %{buildroot}%{_sysconfdir}/init.d/mysql
# remove duplicate logrotate script
rm -f %{buildroot}%{_sysconfdir}/logrotate.d/mysql
rm -f %{buildroot}%{logrotateddir}/mysql
# remove solaris files
rm -rf %{buildroot}%{_datadir}/%{name}/solaris/
@ -649,6 +692,7 @@ export MTR_BUILD_THREAD=%{__isa_bits}
/usr/sbin/useradd -M -N -g mysql -o -r -d %{_localstatedir}/lib/mysql -s /sbin/nologin \
-c "MariaDB Server" -u 27 mysql >/dev/null 2>&1 || :
%if %{with init_systemd}
# Explicitly enable mysqld if it was enabled in the beginning
# of the transaction. Otherwise mysqld is disabled always when
# replacing mysql with mariadb, because it is not recognized
@ -667,30 +711,52 @@ fi
%posttrans server
if [ -f %mysqld_enabled_flag_file ] ; then
/bin/systemctl enable %{daemon_unit} >/dev/null 2>&1 || :
/bin/systemctl enable %{daemon_name}.service >/dev/null 2>&1 || :
rm -f %mysqld_enabled_flag_file >/dev/null 2>&1 || :
fi
if [ -f %mysqld_running_flag_file ] ; then
/bin/systemctl start %{daemon_unit} >/dev/null 2>&1 || :
/bin/systemctl start %{daemon_name}.service >/dev/null 2>&1 || :
rm -f %mysqld_running_flag_file >/dev/null 2>&1 || :
fi
%endif
%post libs -p /sbin/ldconfig
%post server
%systemd_post %{daemon_unit}
%if %{with init_systemd}
%systemd_post %{daemon_name}.service
%endif
%if %{with init_sysv}
if [ $1 = 1 ]; then
/sbin/chkconfig --add %{daemon_name}
fi
%endif
/bin/chmod 0755 %{_localstatedir}/lib/mysql
%post embedded -p /sbin/ldconfig
%preun server
%systemd_preun %{daemon_unit}
%if %{with init_systemd}
%systemd_preun %{daemon_name}.service
%endif
%if %{with init_sysv}
if [ $1 = 0 ]; then
/sbin/service %{daemon_name} stop >/dev/null 2>&1
/sbin/chkconfig --del %{daemon_name}
fi
%endif
%postun libs -p /sbin/ldconfig
%postun server
%systemd_postun_with_restart %{daemon_unit}
%if %{with init_systemd}
%systemd_postun_with_restart %{daemon_name}.service
%endif
%if %{with init_sysv}
if [ $1 -ge 1 ]; then
/sbin/service %{daemon_name} condrestart >/dev/null 2>&1 || :
fi
%endif
%postun embedded -p /sbin/ldconfig
@ -740,10 +806,10 @@ fi
%doc storage/innobase/COPYING.Percona storage/innobase/COPYING.Google
# although the default my.cnf contains only server settings, we put it in the
# common package because it can be used for client settings too.
%dir %{_sysconfdir}/my.cnf.d
%if %{ship_my_cnf}
%config(noreplace) %{_sysconfdir}/my.cnf
%config(noreplace) %{_sysconfdir}/my.cnf.d/mysql-clients.cnf
%dir %{_sysconfdir}/my.cnf.d
%endif
%dir %{_datadir}/%{name}
%{_datadir}/%{name}/charsets
@ -852,21 +918,24 @@ fi
%{_datadir}/%{name}/mysql_performance_tables.sql
%{_datadir}/%{name}/my-*.cnf
%{?mysqld_unit:%{_unitdir}/%{mysqld_unit}}
%{_unitdir}/%{daemon_unit}
%{?mysqld_unit:%{_unitdir}/%{mysqld_unit}.service}
%{?with_init_systemd:%{_unitdir}/%{daemon_name}.service}
%{?with_init_sysv:%{_initddir}/%{daemon_name}}
%{_libexecdir}/mariadb-prepare-db-dir
%{_libexecdir}/mariadb-wait-ready
%{_libexecdir}/mariadb-check-socket
%{_libexecdir}/mariadb-scripts-common
%{_tmpfilesdir}/%{name}.conf
%{?with_init_systemd:%{_tmpfilesdir}/%{name}.conf}
%attr(0755,mysql,mysql) %dir %{_localstatedir}/run/mysqld
%attr(0755,mysql,mysql) %dir %{_localstatedir}/run/%{name}
%attr(0755,mysql,mysql) %dir %{_localstatedir}/lib/mysql
%attr(0750,mysql,mysql) %dir %{_localstatedir}/log/%{name}
%attr(0640,mysql,mysql) %config %ghost %verify(not md5 size mtime) %{_localstatedir}/log/%{name}/%{name}.log
%config %ghost %verify(not md5 size mtime) %{_localstatedir}/log/mysqld.log
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
%attr(0750,mysql,mysql) %dir %{logfiledir}
%attr(0640,mysql,mysql) %config %ghost %verify(not md5 size mtime) %{logfile}
%if 0%{?old_logfile:1}
%config %ghost %verify(not md5 size mtime) %{old_logfile}
%endif
%config(noreplace) %{logrotateddir}/%{name}
%if %{with oqgraph}
%files oqgraph
@ -905,6 +974,7 @@ fi
%changelog
* Tue Jul 22 2014 Honza Horak <hhorak@redhat.com> - 1:10.0.12-5
- Use variable for daemon unit name
- Include SysV init script if built on older system
* Mon Jul 21 2014 Honza Horak <hhorak@redhat.com> - 1:10.0.12-4
- Reformating spec and removing unnecessary snippets

View File

@ -1,2 +1,2 @@
d /var/run/@RPM_PACKAGE_PREFIX@mysqld 0755 mysql mysql -
d /var/run/@RPM_PACKAGE_PREFIX@mariadb 0755 mysql mysql -
d /var/run/@DAEMON_NAME2@ 0755 mysql mysql -
d /var/run/@DAEMON_NAME@ 0755 mysql mysql -

177
mysql.init.in Normal file
View File

@ -0,0 +1,177 @@
#!/bin/sh
#
# @DAEMON_NAME@ This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: @sysconfdir@/my.cnf
# pidfile: /var/run/@DAEMON_NAME@/@DAEMON_NAME@.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
exec="@bindir@/mysqld_safe"
prog="@DAEMON_NAME@"
# Set timeouts here so they can be overridden from /etc/sysconfig/@DAEMON_NAME@
STARTTIMEOUT=300
STOPTIMEOUT=60
# User and group the daemon will run under
MYUSER=mysql
MYGROUP=mysql
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/$prog
# get options from my.cnf
source "@libexecdir@/mariadb-scripts-common"
start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$pidfile" ]; then
MYSQLPID=`cat "$pidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`@bindir@/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
@libexecdir@/mariadb-prepare-db-dir $MYUSER $MYGROUP || return 4
@libexecdir@/mariadb-check-socket || return 1
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --datadir="$datadir" --socket="$socketfile" \
--pid-file="$pidfile" \
--basedir=@prefix@ --user=$MYUSER >/dev/null 2>&1 &
safe_pid=$!
# Wait until the daemon is up
@libexecdir@/mariadb-wait-ready "$safe_pid"
ret=$?
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $pidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}
stop(){
if [ ! -f "$pidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$pidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
if ! [ -d "/proc/$MYSQLPID" ] ; then
# process doesn't run anymore
action $"Stopping $prog: " /bin/true
return 0
fi
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
# kill command failed, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}
restart(){
stop
start
}
condrestart(){
[ -e $lockfile ] && restart || :
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$pidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?

View File

@ -1,6 +1,6 @@
[Unit]
Description=MySQL compatibility service (another name for @RPM_PACKAGE_PREFIX@mariadb.service; you should use @RPM_PACKAGE_PREFIX@mariadb.service instead)
BindsTo=@RPM_PACKAGE_PREFIX@mariadb.service
Description=MySQL compatibility service (another name for @DAEMON_NAME@.service; you should use @DAEMON_NAME@.service instead)
BindsTo=@DAEMON_NAME@.service
[Service]
Type=oneshot
@ -9,4 +9,4 @@ RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Also=@RPM_PACKAGE_PREFIX@mariadb.service
Also=@DAEMON_NAME@.service