Browse Source
new: [logrotate,odoo-tecnativa,apache,cron,letsencrypt] added charm ``logrotate`` and added logrotation to bunch of charms.
framadate
new: [logrotate,odoo-tecnativa,apache,cron,letsencrypt] added charm ``logrotate`` and added logrotation to bunch of charms.
framadate
Valentin Lab
6 years ago
12 changed files with 272 additions and 20 deletions
-
3apache/hooks/log_rotate-relation-joined
-
20cron/hooks/init
-
3cron/hooks/log_rotate-relation-joined
-
7letsencrypt/hooks/schedule_command-relation-joined
-
10logrotate/build/Dockerfile
-
38logrotate/build/src/bin/docker-send-signal
-
13logrotate/build/src/entrypoint.sh
-
80logrotate/hooks/log_rotate-relation-joined
-
32logrotate/hooks/schedule_command-relation-joined
-
13logrotate/metadata.yml
-
50odoo-tecnativa/hooks/log_rotate-relation-joined
-
1odoo-tecnativa/metadata.yml
@ -0,0 +1,10 @@ |
|||
FROM docker.0k.io/alpine |
|||
|
|||
RUN apk add logrotate && \ |
|||
sed -ri 's/^(\/var\/log\/messages \{\})$/# \1/g' /etc/logrotate.conf |
|||
|
|||
RUN apk add netcat-openbsd ## dependency of docker-send-signal |
|||
|
|||
COPY src/ / |
|||
|
|||
ENTRYPOINT ["/entrypoint.sh"] |
@ -0,0 +1,38 @@ |
|||
#!/bin/bash |
|||
|
|||
exname=$(basename "$0") |
|||
usage="$exname [-h|--help] CONTAINER SIGNAL" |
|||
|
|||
container= |
|||
signal= |
|||
while [ "$1" ]; do |
|||
case "$1" in |
|||
"--help"|"-h") |
|||
echo "$usage" >&2 |
|||
exit 0 |
|||
;; |
|||
*) |
|||
[ -z "$container" ] && { container=$1 ; shift ; continue ; } |
|||
[ -z "$signal" ] && { signal=$1 ; shift ; continue ; } |
|||
echo "Unexpected argument '$1'." >&2 |
|||
exit 1 |
|||
;; |
|||
esac |
|||
shift |
|||
done |
|||
|
|||
if [ -z "$container" ]; then |
|||
echo "You must provide a container name/id as first argument." >&2 |
|||
echo "$usage" >&2 |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ -z "$signal" ]; then |
|||
echo "You must provide a signal to send to $container aargument." >&2 |
|||
echo "$usage" >&2 |
|||
exit 1 |
|||
fi |
|||
|
|||
container_id="$(docker inspect --format="{{ .Id }}" "$container")" |
|||
|
|||
echo -e "POST /containers/$container_id/kill?signal=$signal HTTP/1.0\r\n" | nc -U /var/run/docker.sock |
@ -0,0 +1,13 @@ |
|||
#!/bin/sh |
|||
|
|||
# Clean non existent log file entries from status file |
|||
cd /var/lib/logrotate |
|||
test -e status || touch status |
|||
head -1 status > status.clean |
|||
sed 's/"//g' status | while read logfile date |
|||
do |
|||
[ -e "$logfile" ] && echo "\"$logfile\" $date" |
|||
done >> status.clean |
|||
mv status.clean status |
|||
|
|||
/usr/sbin/logrotate /etc/logrotate.conf |
@ -0,0 +1,80 @@ |
|||
#!/bin/bash |
|||
|
|||
## Should be executable N time in a row with same result. |
|||
|
|||
exit 0 |
|||
. lib/common |
|||
|
|||
set -e |
|||
|
|||
LOGS=/var/log/apache2 |
|||
|
|||
|
|||
|
|||
## XXXvlab: hum it seems apache logging is run as root, so well... |
|||
# logs_creds=$(cached_cmd_on_base_image apache "stat -c '%u %g' '$LOGS'") || { |
|||
# debug "Failed to query for www-data gid in ${DARKYELLOW}apache${NORMAL} base image." |
|||
# return 1 |
|||
# } |
|||
|
|||
rotated_count=$(relation-get rotated-count 2>/dev/null) || true |
|||
rotated_count=${rotated_count:-52} |
|||
|
|||
## XXXvlab: a lot of this intelligence should be moved away into |
|||
## ``logrotate`` charm |
|||
## |
|||
## Issues: |
|||
## - relation-joined will execute first log-rotate charm part of the |
|||
## relation, which is not what we want here, as we need to send |
|||
## default value for the creation of the config file on the server |
|||
## part. |
|||
## - we need to send the directory it seems, otherwise, docker will |
|||
## create directory when the log file is missing, and I'm not sure |
|||
## how processes will react when their file is moved out of their |
|||
## file-system scope when rotated (but I think there will be no |
|||
## issue here). |
|||
## The problem here is that we can't cleanly put all file in the |
|||
## same directory (and there are collision possible anyway). |
|||
## This means that if we want more than one target, we need |
|||
## sub-directories. |
|||
## - For this issue, we only fear the 'docker' run and mounting |
|||
## moment, and we are sure to run before, so we can make sure to |
|||
## ``touch`` the files. |
|||
## - can we move file that was been bound in a docker ? Well yes, |
|||
## but it won't change place in the docker:( ... I guess you need |
|||
## to reload the docker and the binding to work. |
|||
## |
|||
|
|||
DST="$CONFIGSTORE/$TARGET_SERVICE_NAME/etc/logrotate.d/$SERVICE_NAME" |
|||
file_put "$DST" <<EOF |
|||
/var/log/docker/$SERVICE_NAME/*error.log |
|||
/var/log/docker/$SERVICE_NAME/*access.log |
|||
{ |
|||
weekly |
|||
missingok |
|||
dateext |
|||
dateyesterday |
|||
dateformat _%Y-%m-%d |
|||
extension .log |
|||
rotate $rotated_count |
|||
compress |
|||
delaycompress |
|||
notifempty |
|||
create 640 root root |
|||
sharedscripts |
|||
postrotate |
|||
docker-send-signal \$${MASTER_BASE_CHARM_NAME^^}_NAME SIGUSR1; |
|||
endscript |
|||
} |
|||
EOF |
|||
|
|||
config-add "\ |
|||
$MASTER_TARGET_CHARM_NAME: |
|||
volumes: |
|||
- $DST:/etc/logrotate.d/docker-${SERVICE_NAME}:ro |
|||
- $SERVICE_DATASTORE$LOGS:/var/log/docker/$SERVICE_NAME:rw |
|||
$MASTER_BASE_CHARM_NAME: |
|||
volumes: |
|||
- $SERVICE_DATASTORE$LOGS:$LOGS:rw |
|||
" |
|||
|
@ -0,0 +1,32 @@ |
|||
#!/bin/bash |
|||
|
|||
## When writing relation script, remember: |
|||
## - they should be idempotents |
|||
## - they can be launched while the dockers is already up |
|||
## - they are launched from the host |
|||
## - the target of the link is launched first, and get a chance to ``relation-set`` |
|||
## - both side of the scripts get to use ``relation-get``. |
|||
|
|||
set -e |
|||
|
|||
label=launch-$SERVICE_NAME |
|||
DST=$CONFIGSTORE/$TARGET_SERVICE_NAME/etc/cron/$label |
|||
schedule=$(relation-get schedule) || true |
|||
|
|||
## It should really stay at midnight as most logs are dated |
|||
schedule=${schedule:-0 0 * * *} |
|||
if ! echo "$schedule" | egrep '^\s*(([0-9/,*-]+\s+){4,4}[0-9/,*-]+|@[a-z]+)\s*$' >/dev/null 2>&1; then |
|||
err "Unrecognized schedule '$schedule'." |
|||
exit 1 |
|||
fi |
|||
|
|||
## Warning: using '\' in heredoc will be removed in the final cron file, which |
|||
## is totally wanted: cron does not support multilines. |
|||
|
|||
## Warning: 'docker -v' will use HOST directory even if launched from |
|||
## 'cron' container. |
|||
file_put "$DST" <<EOF |
|||
$schedule root lock $label -D -p 10 -c "\ |
|||
dc run $SERVICE_NAME" 2>&1 | ts '\%F \%T \%Z' >> /var/log/cron/${label}_script.log |
|||
EOF |
|||
chmod +x "$DST" |
@ -0,0 +1,13 @@ |
|||
description: Log Rotation Service |
|||
type: run-once |
|||
data-resources: |
|||
- /var/lib/logrotate |
|||
requires: |
|||
schedule-command: |
|||
interface: schedule-command |
|||
## YYY: probably not useful anymore |
|||
# charm-resources: |
|||
# - /etc/cron.daily/logrotate |
|||
provides: |
|||
log-rotate: |
|||
tech-dep: "reversed" |
@ -0,0 +1,50 @@ |
|||
#!/bin/bash |
|||
|
|||
## Should be executable N time in a row with same result. |
|||
|
|||
. lib/common |
|||
|
|||
set -e |
|||
|
|||
odoo_uid=$(get_odoo_uid) |
|||
|
|||
LOGS=/var/log/odoo |
|||
mkdir -p "$SERVICE_DATASTORE/$LOGS" |
|||
chown -R "$odoo_uid" "$SERVICE_DATASTORE/$LOGS" |
|||
|
|||
rotated_count=$(relation-get rotated-count 2>/dev/null) || true |
|||
rotated_count=${rotated_count:-52} |
|||
|
|||
## No postrotate script as odoo uses a WatchedFileHandler log that |
|||
## close and reopen log file if it changes. |
|||
|
|||
## XXXvlab: a lot of this intelligence should be moved away into ``logrotate`` charm |
|||
DST="$CONFIGSTORE/$TARGET_SERVICE_NAME/etc/logrotate.d/$SERVICE_NAME" |
|||
file_put "$DST" <<EOF |
|||
/var/log/docker/$SERVICE_NAME/odoo.log |
|||
{ |
|||
weekly |
|||
missingok |
|||
dateext |
|||
dateyesterday |
|||
dateformat _%Y-%m-%d |
|||
extension .log |
|||
rotate $rotated_count |
|||
compress |
|||
delaycompress |
|||
notifempty |
|||
create 640 |
|||
sharedscripts |
|||
} |
|||
EOF |
|||
|
|||
config-add "\ |
|||
services: |
|||
$MASTER_TARGET_SERVICE_NAME: |
|||
volumes: |
|||
- $DST:/etc/logrotate.d/docker-${SERVICE_NAME}:ro |
|||
- $SERVICE_DATASTORE$LOGS:/var/log/docker/$SERVICE_NAME:rw |
|||
$MASTER_BASE_SERVICE_NAME: |
|||
volumes: |
|||
- $SERVICE_DATASTORE$LOGS:$LOGS:rw |
|||
" |
Write
Preview
Loading…
Cancel
Save
Reference in new issue