Compare commits

...

99 commits

Author SHA1 Message Date
David Prevot 2560deec1e Follow symlinx for LXC containers 2024-01-17 11:39:06 +01:00
Jérémy Lecour d01286e0b9
Release 23.10.1 2023-10-09 18:10:17 +02:00
Jérémy Lecour 2f2e723bc0
Use a special variable name since USER is always defined from the environment 2023-10-09 18:09:34 +02:00
Jérémy Lecour 252fe746a7
Release 23.10 2023-10-09 16:22:02 +02:00
Jérémy Lecour 8a7cf0a941
switch to -u,--user to force a specific user 2023-10-09 16:07:34 +02:00
Brice Waegeneire 1cbe1a6c1e Ajout hooks git de gestion de droits 2023-06-14 18:01:15 +02:00
Brice Waegeneire f594a54e07 Fix missing parsing of --autosysadmin flag 2022-07-07 10:58:07 +02:00
Brice Waegeneire 33504c4c01 Release 22.07 2022-07-05 16:53:26 +02:00
Brice Waegeneire 21f7464d42 Add --autosysadmin flag 2022-07-05 16:47:07 +02:00
Brice Waegeneire 95b45bac8e add support for autosysadmin 2022-05-31 18:19:58 +02:00
Mathieu Trossevin 4ef8878bcf Merge pull request 'Add commiting changes to /etc in lxc containers' (#15) from lxc-etc-git into master
Reviewed-on: #15
2022-03-17 18:04:19 +01:00
Mathieu Trossevin a33021b041
Add commiting changes to /etc in lxc containers 2022-03-17 17:53:15 +01:00
Jérémy Lecour 9aa16dff73 Release 22.01 2022-01-25 10:57:22 +01:00
Jérémy Lecour b8bb014b8d Add version/host/user headers in sent email 2022-01-25 10:48:35 +01:00
Jérémy Lecour 334ef62d43 whitespace 2021-10-19 22:35:40 +02:00
Jérémy Lecour c83a1043c7 Release 0.6.4 2021-06-17 10:55:57 +02:00
Jérémy Lecour 46b8015d93 fallback if findmnt is absent 2021-06-17 10:54:59 +02:00
Jérémy Lecour 026fb9f5cd update README 2020-03-02 22:20:25 +01:00
Jérémy Lecour 88187912cd Update debian changelog in case we ever use it again 2020-03-02 22:18:05 +01:00
Jérémy Lecour edca7cee17 Release 0.6.3 2020-03-02 22:10:57 +01:00
Jérémy Lecour 26d4a2e219 Notify syslog when partitions are re-mounted (Linux) 2020-03-02 22:10:31 +01:00
Jérémy Lecour f5abdd2912 Release 0.6.2 2020-03-02 14:44:56 +01:00
Jérémy Lecour a811b008c7 better read-only detection for Linux 2020-03-02 14:43:47 +01:00
Tristan PILAT 29ac93e250 Following last modifications, increment version 2019-11-15 16:53:14 +01:00
Tristan PILAT c88bc83145 Fix an escape bug
printf: unknown escape sequence `\ '
2019-11-15 16:48:50 +01:00
Tristan PILAT bf6cf1bf00 Introduce an OS condition to handle OpenBSD
Amended functions are the following:

is_repository_readonly()
remount_repository_readwrite()
remount_repository_readonly()
2019-11-15 16:45:45 +01:00
Jérémy Lecour 63c83ae1ee changed to a structured CHANGELOG 2019-11-05 16:48:40 +01:00
Jérémy Lecour 15b5cd62bc Release 0.6.0 2019-11-05 14:51:56 +01:00
Jérémy Lecour c8155a8d99 commit changes in /usr/share/scripts/ if needed 2019-11-05 14:51:49 +01:00
Jérémy Lecour a159f77649 Add /usr/share/scripts to the list of possible Git repositories 2019-10-30 13:25:16 +01:00
Jérémy Lecour 9f3e90766d Version 0.5.1 2019-08-21 15:39:18 +02:00
Jérémy Lecour a3fb426ecf verify command presence only if needed 2019-08-21 15:37:10 +02:00
Jérémy Lecour 0503838b5b Merge branch 'hook-api' of evolix/evomaintenance into master 2019-04-26 10:43:49 +02:00
Nicolas Roman f7fa476de8 changed error handling for curl and the backend 2019-04-10 14:49:02 +02:00
Nicolas Roman fe095a20f7 set --no-db argument to default 2019-04-10 14:37:14 +02:00
Nicolas Roman 5ad41113ad added return code handler for curl 2019-04-10 10:45:21 +02:00
Nicolas Roman 8c6c7d5b00 added hook_api 2019-03-28 15:46:40 +01:00
Jérémy Lecour afab06ee38 Merge branch 'options' of evolix/evomaintenance into master
Major rewrite of evomaintenance to add options (configuration and runtime)
2019-03-26 15:14:11 +01:00
Jérémy Lecour d449be172c update Debian changelog 2019-03-26 15:12:22 +01:00
Jérémy Lecour 5a28e2bfb7 Version 0.5.0 2019-03-26 15:04:48 +01:00
Jérémy Lecour 68d88abb7c evocheck is disabled by default
the feature is not completely ready
2019-03-26 15:04:13 +01:00
Jérémy Lecour def18270f1 Add evocheck execution 2019-03-19 13:51:42 +01:00
Jérémy Lecour a36b0bed83 comment *_SHORT variables 2019-03-19 13:50:52 +01:00
Jérémy Lecour 22635267fe explicite dependencies + safeguard missing commands 2019-03-18 23:25:18 +01:00
Jérémy Lecour 13885a4743 whitespaces 2019-03-18 23:24:31 +01:00
Jérémy Lecour b13c627230 We don't need the template file anymore 2019-03-18 23:24:09 +01:00
Jérémy Lecour 47c452f977 quote grep parameter 2019-03-18 22:59:37 +01:00
Jérémy Lecour 8d0eddaf6f bump version 2019-03-18 15:11:16 +01:00
Jérémy Lecour a7e1133408 Show more git stats 2019-03-18 15:11:09 +01:00
Jérémy Lecour bea327a254 embed the template in a function
sed is not very good with multi-line search/replace, so we've decided to 
use a shell function to format the mail.
2019-03-18 14:15:09 +01:00
Jérémy Lecour b8b94a66ce ignore unknown arguments that don't start with a "-" 2019-03-18 13:36:07 +01:00
Jérémy Lecour c9c061f811 long and short commit information 2019-03-18 07:44:28 +01:00
Jérémy Lecour 80087f3c38 small display fix 2019-03-16 20:09:33 +01:00
Jérémy Lecour d05de0f925 replace $(echo $(cmd)) by $(cmd) 2019-03-16 19:40:53 +01:00
Jérémy Lecour 71d1fc417c "who -m" output must be normalized 2019-03-16 19:40:20 +01:00
Jérémy Lecour ac86a97531 update README 2019-03-16 12:14:44 +01:00
Jérémy Lecour 8561d64c0e README in Markdown 2019-03-16 12:13:23 +01:00
Jérémy Lecour ac111c2742 update README with usage output 2019-03-16 12:12:48 +01:00
Jérémy Lecour c47ebee7c0 Improve logging
logging is treated as other hooks regarding verbose and dry-run modes
2019-03-15 22:53:08 +01:00
Jérémy Lecour 72f7dc1159 reading from stdin is back! 2019-03-13 15:40:48 +01:00
Jérémy Lecour 7a2945a1e3 bump beta version 2019-03-13 15:35:44 +01:00
Jérémy Lecour 6d134e2d89 move copyrigh and license into "show_version()" 2019-03-12 23:57:24 +01:00
Jérémy Lecour 42b781db96 Display git statuses before typing the message 2019-03-12 23:31:58 +01:00
Jérémy Lecour ca9c7ec654 Add "auto" mode 2019-03-12 23:29:25 +01:00
Jérémy Lecour 0a6a45066d Split interactive and non interactive parts of hooks execution 2019-03-12 22:49:27 +01:00
Jérémy Lecour e0a75db015 typo 2019-03-12 12:12:02 +01:00
Jérémy Lecour 7b2a3fbcd1 bump version to 0.5.0.beta3 2019-03-10 23:04:22 +01:00
Jérémy Lecour d619072254 replace - by * so printf doesn't think they are options 2019-03-10 23:01:59 +01:00
Jérémy Lecour cc71b797c9 bump version to 5.0.0.beta2 2019-03-10 22:54:56 +01:00
Jérémy Lecour 5f06aec803 replace nested if/else/if with if/elif 2019-03-10 22:32:49 +01:00
Jérémy Lecour 7833c9c3ee replace a couple of echo with printf 2019-03-10 22:32:03 +01:00
Jérémy Lecour 42bb96d005 Let's consider that [] is the default test idiom when combined with if 2019-03-10 22:31:34 +01:00
Jérémy Lecour 90e3bc188f binaries and interactive variables are readonly 2019-03-10 19:06:59 +01:00
Jérémy Lecour 0514663977 simplify default values declaration 2019-03-10 19:06:39 +01:00
Jérémy Lecour b1e2a6ac0f Rename variables for hooks 2019-03-10 19:05:30 +01:00
Jérémy Lecour 9f99b12cd4 update changelogs 2019-03-10 11:16:57 +01:00
Jérémy Lecour 3ded64677f whitespace 2019-03-10 00:47:58 +01:00
Jérémy Lecour 434536b1e9 Use multiple sed (internal) commands
Instead of a single command with ultiple substitutions, we use multiple 
(internal) commands, for better error handling and line-splitting.
2019-03-10 00:42:25 +01:00
Jérémy Lecour e31e5c73df quote PG variables 2019-03-10 00:40:46 +01:00
Jérémy Lecour 6568e66f73 Use printf instead of echo
The behaviour of "echo" is unspecified when the string contains 
backslashes.
2019-03-10 00:34:33 +01:00
Jérémy Lecour 0c6123bb54 Add "version" and "help" options 2019-03-10 00:31:28 +01:00
Jérémy Lecour d01e79e832 add a prompt indicator 2019-03-09 22:09:26 +01:00
Jérémy Lecour ca62314864 initialize GIT_COMMITS variable 2019-03-09 22:03:25 +01:00
Jérémy Lecour 44d83dd474 fix hook_mail with for yes answer 2019-03-09 22:03:09 +01:00
Jérémy Lecour cf05263adb move questions in the while loop 2019-03-09 21:59:37 +01:00
Jérémy Lecour 1bfe7c4b86 The mail recipient can be modified on the fly 2019-03-09 21:59:17 +01:00
Jérémy Lecour c2b44f0e48 extract functions 2019-03-09 21:57:56 +01:00
Jérémy Lecour 997eff6ca7 interactive hooks + add verbose mode + shellcheck fixes 2019-03-09 20:56:53 +01:00
Jérémy Lecour b9da112b6d Add real interactive mode
The message can be given as an option, as stdin or interactively.
2019-03-09 14:01:38 +01:00
Jérémy Lecour 293c38fb83 Improve "dry run" mode
Hooks are executed, but they show the actions instead of doing them.
2019-03-09 13:48:38 +01:00
Jérémy Lecour 463555475b Add dry-run option 2019-03-07 23:28:13 +01:00
Jérémy Lecour d9fedcdbcf use test instead of [] 2019-03-07 23:28:13 +01:00
Jérémy Lecour 4e2d55ea5e fix git diff append 2019-03-07 23:28:13 +01:00
Jérémy Lecour b73bd72eac Use $(...) notation instead of legacy backticked ... 2019-03-07 23:28:13 +01:00
Jérémy Lecour 6b70d2416c rename hook functions 2019-03-07 23:28:13 +01:00
Jérémy Lecour e528a27048 extract more functions 2019-03-07 23:28:13 +01:00
Jérémy Lecour d26aea7ab2 Parse options 2019-03-07 23:28:13 +01:00
Jérémy Lecour 3dba4f7fc1 extract functions 2019-03-07 23:28:13 +01:00
Jérémy Lecour 5e0705391e whitespaces 2019-03-07 23:28:02 +01:00
13 changed files with 963 additions and 199 deletions

98
CHANGELOG.md Normal file
View file

@ -0,0 +1,98 @@
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project **does not adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html)**.
## [Unreleased]
### Added
### Changed
### Deprecated
### Removed
### Fixed
### Security
## [23.10.1] - 2023-10-09
### Fixed
* Use a special variable name since USER is always defined from the environment
## [23.10] - 2023-10-09
### Added
* Force a user name with `-u,--user` option (default is still `logname(1)`).
* More people credited
### Deprecated
* `--autosysadmin` is replaced by `--user autosysadmin`
## [22.07] - 2022-07-05
### Added
* Add `--autosysadmin` flag
* Commit change in /etc of lxc containers
### Changed
### Deprecated
### Removed
### Fixed
### Security
## [22.01] - 2022-01-25
### Added
* version/host/user headers in sent email
### Changed
New version pattern
## [0.6.4] - 2021-06-17
### Added
* fallback if findmnt is absent
## [0.6.3] - 2020-02-02
### Added
* Notify syslog when partitions are re-mounted (Linux)
## [0.6.2] - 2020-02-02
### Fixed
* better detection of read-only partitions (Linux)
## [0.6.0] - 2019-11-05
### Added
* commit changes in /usr/share/scripts/ if needed
## Previous changelog
* 0.5.0 : options et mode interactif pour l'exécution des actions, meilleure compatibilité POSIX
* 0.4.1 : Utilisation de "printf" à la place de "echo" pour mieux gérer les sauts de ligne
* 0.4.0 : Amélioration de la récupération d'information (plus de cas gérés). Infos Git avant la saisie.
* 0.3.0 : Écriture dans un fichier de log, amélioration de la récupération d'informations, amélioration de la syntaxe shell
* 0.2.7 : Correction d'un bug lors de l'utilisation de '&' dans le texte
* 0.2.6 : Precision du charset dans les entetes du mail
* 0.2.5 : Correction d'un bug avec le path de sendmail sous OpenBSD
* 0.2.4 : Correction d'un bug lors de l'utilisation de '/' dans le texte
* 0.2.3 : Correction d'un bug avec $REALM

7
README
View file

@ -1,7 +0,0 @@
script for Evolix maintenance
=============================
script evomaintenance.sh which sends a mail
for each intervention on a Pack Evolix server.
* Pb quand '&' dans le msg d'evomaintenance...

30
README.md Normal file
View file

@ -0,0 +1,30 @@
# Evomaintenance
```.plain
$ evomaintenance --help
evomaintenance is a program that helps reporting what you've done on a server
Usage: evomaintenance
or evomaintenance --message="add new host"
or evomaintenance --no-api --no-mail --no-commit
or echo "add new vhost" | evomaintenance
Options
-m, --message=MESSAGE set the message from the command line
--mail enable the mail hook (default)
--no-mail disable the mail hook
--db enable the database hook
--no-db disable the database hook (default)
--api enable the API hook (default)
--no-api disable the API hook
--commit enable the commit hook (default)
--no-commit disable the commit hook
--evocheck enable evocheck execution (default)
--no-evocheck disable evocheck execution
--auto use "auto" mode
--no-auto use "manual" mode (default)
-v, --verbose increase verbosity
-n, --dry-run actions are not executed
--help print this message and exit
--version print version and exit
```

5
Vagrantfile vendored
View file

@ -10,7 +10,7 @@ load File.expand_path(vagrantfile) if File.exists?(vagrantfile)
Vagrant.configure('2') do |config|
config.vm.synced_folder "./", "/vagrant", type: "rsync", rsync__exclude: [ '.vagrant', '.git' ]
config.ssh.shell = "/bin/sh"
$deps = <<SCRIPT
DEBIAN_FRONTEND=noninteractive apt-get -yq install postgresql-client sudo sendmail
SCRIPT
@ -22,7 +22,6 @@ if [ ! -d /usr/share/scripts ]; then
chown root:$1 /usr/share/scripts
fi
ln -fs /vagrant/evomaintenance.sh /usr/share/scripts
ln -fs /vagrant/evomaintenance.tpl /usr/share/scripts
ln -fs /vagrant/evomaintenance.cf /etc
SCRIPT
@ -50,7 +49,7 @@ SCRIPT
config.vm.define "#{i[:name]}" do |node|
node.vm.hostname = "evomaintenance-#{i[:name]}"
node.vm.box = "#{i[:box]}"
config.vm.provision "deps", type: "shell", :inline => $deps if "#{i[:name]}" == "debian"
config.vm.provision "deps", type: "shell", :inline => "pkg_add postgresql-client-10.5p1" if "#{i[:name]}" == "openbsd"
config.vm.provision "install", type: "shell", :inline => $install, :args => ["#{i[:group]}"]

View file

@ -1,8 +0,0 @@
0.4.1 : Utilisation de "printf" à la place de "echo" pour mieux gérer les sauts de ligne
0.4.0 : Amélioration de la récupération d'information (plus de cas gérés). Infos Git avant la saisie.
0.3.0 : Écriture dans un fichier de log, amélioration de la récupération d'informations, amélioration de la syntaxe shell
0.2.7 : Correction d'un bug lors de l'utilisation de '&' dans le texte
0.2.6 : Precision du charset dans les entetes du mail
0.2.5 : Correction d'un bug avec le path de sendmail sous OpenBSD
0.2.4 : Correction d'un bug lors de l'utilisation de '/' dans le texte
0.2.3 : Correction d'un bug avec $REALM

3
contrib/git-hook-post-checkout Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
# Git pre-checkout hook restoring permissions and ownerships.
mtree -u < .mtree

26
contrib/git-hook-pre-commit Executable file
View file

@ -0,0 +1,26 @@
#!/bin/sh
# Git pre-commit hook storing permissions and ownerships.
mtreeignore=$(mktemp --suffix mtree)
mtree_exclude() {
echo .git
# Get ignored files from git https://stackoverflow.com/a/467053
find . -not -path './.git/*' | git check-ignore --stdin
}
# In case .mtree doens't exists yet, we still want it in the specification
# to be generated.
if [ -f .mtree ]; then
touch .mtree
fi
mtree_exclude > "$mtreeignore"
trap 'rm --force "$mtreeignore"' EXIT
mtree -x -c \
-p . \
-k uname,gname,mode \
-X "$mtreeignore" > .mtree
git add .mtree

38
debian/changelog vendored
View file

@ -1,8 +1,32 @@
evomaintenance (0.4.1-1) UNRELEASED; urgency=low
evomaintenance (0.6.3-1) UNRELEASED; urgency=low
* Use "printf" instead of "echo" for better line breaks support
* fix partitions re-mounting before/after commits
-- Jérémy Lecour <jlecour@evolix.fr> Tue, 25 Sep 2018 11:54:12 +0200
-- Jérémy Lecour <jlecour@evolix.fr> Mon, 3 Mar 2020 22:14:12 +0100
evomaintenance (0.6.0-1) UNRELEASED; urgency=low
* commit changes in /usr/share/scripts/ if needed
-- Jérémy Lecour <jlecour@evolix.fr> Tue, 5 Nov 2019 14:50:12 +0100
evomaintenance (0.5.1-1) UNRELEASED; urgency=low
* verify commands presence only if needed
-- Jérémy Lecour <jlecour@evolix.fr> Wed, 21 Aug 2019 15:38:12 +0200
evomaintenance (0.5.0-1) UNRELEASED; urgency=low
* options and interactive mode for selective hooks execution, and better POSIX compliance
-- Jérémy Lecour <jlecour@evolix.fr> Sun, 26 Mar 2019 11:13:12 +0100
evomaintenance (0.4.1-1) UNRELEASED; urgency=low
* Use "printf" instead of "echo" for better line breaks support
-- Jérémy Lecour <jlecour@evolix.fr> Tue, 25 Sep 2018 11:54:12 +0200
evomaintenance (0.4.0-1) UNRELEASED; urgency=low
@ -33,7 +57,7 @@ evomaintenance (0.2.8-1) UNRELEASED; urgency=medium
evomaintenance (0.2.7-1) UNRELEASED; urgency=low
* New upstream release.
* This version fixes bug when text contains a character '&'.
* This version fixes bug when text contains a character '&'.
-- Gregory Colpart <reg@debian.org> Thu, 11 Mar 2010 16:14:19 +0100
@ -41,7 +65,7 @@ evomaintenance (0.2.6-1) UNRELEASED; urgency=low
* New upstream release.
* This version fixes the bug for charset in mail.
* Add Build-Depends on debhelper.
* Add Build-Depends on debhelper.
-- Gregory Colpart <reg@debian.org> Mon, 01 Jun 2009 15:57:32 +0200
@ -62,13 +86,13 @@ evomaintenance (0.2.3-1) UNRELEASED; urgency=low
evomaintenance (0.2.2-1) UNRELEASED; urgency=low
* New upstream release.
* Fix debian/rules to have correct permissions.
* Fix debian/rules to have correct permissions.
-- Gregory Colpart <reg@debian.org> Mon, 10 Nov 2008 00:09:39 +0100
evomaintenance (0.2.1-1) UNRELEASED; urgency=low
* New upstream release.
* New upstream release.
-- Gregory Colpart <reg@debian.org> Sun, 9 Nov 2008 22:37:20 +0100

3
debian/control vendored
View file

@ -7,8 +7,7 @@ Standards-Version: 3.8.0
Package: evomaintenance
Architecture: all
Depends: postgresql-client, sudo
Depends: coreutils, sudo, sed, hostname, postfix, git, postgresql-client
Description: script for Evolix maintenance
This package contains the script evomaintenance.sh
which sends a mail for each intervention on a Pack Evolix server.

7
debian/rules vendored
View file

@ -12,19 +12,18 @@ build: build-stamp
build-stamp:
dh_testdir
touch $@
clean:
clean:
dh_testdir
dh_testroot
rm -f build-stamp
dh_clean
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_clean -k
dh_installdirs
install -m 700 -d $(CURDIR)/debian/evomaintenance/usr/share/scripts
install -m 700 evomaintenance.sh $(CURDIR)/debian/evomaintenance/usr/share/scripts/
install -m 600 evomaintenance.tpl $(CURDIR)/debian/evomaintenance/usr/share/scripts/
install -m 755 -d $(CURDIR)/debian/evomaintenance/etc
install -m 600 evomaintenance.cf $(CURDIR)/debian/evomaintenance/etc/
# Build architecture-independent files here.

View file

@ -13,3 +13,5 @@ FULLFROM="John Doe <jdoe@example.com>"
URGENCYFROM=mama.doe@example.com
URGENCYTEL="06.00.00.00.00"
REALM=example.com
API_ENDPOINT=https://example.com/api/
API_KEY=secretkey

View file

@ -1,198 +1,830 @@
#!/bin/sh
# EvoMaintenance script
# Dependencies (all OS): git postgresql-client
# Dependencies (Debian): sudo
VERSION="23.10.1"
# version 0.4.1
# Copyright 2007-2018 Gregory Colpart <reg@evolix.fr>, Jérémy Lecour <jlecour@evolix.fr>, Evolix <info@evolix.fr>
show_version() {
cat <<END
evomaintenance version ${VERSION}
Copyright 2007-2023 Evolix <info@evolix.fr>,
Gregory Colpart <reg@evolix.fr>,
Jérémy Lecour <jlecour@evolix.fr>,
Brice Waegeneire <bwaegeneire@evolix.fr>,
Mathieu Trossevin <mtrossevin@evolix.fr>
and others.
evomaintenance comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
See the GNU General Public Licence for details.
END
}
show_help() {
cat <<END
evomaintenance is a program that helps reporting what you've done on a server
Usage: evomaintenance
or evomaintenance --message="add new host"
or evomaintenance --no-api --no-mail --no-commit
or echo "add new vhost" | evomaintenance
Options
-m, --message=MESSAGE set the message from the command line
--mail enable the mail hook (default)
--no-mail disable the mail hook
--db enable the database hook
--no-db disable the database hook (default)
--api enable the API hook (default)
--no-api disable the API hook
--commit enable the commit hook (default)
--no-commit disable the commit hook
--evocheck enable evocheck execution (default)
--no-evocheck disable evocheck execution
--auto use "auto" mode
--no-auto use "manual" mode (default)
-u, --user=USER force USER value (default: logname(1))
-v, --verbose increase verbosity
-n, --dry-run actions are not executed
--help print this message and exit
-V, --version print version and exit
END
}
syslog() {
if [ -x "${LOGGER_BIN}" ]; then
${LOGGER_BIN} -t "evomaintenance" "$1"
fi
}
get_system() {
uname -s
uname -s
}
get_fqdn() {
if [ "$(get_system)" = "Linux" ]; then
hostname --fqdn
elif [ "$(get_system)" = "OpenBSD" ]; then
hostname
else
echo "OS not detected!"
exit 1
fi
if [ "$(get_system)" = "Linux" ]; then
hostname --fqdn
elif [ "$(get_system)" = "OpenBSD" ]; then
hostname
else
echo "OS not detected!"
exit 1
fi
}
get_tty() {
if [ "$(get_system)" = "Linux" ]; then
ps -o tty= | tail -1
elif [ "$(get_system)" = "OpenBSD" ]; then
env | grep SSH_TTY | cut -d"/" -f3
else
echo "OS not detected!"
exit 1
fi
if [ "$(get_system)" = "Linux" ]; then
ps -o tty= | tail -1
elif [ "$(get_system)" = "OpenBSD" ]; then
env | grep SSH_TTY | cut -d"/" -f3
else
echo "OS not detected!"
exit 1
fi
}
get_who() {
who=$(LC_ALL=C who -m)
who=$(LC_ALL=C who -m | tr -s ' ')
if [ -n "${who}" ]; then
echo "${who}"
else
LC_ALL=C who | grep $(get_tty) | tr -s ' '
fi
if [ -n "${who}" ]; then
echo "${who}"
else
LC_ALL=C who | grep "$(get_tty)" | tr -s ' '
fi
}
get_begin_date() {
echo "$(date "+%Y") $(echo $(get_who) | cut -d" " -f3,4,5)"
# XXX A begin date isn't applicable when used in autosysadmin, so we
# use the same date as the end date.
if is_autosysadmin; then
get_end_date
else
printf "%s %s" "$(date "+%Y")" "$(get_who | cut -d" " -f3,4,5)"
fi
}
get_ip() {
ip=$(echo $(get_who) | cut -d" " -f6 | sed -e "s/^(// ; s/)$//")
[ -z "${ip}" ] && ip="unknown (no tty)"
[ "${ip}" = ":0" ] && ip="localhost"
ip=$(get_who | cut -d" " -f6 | sed -e "s/^(// ; s/)$//")
if is_autosysadmin || [ "${ip}" = ":0" ]; then
ip="localhost"
elif [ -z "${ip}" ]; then
ip="unknown (no tty)"
fi
echo "${ip}"
echo "${ip}"
}
get_end_date() {
date +"%Y %b %d %H:%M"
date +"%Y %b %d %H:%M"
}
get_now() {
date +"%Y-%m-%dT%H:%M:%S%z"
date +"%Y-%m-%dT%H:%M:%S%z"
}
get_user() {
if [ -n "${FORCE_USER}" ]; then
echo "${FORCE_USER}"
else
logname
fi
}
get_complete_hostname() {
REAL_HOSTNAME=$(get_fqdn)
if [ "${HOSTNAME}" = "${REAL_HOSTNAME}" ]; then
echo "${HOSTNAME}"
else
echo "${HOSTNAME} (${REAL_HOSTNAME})"
fi
}
get_repository_status() {
dir=$1
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR="${dir}/.git" GIT_WORK_TREE="${dir}"
# If the repository and the work tree exist, try to commit changes
if [ -d "${GIT_DIR}" ] && [ -d "${GIT_WORK_TREE}" ]; then
CHANGED_LINES=$(${GIT_BIN} status --porcelain | wc -l | tr -d ' ')
if [ "${CHANGED_LINES}" != "0" ]; then
STATUS=$(${GIT_BIN} status --short | tail -n ${GIT_STATUS_MAX_LINES})
printf "%s\n%s\n" "${GIT_DIR} (last ${GIT_STATUS_MAX_LINES} lines)" "${STATUS}" | sed -e '/^$/d'
fi
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
}
get_evocheck() {
if [ -x "${EVOCHECK_BIN}" ]; then
printf "Evocheck status :"
EVOCHECK_OUT=$(${EVOCHECK_BIN})
EVOCHECK_RC=$?
if [ "${EVOCHECK_RC}" = "0" ] && [ -z "${EVOCHECK_OUT}" ]; then
printf " OK\n\n"
else
printf " ERROR\n%s\n\n" "${EVOCHECK_OUT}"
fi
fi
}
print_log() {
printf "*********** %s ***************\n" "$(get_now)"
print_session_data
printf "Hooks : commit=%s db=%s api=%s mail=%s\n"\
"${HOOK_COMMIT}" "${HOOK_DB}" "${HOOK_API}" "${HOOK_MAIL}"
if [ "${HOOK_MAIL}" = "1" ]; then
printf "Mailto : %s\n" "${EVOMAINTMAIL}"
fi
}
print_session_data() {
printf "Host : %s\n" "${HOSTNAME_TEXT}"
printf "User : %s\n" "${USER}"
printf "IP : %s\n" "${IP}"
printf "Begin : %s\n" "${BEGIN_DATE}"
printf "End : %s\n" "${END_DATE}"
printf "Message : %s\n" "${MESSAGE}"
}
is_autosysadmin() {
test "${USER}" = "autosysadmin"
}
is_repository_readonly() {
if [ "$(get_system)" = "OpenBSD" ]; then
partition=$(stat -f '%Sd' $1)
mount | grep ${partition} | grep -q "read-only"
elif command -v findmnt >/dev/null; then
mountpoint=$(stat -c '%m' $1)
findmnt ${mountpoint} --noheadings --output OPTIONS -O ro
else
grep /usr /proc/mounts | grep -E '\bro\b'
fi
}
remount_repository_readwrite() {
if [ "$(get_system)" = "OpenBSD" ]; then
partition=$(stat -f '%Sd' $1)
mount -u -w /dev/${partition} 2>/dev/null
else
mountpoint=$(stat -c '%m' $1)
mount -o remount,rw ${mountpoint}
syslog "Re-mount ${mountpoint} as read-write to commit in repository $1"
fi
}
remount_repository_readonly() {
if [ "$(get_system)" = "OpenBSD" ]; then
partition=$(stat -f '%Sd' $1)
mount -u -r /dev/${partition} 2>/dev/null
else
mountpoint=$(stat -c '%m' $1)
mount -o remount,ro ${mountpoint} 2>/dev/null
syslog "Re-mount ${mountpoint} as read-only after commit to repository $1"
fi
}
hook_commit() {
if [ -x "${GIT_BIN}" ]; then
# loop on possible directories managed by GIT
for dir in ${GIT_REPOSITORIES}; do
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR="${dir}/.git" GIT_WORK_TREE="${dir}"
# reset variable used to track if a mount point is readonly
READONLY_ORIG=0
# If the repository and the work tree exist, try to commit changes
if [ -d "${GIT_DIR}" ] && [ -d "${GIT_WORK_TREE}" ]; then
CHANGED_LINES=$(${GIT_BIN} status --porcelain | wc -l | tr -d ' ')
if [ "${CHANGED_LINES}" != "0" ]; then
if [ "${DRY_RUN}" = "1" ]; then
# STATS_SHORT=$(${GIT_BIN} diff --stat | tail -1)
STATS=$(${GIT_BIN} diff --stat | tail -n ${GIT_STATUS_MAX_LINES})
# GIT_COMMITS_SHORT=$(printf "%s\n%s : %s" "${GIT_COMMITS_SHORT}" "${GIT_DIR}" "${STATS_SHORT}" | sed -e '/^$/d')
GIT_COMMITS=$(printf "%s\n%s\n%s" "${GIT_COMMITS}" "${GIT_DIR}" "${STATS}" | sed -e '/^$/d')
else
# remount mount point read-write if currently readonly
is_repository_readonly ${dir} && { READONLY_ORIG=1; remount_repository_readwrite ${dir}; }
# commit changes
${GIT_BIN} add --all
${GIT_BIN} commit --message "${MESSAGE}" --author="${USER} <${USER}@evolix.net>" --quiet
# remount mount point read-only if it was before
test "$READONLY_ORIG" = "1" && remount_repository_readonly ${dir}
# Add the SHA to the log file if something has been committed
SHA=$(${GIT_BIN} rev-parse --short HEAD)
# STATS_SHORT=$(${GIT_BIN} show --stat | tail -1)
STATS=$(${GIT_BIN} show --stat --pretty=format:"" | tail -n ${GIT_STATUS_MAX_LINES})
# append commit data, without empty lines
# GIT_COMMITS_SHORT=$(printf "%s\n%s : %s %s" "${GIT_COMMITS_SHORT}" "${GIT_DIR}" "${SHA}" "${STATS_SHORT}" | sed -e '/^$/d')
GIT_COMMITS=$(printf "%s\n%s : %s\n%s" "${GIT_COMMITS}" "${GIT_DIR}" "${SHA}" "${STATS}" | sed -e '/^$/d')
fi
fi
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
done
if [ -n "${GIT_COMMITS}" ]; then
# if [ "${VERBOSE}" = "1" ]; then
printf "\n********** Commits ****************\n%s\n***********************************\n" "${GIT_COMMITS}"
# fi
if [ "${DRY_RUN}" != "1" ]; then
echo "${GIT_COMMITS}" >> "${LOGFILE}"
fi
fi
fi
}
hook_db() {
SQL_DETAILS=$(echo "${MESSAGE}" | sed "s/'/''/g")
PG_QUERY="INSERT INTO evomaint(hostname,userid,ipaddress,begin_date,end_date,details) VALUES ('${HOSTNAME}','${USER}','${IP}','${BEGIN_DATE}',now(),'${SQL_DETAILS}')"
if [ "${VERBOSE}" = "1" ]; then
printf "\n********** DB query **************\n%s\n***********************************\n" "${PG_QUERY}"
fi
if [ "${DRY_RUN}" != "1" ] && [ -x "${PSQL_BIN}" ]; then
echo "${PG_QUERY}" | ${PSQL_BIN} "${PGDB}" "${PGTABLE}" -h "${PGHOST}"
fi
}
hook_api() {
if [ "${VERBOSE}" = "1" ]; then
printf "\n********** API call **************\n"
printf "curl -f -s -S -X POST [REDACTED] -k -F api_key=[REDACTED] -F action=insertEvoMaintenance -F hostname=%s -F userid=%s -F ipaddress=%s -F begin_date=%s -F end_date='now()' -F details=%s" \
"${HOSTNAME}" "${USER}" "${IP}" "${BEGIN_DATE}" "${MESSAGE}"
printf "\n***********************************\n"
fi
if [ "${DRY_RUN}" != "1" ] && [ -x "${CURL_BIN}" ]; then
API_RETURN_STATUS=$(curl -f -s -S -X POST \
"${API_ENDPOINT}" -k \
-F api_key="${API_KEY}" \
-F action=insertEvoMaintenance \
-F hostname="${HOSTNAME}" \
-F userid="${USER}" \
-F ipaddress="${IP}" \
-F begin_date="${BEGIN_DATE}" \
-F end_date='now()' \
-F details="${MESSAGE}")
# either cURL or the API backend can throw an error, otherwise it returns this JSON response
if [ "$API_RETURN_STATUS" = '{"status":"Ok"}' ]; then
echo "API call OK."
else
echo "API call FAILED."
fi
fi
}
format_mail() {
cat <<EOTEMPLATE
From: ${FULLFROM}
Content-Type: text/plain; charset=UTF-8
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-Evomaintenance-Version: ${VERSION}
X-Evomaintenance-Host: ${HOSTNAME_TEXT}
X-Evomaintenance-User: ${USER}
To: ${EVOMAINTMAIL}
Subject: [evomaintenance] Intervention sur ${HOSTNAME_TEXT} (${USER})
Bonjour,
Une intervention vient de se terminer sur votre serveur.
Nom du serveur : ${HOSTNAME_TEXT}
Personne ayant réalisée l'intervention : ${USER}
Intervention réalisée depuis : ${IP}
Début de l'intervention : ${BEGIN_DATE}
Fin de l'intervention : ${END_DATE}
### Renseignements sur l'intervention
${MESSAGE}
###
EOTEMPLATE
if [ -n "${GIT_COMMITS}" ]; then
cat << EOTEMPLATE
### Commits
${GIT_COMMITS}
###
EOTEMPLATE
fi
cat <<EOTEMPLATE
Pour réagir à cette intervention, vous pouvez répondre à ce message
(sur l'adresse mail ${FROM}). En cas d'urgence, utilisez
l'adresse ${URGENCYFROM} ou notre téléphone portable d'astreinte
(${URGENCYTEL})
Cordialement,
--
${FULLFROM}
EOTEMPLATE
}
hook_mail() {
MAIL_CONTENT=$(format_mail)
if [ "${VERBOSE}" = "1" ]; then
printf "\n********** Mail *******************\n%s\n***********************************\n" "${MAIL_CONTENT}"
fi
if [ "${DRY_RUN}" != "1" ] && [ -x "${SENDMAIL_BIN}" ]; then
echo "${MAIL_CONTENT}" | ${SENDMAIL_BIN} -oi -t -f "${FROM}"
fi
}
hook_log() {
if [ "${VERBOSE}" = "1" ]; then
print_log
fi
if [ "${DRY_RUN}" != "1" ]; then
print_log >> "${LOGFILE}"
fi
}
# load configuration if present.
test -f /etc/evomaintenance.cf && . /etc/evomaintenance.cf
[ -n "${HOSTNAME}" ] || HOSTNAME=$(get_fqdn)
[ -n "${EVOMAINTMAIL}" ] || EVOMAINTMAIL=evomaintenance-$(echo "${HOSTNAME}" | cut -d- -f1)@${REALM}
[ -n "${LOGFILE}" ] || LOGFILE=/var/log/evomaintenance.log
HOSTNAME=${HOSTNAME:-$(get_fqdn)}
EVOMAINTMAIL=${EVOMAINTMAIL:-"evomaintenance-$(echo "${HOSTNAME}" | cut -d- -f1)@${REALM}"}
LOGFILE=${LOGFILE:-"/var/log/evomaintenance.log"}
HOOK_COMMIT=${HOOK_COMMIT:-"1"}
HOOK_DB=${HOOK_DB:-"0"}
HOOK_API=${HOOK_API:-"1"}
HOOK_MAIL=${HOOK_MAIL:-"1"}
DRY_RUN=${DRY_RUN:-"0"}
VERBOSE=${VERBOSE:-"0"}
AUTO=${AUTO:-"0"}
EVOCHECK=${EVOCHECK:-"0"}
GIT_STATUS_MAX_LINES=${GIT_STATUS_MAX_LINES:-20}
API_ENDPOINT=${API_ENDPOINT:-""}
FORCE_USER=${FORCE_USER:-""}
# initialize variables
MESSAGE=""
# GIT_COMMITS_SHORT=""
GIT_COMMITS=""
# Parse options
# based on https://gist.github.com/deshion/10d3cb5f88a21671e17a
while :; do
case $1 in
-h|-\?|--help)
show_help
exit 0
;;
-V|--version)
show_version
exit 0
;;
-m|--message)
# message options, with value speparated by space
if [ -n "$2" ]; then
MESSAGE=$2
shift
else
printf 'ERROR: "--message" requires a non-empty option argument.\n' >&2
exit 1
fi
;;
--message=?*)
# message options, with value speparated by =
MESSAGE=${1#*=}
;;
--message=)
# message options, without value
printf 'ERROR: "--message" requires a non-empty option argument.\n' >&2
exit 1
;;
--no-commit)
# disable commit hook
HOOK_COMMIT=0
;;
--commit)
# enable commit hook
HOOK_COMMIT=1
;;
--no-db)
# disable DB hook
HOOK_DB=0
;;
--db)
# enable DB hook
HOOK_DB=1
;;
--no-api)
# disable API hook
HOOK_API=0
;;
--api)
# enable API hook
HOOK_API=1
;;
--no-mail)
# disable mail hook
HOOK_MAIL=0
;;
--mail)
# enable mail hook
HOOK_MAIL=1
;;
--no-auto)
# use "manual" mode
AUTO=0
;;
--auto)
# use "auto" mode
AUTO=1
;;
--autosysadmin)
# Deprecated, backward compatibility
# author change as autosysadmin
printf 'WARNING: "--autosysadmin" is deprecated, use "--user autosysadmin".\n' >&2
FORCE_USER="autosysadmin"
;;
-u|--user)
# user options, with value speparated by space
if [ -n "$2" ]; then
FORCE_USER=$2
shift
else
printf 'ERROR: "--user" requires a non-empty option argument.\n' >&2
exit 1
fi
;;
--user=?*)
# message options, with value speparated by =
FORCE_USER=${1#*=}
;;
--user=)
# message options, without value
printf 'ERROR: "--user" requires a non-empty option argument.\n' >&2
exit 1
;;
-n|--dry-run)
# disable actual commands
DRY_RUN=1
;;
-v|--verbose)
# print verbose information
VERBOSE=1
;;
--)
# End of all options.
shift
break
;;
-?*|[[:alnum:]]*)
# ignore unknown options
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
;;
*)
# Default case: If no more options then break out of the loop.
break
;;
esac
shift
done
# Treat unset variables as an error when substituting.
# Only after this line, because some config variables might be missing.
set -u
REAL_HOSTNAME=$(get_fqdn)
if [ "${HOSTNAME}" = "${REAL_HOSTNAME}" ]; then
HOSTNAME_TEXT="${HOSTNAME}"
else
HOSTNAME_TEXT="${HOSTNAME} (${REAL_HOSTNAME})"
fi
# Gather information
HOSTNAME_TEXT=$(get_complete_hostname)
# TTY=$(get_tty)
# WHO=$(get_who)
IP=$(get_ip)
BEGIN_DATE=$(get_begin_date)
END_DATE=$(get_end_date)
USER=$(logname)
USER=$(get_user)
PATH=${PATH}:/usr/sbin
SENDMAIL_BIN=$(command -v sendmail)
GIT_BIN=$(command -v git)
GIT_REPOSITORIES="/etc /etc/bind"
# git statuses
GIT_STATUSES=""
if test -x "${GIT_BIN}"; then
# loop on possible directories managed by GIT
for dir in ${GIT_REPOSITORIES}; do
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR="${dir}/.git" GIT_WORK_TREE="${dir}"
# If the repository and the work tree exist, try to commit changes
if test -d "${GIT_DIR}" && test -d "${GIT_WORK_TREE}"; then
CHANGED_LINES=$(${GIT_BIN} status --porcelain | wc -l | tr -d ' ')
if [ "${CHANGED_LINES}" != "0" ]; then
STATUS=$(${GIT_BIN} status --short | tail -n 10)
# append diff data, without empty lines
GIT_STATUSES=$(printf "%s\n%s\n%s\n" "${GIT_STATUSES}" "${GIT_DIR} (last 10 lines)" "${STATUS}" | sed -e '/^$/d')
fi
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
done
if [ -n "${GIT_STATUSES}" ]; then
echo "/!\ There are some uncommited changes. If you proceed, everything will be commited."
echo "${GIT_STATUSES}"
echo ""
fi
readonly SENDMAIL_BIN
if [ "${HOOK_MAIL}" = "1" ] && [ -z "${SENDMAIL_BIN}" ]; then
echo "No \`sendmail' command has been found, can't send mail." 2>&1
fi
# get input from stdin
echo "> Please, enter details about your maintenance"
read TEXTE
GIT_BIN=$(command -v git)
readonly GIT_BIN
if [ "${HOOK_COMMIT}" = "1" ] && [ -z "${GIT_BIN}" ]; then
echo "No \`git' command has been found, can't commit changes" 2>&1
fi
if [ "${TEXTE}" = "" ]; then
PSQL_BIN=$(command -v psql)
readonly PSQL_BIN
if [ "${HOOK_DB}" = "1" ] && [ -z "${PSQL_BIN}" ]; then
echo "No \`psql' command has been found, can't save to the database." 2>&1
fi
CURL_BIN=$(command -v curl)
readonly CURL_BIN
if [ "${HOOK_API}" = "1" ] && [ -z "${CURL_BIN}" ]; then
echo "No \`curl' command has been found, can't call the API." 2>&1
fi
LOGGER_BIN=$(command -v logger)
readonly LOGGER_BIN
if [ "${HOOK_API}" = "1" ] && [ -z "${API_ENDPOINT}" ]; then
echo "No API endpoint specified, can't call the API." 2>&1
fi
EVOCHECK_BIN="/usr/share/scripts/evocheck.sh"
GIT_REPOSITORIES="/etc /etc/bind /usr/share/scripts"
# Add /etc directories from lxc containers if they are git directories
if [ -d /var/lib/lxc ]; then
GIT_REPOSITORIES="${GIT_REPOSITORIES} $(find -L /var/lib/lxc/ -maxdepth 3 -name 'etc' | tr '\n' ' ' | sed 's/[[:space:]]\+$//')"
fi
# initialize variable
GIT_STATUSES=""
# git statuses
if [ -x "${GIT_BIN}" ]; then
# loop on possible directories managed by GIT
for dir in ${GIT_REPOSITORIES}; do
RESULT=$(get_repository_status "${dir}")
if [ -n "${RESULT}" ]; then
# append diff data, without empty lines
GIT_STATUSES=$(printf "%s\n%s\n" "${GIT_STATUSES}" "${RESULT}" | sed -e '/^$/d')
fi
unset RESULT
done
fi
# find out if running in interactive mode, or not
if [ -t 0 ]; then
INTERACTIVE=1
else
INTERACTIVE=0
fi
readonly INTERACTIVE
if [ "${INTERACTIVE}" = "1" ] && [ "${EVOCHECK}" = "1" ]; then
get_evocheck
fi
if [ -n "${GIT_STATUSES}" ] && [ "${INTERACTIVE}" = "1" ]; then
printf "/!\\\ There are some uncommited changes.\n%s\n\n" "${GIT_STATUSES}"
fi
if [ -z "${MESSAGE}" ]; then
if [ "${INTERACTIVE}" = "1" ]; then
printf "> Please, enter details about your maintenance:\n"
fi
read -r MESSAGE
fi
if [ -z "${MESSAGE}" ]; then
echo "no value..."
exit 1
fi
# recapitulatif
BLOB=$(cat <<END
Host : $HOSTNAME_TEXT
User : $USER
IP : $IP
Begin : $BEGIN_DATE
End : $END_DATE
Message : $TEXTE
END
)
print_session_data
echo ""
echo "${BLOB}"
echo ""
echo "> Press <Enter> to submit, or <Ctrl+c> to cancel."
read enter
# write log
echo "----------- $(get_now) ---------------" >> "${LOGFILE}"
echo "${BLOB}" >> "${LOGFILE}"
# git commit
GIT_COMMITS=""
if test -x "${GIT_BIN}"; then
# loop on possible directories managed by GIT
for dir in ${GIT_REPOSITORIES}; do
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR="${dir}/.git" GIT_WORK_TREE="${dir}"
# If the repository and the work tree exist, try to commit changes
if test -d "${GIT_DIR}" && test -d "${GIT_WORK_TREE}"; then
CHANGED_LINES=$(${GIT_BIN} status --porcelain | wc -l | tr -d ' ')
if [ "${CHANGED_LINES}" != "0" ]; then
${GIT_BIN} add --all
${GIT_BIN} commit --message "${TEXTE}" --author="${USER} <${USER}@evolix.net>" --quiet
# Add the SHA to the log file if something has been committed
SHA=$(${GIT_BIN} rev-parse --short HEAD)
STATS=$(${GIT_BIN} show --stat | tail -1)
# append commit data, without empty lines
GIT_COMMITS=$(printf "%s\n%s : %s %s" "${GIT_COMMITS}" "${GIT_DIR}" "${SHA}" "${STATS}" | sed -e '/^$/d')
fi
if [ "${INTERACTIVE}" = "1" ] && [ "${AUTO}" = "0" ]; then
if [ "${HOOK_COMMIT}" = "1" ] || [ "${HOOK_MAIL}" = "1" ] || [ "${HOOK_DB}" = "1" ]; then
printf "\nActions to execute:\n"
if [ "${HOOK_COMMIT}" = "1" ]; then
printf "* commit changes in repositories\n"
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
done
if [ -n "${GIT_COMMITS}" ]; then
echo "${GIT_COMMITS}" >> "${LOGFILE}"
if [ "${HOOK_MAIL}" = "1" ]; then
printf "* send mail to %s\n" "${EVOMAINTMAIL}"
fi
if [ "${HOOK_DB}" = "1" ]; then
printf "* save metadata to the database\n"
fi
if [ "${HOOK_API}" = "1" ]; then
printf "* send metadata to the API\n"
fi
echo ""
answer=""
while :; do
printf "> Let's continue? [Y,n,i,?] "
read -r answer
case $answer in
[Yy]|"" )
# force "auto" mode, but keep hooks settings
AUTO=1
break
;;
[Nn] )
# force "auto" mode, and disable all hooks
HOOK_COMMIT=0
HOOK_MAIL=0
HOOK_DB=0
HOOK_API=0
AUTO=1
break
;;
[Ii] )
# force "manual" mode
AUTO=0
break
;;
* )
printf "y - yes, execute actions and exit\n"
printf "n - no, don't execute actions and exit\n"
printf "i - switch to interactive mode\n"
printf "? - print this help\n"
;;
esac
done
fi
fi
# insert into PG
# SQL_TEXTE=`echo "${TEXTE}" | sed "s/'/\\\\\\'/g ; s@/@\\\\\/@g ; s@\\&@et@g"`
SQL_TEXTE=`echo "${TEXTE}" | sed "s/'/''/g"`
if [ "${INTERACTIVE}" = "1" ] && [ "${AUTO}" = "0" ]; then
# Commit hook
if [ -n "${GIT_STATUSES}" ] && [ "${HOOK_COMMIT}" = "1" ]; then
printf "/!\ There are some uncommited changes.\n%s\n\n" "${GIT_STATUSES}"
PG_QUERY="INSERT INTO evomaint(hostname,userid,ipaddress,begin_date,end_date,details) VALUES ('${HOSTNAME}','${USER}','${IP}','${BEGIN_DATE}',now(),'${SQL_TEXTE}')"
echo "${PG_QUERY}" | psql ${PGDB} ${PGTABLE} -h ${PGHOST}
y="Y"; n="n"
answer=""
while :; do
printf "> Do you want to commit the changes? [%s] " "${y},${n}"
read -r answer
case $answer in
[Yy] )
hook_commit;
break
;;
[Nn] )
break
;;
"" )
if [ "${HOOK_COMMIT}" = "1" ]; then
hook_commit
fi
break
;;
* )
echo "answer with a valid choice"
;;
esac
done
fi
# send mail
MAIL_TEXTE=$(echo "${TEXTE}" | sed -e "s@/@\\\\\/@g ; s@&@\\\\&@")
MAIL_GIT_COMMITS=$(echo "${GIT_COMMITS}" | sed -e "s@/@\\\\\/@g ; s@&@\\\\&@")
# Mail hook
if [ "${HOOK_MAIL}" = "1" ]; then
y="Y"; n="n"
else
y="y"; n="N"
fi
answer=""
while :; do
printf "> Do you want to send an email to <%s>? [%s] " "${EVOMAINTMAIL}" "${y},${n},e"
read -r answer
case $answer in
[Yy] )
hook_mail;
break
;;
[Nn] )
break
;;
[Ee] )
printf "> To: [%s] " "${EVOMAINTMAIL}"
read -r mail_recipient
if [ -n "${mail_recipient}" ]; then
EVOMAINTMAIL="${mail_recipient}"
fi
;;
"" )
if [ "${HOOK_MAIL}" = "1" ]; then
hook_mail
fi
break
;;
* )
echo "answer with a valid choice"
;;
esac
done
cat /usr/share/scripts/evomaintenance.tpl | \
sed -e "s/__TO__/${EVOMAINTMAIL}/ ; s/__HOSTNAME__/${HOSTNAME_TEXT}/ ; s/__USER__/${USER}/ ; s/__BEGIN_DATE__/${BEGIN_DATE}/ ; s/__END_DATE__/${END_DATE}/ ; s/__GIT_COMMITS__/${MAIL_GIT_COMMITS}/ ; s/__TEXTE__/${MAIL_TEXTE}/ ; s/__IP__/${IP}/ ; s/__FULLFROM__/${FULLFROM}/ ; s/__FROM__/${FROM}/ ; s/__URGENCYFROM__/${URGENCYFROM}/ ; s/__URGENCYTEL__/${URGENCYTEL}/" | \
${SENDMAIL_BIN} -oi -t -f ${FROM}
# Database hook
if [ "${HOOK_DB}" = "1" ]; then
y="Y"; n="n"
else
y="y"; n="N"
fi
answer=""
while :; do
printf "> Do you want to insert your message into the database? [%s] " "${y},${n}"
read -r answer
case $answer in
[Yy] )
hook_db;
break
;;
[Nn] )
break
;;
"" )
if [ "${HOOK_DB}" = "1" ]; then
hook_db
fi
break
;;
* )
echo "answer with a valid choice"
;;
esac
done
# API hook
if [ "${HOOK_API}" = "1" ]; then
y="Y"; n="n"
else
y="y"; n="N"
fi
answer=""
while :; do
printf "> Do you want to send the metadata to the API? [%s] " "${y},${n}"
read -r answer
case $answer in
[Yy] )
hook_api;
break
;;
[Nn] )
break
;;
"" )
if [ "${HOOK_API}" = "1" ]; then
hook_api
fi
break
;;
* )
echo "answer with a valid choice"
;;
esac
done
fi
# Log hook
hook_log
if [ "${INTERACTIVE}" = "0" ] || [ "${AUTO}" = "1" ]; then
if [ "${HOOK_COMMIT}" = "1" ]; then
hook_commit
fi
if [ "${HOOK_MAIL}" = "1" ]; then
hook_mail
fi
if [ "${HOOK_DB}" = "1" ]; then
hook_db
fi
if [ "${HOOK_API}" = "1" ]; then
hook_api
fi
fi
exit 0

View file

@ -1,33 +0,0 @@
From: __FULLFROM__
Content-Type: text/plain; charset=UTF-8
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
To: __TO__
Subject: [evomaintenance] Intervention sur __HOSTNAME__ (__USER__)
Bonjour,
Une intervention vient de se terminer sur votre serveur.
Voici les renseignements sur l'intervention :
Nom du serveur : __HOSTNAME__
Personne ayant réalisée l'intervention : __USER__
Intervention réalisée depuis : __IP__
Début de l'intervention : __BEGIN_DATE__
Fin de l'intervention : __END_DATE__
###
Renseignements sur l'intervention :
__TEXTE__
###
__GIT_COMMITS__
Pour réagir à cette intervention, vous pouvez répondre à ce message
(sur l'adresse mail __FROM__). En cas d'urgence, utilisez
l'adresse __URGENCYFROM__ ou notre téléphone portable d'astreinte
(__URGENCYTEL__)
Cordialement,
--
__FULLFROM__