Add debian common role
This commit is contained in:
		
							
								
								
									
										223
									
								
								common-debian/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								common-debian/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| --- | ||||
| # A root password for the system in plaintext format | ||||
| root_password: "OverrideMeToSomethingSecurePlease!" | ||||
|  | ||||
| # Timezone & Locale | ||||
| timezone: Canada/Eastern | ||||
| locale: en_CA.UTF-8 | ||||
|  | ||||
| # Hosts to allow for hostbased authentication | ||||
| hostbased_auth: # Must be list of inventory hostnames | ||||
| #  - adminhost.domain.tld | ||||
|  | ||||
| # Custom facts (from the templates/etc/ansible/facts.d directory) to install | ||||
| custom_facts: | ||||
|   - moe_release | ||||
|   - host_id | ||||
|   - host_group | ||||
|   - dhcp_status | ||||
|  | ||||
| # Apt configuration files (from the templates/etc/apt/apt.conf.d directory) to install | ||||
| apt_configurations: | ||||
|   - 10norecommends | ||||
|   - 30aptcacher | ||||
|   - 50unattended-upgrades | ||||
|  | ||||
| # Apt sources entries | ||||
| apt_sources: | ||||
|   - name: rafal.ca-base | ||||
|     has_src: yes | ||||
|     url: http://debian.mirror.rafal.ca/debian | ||||
|     distribution: "{{ moe_release.debian_codename }}" | ||||
|     components: | ||||
|       - main | ||||
|       - contrib | ||||
|       - non-free | ||||
|  | ||||
|   - name: rafal.ca-updates | ||||
|     has_src: yes | ||||
|     url: http://debian.mirror.rafal.ca/debian | ||||
|     distribution: "{{ moe_release.debian_codename }}-updates" | ||||
|     components: | ||||
|       - main | ||||
|       - contrib | ||||
|       - non-free | ||||
|  | ||||
|   - name: rafal.ca-security | ||||
|     has_src: yes | ||||
|     url: http://security.debian.org/debian-security | ||||
|     distribution: "{{ moe_release.debian_codename }}-security" | ||||
|     components: | ||||
|       - main | ||||
|       - contrib | ||||
|       - non-free | ||||
|  | ||||
|   - name: repo.bonifacelabs.net | ||||
|     has_src: no | ||||
|     url: https://repo.bonifacelabs.net/debian | ||||
|     distribution: "{{ moe_release.debian_codename }}" | ||||
|     components: | ||||
|       - main | ||||
|     gpg_url: https://repo.bonifacelabs.net/debian/bonifacelabs_signing_key.pub | ||||
|     gpg_id: 83D07192314835D4 | ||||
|  | ||||
| # Packages to explicitly remove from the system | ||||
| packages_remove: | ||||
|   - exim4 | ||||
|   - exim4-base | ||||
|   - exim4-config | ||||
|   - exim4-daemon-light | ||||
|   - nano | ||||
|   - joe | ||||
|   - python2 | ||||
|  | ||||
| # Packages to install on the system | ||||
| packages_add: | ||||
|   - acl | ||||
|   - acpi-support-base | ||||
|   - acpid | ||||
|   - bash | ||||
|   - bash-completion | ||||
|   - bc | ||||
|   - bind9-host | ||||
|   - binutils | ||||
|   - bzip2 | ||||
|   - ca-certificates | ||||
|   - check-mk-agent | ||||
|   - curl | ||||
|   - debconf-utils | ||||
|   - deborphan | ||||
|   - dns-root-data | ||||
|   - dnsutils | ||||
|   - dstat | ||||
|   - fail2ban | ||||
|   - gawk | ||||
|   - git | ||||
|   - haveged | ||||
|   - htop | ||||
|   - iotop | ||||
|   - iperf | ||||
|   - iperf3 | ||||
|   - iptables | ||||
|   - jnettop | ||||
|   - less | ||||
|   - libpam-systemd | ||||
|   - locales | ||||
|   - logrotate | ||||
|   - lsof | ||||
|   - man | ||||
|   - mmv | ||||
|   - needrestart | ||||
|   - net-tools | ||||
|   - netcat-openbsd | ||||
|   - nethogs | ||||
|   - nftables | ||||
|   - nmap | ||||
|   - ntp | ||||
|   - openssh-client | ||||
|   - openssh-server | ||||
|   - openssl | ||||
|   - postfix | ||||
|   - psmisc | ||||
|   - pv | ||||
|   - reptyr | ||||
|   - rsync | ||||
|   - rsyslog | ||||
|   - screenfetch | ||||
|   - sharutils | ||||
|   - shellcheck | ||||
|   - strace | ||||
|   - sudo | ||||
|   - sysstat | ||||
|   - tcptraceroute | ||||
|   - traceroute | ||||
|   - tshark | ||||
|   - unattended-upgrades | ||||
|   - vim | ||||
|   - wget | ||||
|   - zram-tools | ||||
|   - "linux-headers-{{ moe_release.dpkg_architecture }}" | ||||
|   - "linux-image-{{ moe_release.dpkg_architecture }}" | ||||
|  | ||||
| # Apt preferences to set before installing packages | ||||
| apt_preferences: | ||||
|   - name: wireshark-common | ||||
|     question: wireshark-common/install-setuid | ||||
|     vtype: select | ||||
|     value: 'true' | ||||
|   - name: postfix | ||||
|     question: postfix/main_mailer_type | ||||
|     vtype: select | ||||
|     value: "Internet Site" | ||||
|  | ||||
| # Services to enable (after installing but before configuring) | ||||
| enabled_services: | ||||
|   - acpid | ||||
|   - rsyslog | ||||
|   - nftables | ||||
|   - postfix | ||||
|   - ntp | ||||
|   - ssh | ||||
|  | ||||
| # Capabilities overrides on binaries | ||||
| set_capabilities: | ||||
|   - path: /bin/ping | ||||
|     capability: cap_net_raw=ep | ||||
|  | ||||
| # Sysctl configuration files (from templates/etc/sysctl.d) to install | ||||
| sysctl_files: | ||||
|   - moe.conf | ||||
|  | ||||
| # NFTables rules to create; leave empty for a default allow-all ruleset | ||||
| nftables_rules: | ||||
| #  # EXAMPLE: Permit CheckMK only from RFC1918 subnets | ||||
| #  - chain: input | ||||
| #    rule: "ip saddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } tcp dport 6556 accept" | ||||
| #  - chain: input | ||||
| #    rule: "ip tcp dport 6556 drop" | ||||
|  | ||||
| # CheckMK plugin files (from files/usr/lib/check_mk_agent/plugins) to install | ||||
| check_mk_plugins: | ||||
|   - mk_logwatch | ||||
|   - backup | ||||
|   - cephfsmounts | ||||
|   - dpkg | ||||
|   - entropy | ||||
|   - freshness | ||||
|   - kernel_taint | ||||
|   - ownership | ||||
|  | ||||
| # Additional groups to add | ||||
| add_groups: | ||||
|   - name: media | ||||
|     gid: 9000 | ||||
|  | ||||
| # SSH keys for backup purposes | ||||
| backup_ssh_keys: | ||||
|   - name: backup@domain.tld | ||||
|     date: 2020-01 | ||||
|     type: ssh-ed25519 | ||||
|     key: AAAA...ZZZZ | ||||
|  | ||||
| # Administrative users | ||||
| admin_users: | ||||
|   - name: example | ||||
|     uid: 501 | ||||
|     add_groups: | ||||
|       - wireshark | ||||
|       - media | ||||
|     shell: /bin/bash | ||||
|     ssh_keys: | ||||
|       - name: example@domain.tld | ||||
|         date: 2020-01 | ||||
|         type: ssh-ed25519 | ||||
|         key: AAAA...ZZZZ | ||||
|  | ||||
| # Non-mailhost postfix relay and domain information (for cron emails, etc.) | ||||
| postfix_relay: "" | ||||
| postfix_domain: "" | ||||
|  | ||||
| # File used to determine if the Postfix main.cf configuration should not be installed | ||||
| # Ensure this file is created in a later role for hosts that need their own main.cf configuration | ||||
| # to avoid this role overwriting it in the future. | ||||
| postfix_mailhost_flag_file: "/etc/postfix/mailhost" | ||||
							
								
								
									
										11
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/backup
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/backup
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Backup check for Check_MK | ||||
| # Installed by BLSE 2.x ansible | ||||
|  | ||||
| SHARELIST=( $( cat /var/backups/shares ) ) | ||||
|  | ||||
| echo "<<<backup>>>" | ||||
| for SHARE in ${SHARELIST[@]}; do | ||||
|     echo "${SHARE} $( cat ${SHARE}/.backup )" | ||||
| done | ||||
							
								
								
									
										15
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/cephfsmounts
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/cephfsmounts
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| echo '<<<cephfsmounts>>>' | ||||
| sed -n '/ ceph\? /s/[^ ]* \([^ ]*\) .*/\1/p' < /proc/mounts | | ||||
|     sed 's/\\040/ /g' | | ||||
|     while read MP | ||||
|     do | ||||
|     if [ ! -r $MP ]; then | ||||
|         echo "$MP Permission denied" | ||||
|         elif [ $STAT_VERSION != $STAT_BROKE ]; then | ||||
|             waitmax -s 9 2 stat -f -c "$MP ok %b %f %a %s" "$MP" || \ | ||||
|             echo "$MP hanging 0 0 0 0" | ||||
|         else | ||||
|             waitmax -s 9 2 stat -f -c "$MP ok %b %f %a %s" "$MP" && \ | ||||
|                 printf '\n'|| echo "$MP hanging 0 0 0 0" | ||||
|         fi | ||||
|     done | ||||
							
								
								
									
										33
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/dpkg
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/dpkg
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Apt and dpkg status check for Check_MK | ||||
| # Installed by BLSE 2.x ansible | ||||
|  | ||||
| TMP_DPKG="$( COLUMNS=200 dpkg --list )" | ||||
| TMP_AWK="$( awk ' | ||||
|     { if (NR>5) { | ||||
|         if ($1 != "ii") bad_package[$2]=$1; | ||||
|     }} | ||||
|     END { | ||||
|         print NR-5; | ||||
|         bad_package_count=asort(bad_package,junk) | ||||
|         if (bad_package_count) { | ||||
|             for (package in bad_package) | ||||
|                 print package "[" bad_package[package] "]" | ||||
|             exit 1 | ||||
|         } | ||||
|     } | ||||
| ' <<<"$TMP_DPKG" )" | ||||
|  | ||||
| DEBIAN_VERSION="$( cat /etc/debian_version )" | ||||
| TOTAL_PACKAGES=$( head --lines=1 <<<"${TMP_AWK}" ) | ||||
| UPGRADABLE_PACKAGES=( $( apt list --upgradable 2>/dev/null | grep -v '^Listing' | awk '{ gsub(/\]/,"",$NF); print $1 "[" $NF "<>" $2 "]" }' ) ) | ||||
| INCONSISTENT_PACKAGES=( $( tail --lines=+2 <<<"${TMP_AWK}" ) ) | ||||
| OLD_CONFIG_FILES=( $( ionice -c3 find /etc -type f -a \( -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.update-*' \) 2>/dev/null ) ) | ||||
|  | ||||
| echo "<<<dpkg>>>" | ||||
| echo "debian_version ${DEBIAN_VERSION}" | ||||
| echo "total_packages ${TOTAL_PACKAGES}" | ||||
| echo "upgradable_packages ${#UPGRADABLE_PACKAGES[*]} ${UPGRADABLE_PACKAGES[*]}" | ||||
| echo "inconsistent_packages ${#INCONSISTENT_PACKAGES[*]} ${INCONSISTENT_PACKAGES[*]}" | ||||
| echo "obsolete_configuration_files ${#OLD_CONFIG_FILES[*]} ${OLD_CONFIG_FILES[*]}" | ||||
							
								
								
									
										16
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/entropy
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/entropy
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Entropy availability check for Check_MK | ||||
| # Installed by BLSE 2.x ansible | ||||
|  | ||||
| if [ -e /proc/sys/kernel/random/entropy_avail ]; then | ||||
|  | ||||
|   echo '<<<entropy_avail>>>' | ||||
|  | ||||
|   echo -n "entropy_avail " | ||||
|   cat /proc/sys/kernel/random/entropy_avail | ||||
|  | ||||
|   echo -n "poolsize " | ||||
|   cat /proc/sys/kernel/random/poolsize | ||||
|  | ||||
| fi | ||||
							
								
								
									
										103
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/freshness
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										103
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/freshness
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| #!/usr/bin/env python | ||||
|  | ||||
| # Check for freshness of various components using needrestart | ||||
|  | ||||
| import subprocess | ||||
| import re | ||||
| import json | ||||
|  | ||||
| try: | ||||
|     nrout = subprocess.run(["/usr/sbin/needrestart", "-b"], timeout=5, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | ||||
| except subprocess.TimeoutExpired: | ||||
|     exit(2) | ||||
| except Exception: | ||||
|     exit(1) | ||||
|  | ||||
| stdout = nrout.stdout.decode("ascii").split('\n') | ||||
| stderr = nrout.stdout.decode("ascii").split('\n') | ||||
|  | ||||
| # Output data structure after parsing needrestart output | ||||
| data = { | ||||
|     'kernel': { | ||||
|         'current': None, | ||||
|         'pending': None, | ||||
|         'state': 0, | ||||
|     }, | ||||
|     'microcode': { | ||||
|         'current': None, | ||||
|         'pending': None, | ||||
|         'state': 0, | ||||
|     }, | ||||
|     'services': { | ||||
|         'count': 0, | ||||
|         'list': list(), | ||||
|     }, | ||||
|     'containers': { | ||||
|         'count': 0, | ||||
|         'list': list(), | ||||
|     }, | ||||
|     'sessions': { | ||||
|         'count': 0, | ||||
|         'list': list(), | ||||
|     }, | ||||
| } | ||||
|  | ||||
| # NEEDRESTART-VER: 3.4 | ||||
| # NEEDRESTART-KCUR: 4.19.0-6-amd64 | ||||
| # NEEDRESTART-KEXP: 4.19.0-20-amd64 | ||||
| # NEEDRESTART-KSTA: 3 | ||||
| # NEEDRESTART-UCSTA: 2 | ||||
| # NEEDRESTART-UCCUR: 0xb000038 | ||||
| # NEEDRESTART-UCEXP: 0xb000040 | ||||
| # NEEDRESTART-SVC: acpid | ||||
| # NEEDRESTART-SVC: cron | ||||
| # NEEDRESTART-SVC: irqbalance | ||||
| # NEEDRESTART-SVC: mcelog | ||||
| # NEEDRESTART-SVC: munin-node | ||||
| # NEEDRESTART-SVC: ntp | ||||
| # NEEDRESTART-SVC: ssh | ||||
| # NEEDRESTART-SVC: syslog-ng | ||||
| # NEEDRESTART-SVC: trousers | ||||
| # NEEDRESTART-SVC: watchdog | ||||
| # NEEDRESTART-SVC: wd_keepalive | ||||
| # NEEDRESTART-CONT: LXC web1 | ||||
| # NEEDRESTART-SESS: metabase @ user manager service | ||||
| # NEEDRESTART-SESS: root @ session #28017 | ||||
|  | ||||
| # STA: | ||||
| #  0: unknown or failed to detect | ||||
| #  1: no pending upgrade | ||||
| #  2: ABI compatible upgrade pending | ||||
| #  3: version upgrade pending | ||||
|  | ||||
| for line in stdout: | ||||
|     # Kernel version | ||||
|     if re.match(r'^NEEDRESTART-KSTA', line): | ||||
|         data['kernel']['state'] = int(line.split(': ')[-1]) | ||||
|     elif re.match(r'^NEEDRESTART-KCUR', line): | ||||
|         data['kernel']['current'] = line.split(': ')[-1] | ||||
|     elif re.match(r'^NEEDRESTART-KEXP', line): | ||||
|         data['kernel']['pending'] = line.split(': ')[-1] | ||||
|     # Microcode version | ||||
|     elif re.match(r'^NEEDRESTART-UCSTA', line): | ||||
|         data['microcode']['state'] = int(line.split(': ')[-1]) | ||||
|     elif re.match(r'^NEEDRESTART-UCCUR', line): | ||||
|         data['microcode']['current'] = line.split(': ')[-1] | ||||
|     elif re.match(r'^NEEDRESTART-UCEXP', line): | ||||
|         data['microcode']['pending'] = line.split(': ')[-1] | ||||
|     # Services needing restart | ||||
|     elif re.match(r'^NEEDRESTART-SVC', line): | ||||
|         data['services']['count'] += 1 | ||||
|         data['services']['list'].append(' '.join(line.split(': ')[1:])) | ||||
| 	# Containers needing restart | ||||
|     elif re.match(f'^NEEDRESTART-CONT', line): | ||||
|         data['containers']['count'] += 1 | ||||
|         data['containers']['list'].append(' '.join(line.split(': ')[1:])) | ||||
|     # Sessions needing restart | ||||
|     elif re.match(f'^NEEDRESTART-SESS', line): | ||||
|         data['sessions']['count'] += 1 | ||||
|         data['sessions']['list'].append(' '.join(line.split(': ')[1:])) | ||||
|  | ||||
| print("<<<freshness>>>") | ||||
| print(json.dumps(data)) | ||||
| exit(0) | ||||
							
								
								
									
										51
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/kernel_taint
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/kernel_taint
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| taints_msg = list() | ||||
| taints_err = list() | ||||
|  | ||||
| taint_map = { | ||||
|     0: { "text": "Proprietary module was loaded", "error": False }, | ||||
|     1: { "text": "Module was force loaded", "error": True }, | ||||
|     2: { "text": "Kernel running on an out of specification system", "error": True }, | ||||
|     3: { "text": "Module was force unloaded", "error": True }, | ||||
|     4: { "text": "Processor reported a Machine Check Exception (MCE)", "error": True }, | ||||
|     5: { "text": "Bad page referenced or some unexpected page flags", "error": True }, | ||||
|     6: { "text": "Taint requested by userspace application", "error": True }, | ||||
|     7: { "text": "Kernel died recently (OOPS or BUG)", "error": True }, | ||||
|     8: { "text": "ACPI table overridden by user", "error": True }, | ||||
|     9: { "text": "Kernel issued warning", "error": True }, | ||||
|     10: { "text": "Staging driver was loaded", "error": False }, | ||||
|     11: { "text": "Workaround for bug in platform firmware applied", "error": True }, | ||||
|     12: { "text": "Externally-built module was loaded", "error": False }, | ||||
|     13: { "text": "Unsigned module was loaded", "error": False }, | ||||
|     14: { "text": "Soft lockup occurred", "error": True }, | ||||
|     15: { "text": "Kernel has been live patched", "error": True }, | ||||
|     16: { "text": "Auxiliary taint", "error": True }, | ||||
|     17: { "text": "Kernel was built with the struct randomization plugin", "error": True }, | ||||
|     18: { "text": "An in-kernel test has been run", "error": True }, | ||||
| } | ||||
|  | ||||
| with open("/proc/sys/kernel/tainted") as tfh: | ||||
|     taint_val = int(tfh.read().strip()) | ||||
|  | ||||
| for i in range(0, 18): | ||||
|     xor_val = i ** 2 | ||||
|     val = (taint_val >> i) & 1 | ||||
|     if val == 0: | ||||
|         continue | ||||
|  | ||||
|     taint = taint_map[i]     | ||||
|     taints_msg.append(taint['text']) | ||||
|     taints_err.append(taint['error']) | ||||
|  | ||||
| if len(taints_msg) < 1: | ||||
|     taints_err.append(False) | ||||
|     taints_msg = ["Kernel is untainted"] | ||||
|  | ||||
| if all(taints_err): | ||||
|     state = "WARN" | ||||
| else: | ||||
|     state = "OK" | ||||
|  | ||||
| print("<<<kernel_taint>>>") | ||||
| print(f'{state} {"; ".join(taints_msg)}') | ||||
							
								
								
									
										564
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/mk_logwatch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										564
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/mk_logwatch
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,564 @@ | ||||
| #!/usr/bin/python | ||||
| # -*- encoding: utf-8; py-indent-offset: 4 -*- | ||||
| # +------------------------------------------------------------------+ | ||||
| # |             ____ _               _        __  __ _  __           | | ||||
| # |            / ___| |__   ___  ___| | __   |  \/  | |/ /           | | ||||
| # |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            | | ||||
| # |           | |___| | | |  __/ (__|   <    | |  | | . \            | | ||||
| # |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           | | ||||
| # |                                                                  | | ||||
| # | Copyright Mathias Kettner 2014             mk@mathias-kettner.de | | ||||
| # +------------------------------------------------------------------+ | ||||
| # | ||||
| # This file is part of Check_MK. | ||||
| # The official homepage is at http://mathias-kettner.de/check_mk. | ||||
| # | ||||
| # check_mk is free software;  you can redistribute it and/or modify it | ||||
| # under the  terms of the  GNU General Public License  as published by | ||||
| # the Free Software Foundation in version 2.  check_mk is  distributed | ||||
| # in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with- | ||||
| # out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A | ||||
| # PARTICULAR PURPOSE. See the  GNU General Public License for more de- | ||||
| # tails. You should have  received  a copy of the  GNU  General Public | ||||
| # License along with GNU Make; see the file  COPYING.  If  not,  write | ||||
| # to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor, | ||||
| # Boston, MA 02110-1301 USA. | ||||
|  | ||||
| # Call with -d for debug mode: colored output, no saving of status | ||||
|  | ||||
| import sys, os, re, time, glob | ||||
|  | ||||
|  | ||||
| #   .--MEI-Cleanup---------------------------------------------------------. | ||||
| #   |     __  __ _____ ___       ____ _                                    | | ||||
| #   |    |  \/  | ____|_ _|     / ___| | ___  __ _ _ __  _   _ _ __        | | ||||
| #   |    | |\/| |  _|  | |_____| |   | |/ _ \/ _` | '_ \| | | | '_ \       | | ||||
| #   |    | |  | | |___ | |_____| |___| |  __/ (_| | | | | |_| | |_) |      | | ||||
| #   |    |_|  |_|_____|___|     \____|_|\___|\__,_|_| |_|\__,_| .__/       | | ||||
| #   |                                                         |_|          | | ||||
| #   +----------------------------------------------------------------------+ | ||||
| # In case the program crashes or is killed in a hard way, the frozen binary .exe | ||||
| # may leave temporary directories named "_MEI..." in the temporary path. Clean them | ||||
| # up to prevent eating disk space over time. | ||||
|  | ||||
| ######################################################################## | ||||
| ############## DUPLICATE CODE WARNING ################################## | ||||
| ### This code is also used in the cmk-update-agent frozen binary ####### | ||||
| ### Any changes to this class should also be made in cmk-update-agent ## | ||||
| ### In the bright future we will move this code into a library ######### | ||||
| ######################################################################## | ||||
|  | ||||
| class MEIFolderCleaner(object): | ||||
|     def pid_running(self, pid): | ||||
|         import ctypes | ||||
|         kernel32 = ctypes.windll.kernel32 | ||||
|         SYNCHRONIZE = 0x100000 | ||||
|  | ||||
|         process = kernel32.OpenProcess(SYNCHRONIZE, 0, pid) | ||||
|  | ||||
|         if process != 0: | ||||
|             kernel32.CloseHandle(process) | ||||
|             return True | ||||
|         else: | ||||
|             return False | ||||
|  | ||||
|  | ||||
|     def find_and_remove_leftover_folders(self, hint_filenames): | ||||
|         if not hasattr(sys, "frozen"): | ||||
|             return | ||||
|  | ||||
|         import win32file  # pylint: disable=import-error | ||||
|         import tempfile | ||||
|         base_path = tempfile.gettempdir() | ||||
|         for f in os.listdir(base_path): | ||||
|             try: | ||||
|                 path = os.path.join(base_path, f) | ||||
|  | ||||
|                 if not os.path.isdir(path): | ||||
|                     continue | ||||
|  | ||||
|                 # Only care about directories related to our program | ||||
|                 invalid_dir = False | ||||
|                 for hint_filename in hint_filenames: | ||||
|                     if not os.path.exists(os.path.join(path, hint_filename)): | ||||
|                         invalid_dir = True | ||||
|                         break | ||||
|                 if invalid_dir: | ||||
|                     continue | ||||
|  | ||||
|                 pyinstaller_tmp_path = win32file.GetLongPathName(sys._MEIPASS).lower() # pylint: disable=no-member | ||||
|                 if pyinstaller_tmp_path == path.lower(): | ||||
|                     continue # Skip our own directory | ||||
|  | ||||
|                 # Extract the process id from the directory and check whether or not it is still | ||||
|                 # running. Don't delete directories of running processes! | ||||
|                 # The name of the temporary directories is "_MEI<PID><NR>". We try to extract the PID | ||||
|                 # by stripping of a single digit from the right. In the hope the NR is a single digit | ||||
|                 # in all relevant cases. | ||||
|                 pid = int(f[4:-1]) | ||||
|                 if self.pid_running(pid): | ||||
|                     continue | ||||
|  | ||||
|                 shutil.rmtree(path) | ||||
|             except Exception, e: | ||||
|                 # TODO: introduce verbose mode for mk_logwatch | ||||
|                 pass | ||||
| #. | ||||
|  | ||||
| os_type = "linux" | ||||
| try: | ||||
|     import platform | ||||
|     os_type = platform.system().lower() | ||||
| except: | ||||
|     pass | ||||
|  | ||||
| if '-d' in sys.argv[1:] or '--debug' in sys.argv[1:]: | ||||
|     tty_red     = '\033[1;31m' | ||||
|     tty_green   = '\033[1;32m' | ||||
|     tty_yellow  = '\033[1;33m' | ||||
|     tty_blue    = '\033[1;34m' | ||||
|     tty_normal  = '\033[0m' | ||||
|     debug = True | ||||
| else: | ||||
|     tty_red     = '' | ||||
|     tty_green   = '' | ||||
|     tty_yellow  = '' | ||||
|     tty_blue    = '' | ||||
|     tty_normal  = '' | ||||
|     debug = False | ||||
|  | ||||
| # The configuration file and status file are searched | ||||
| # in the directory named by the environment variable | ||||
| # LOGWATCH_DIR. If that is not set, MK_CONFDIR is used. | ||||
| # If that is not set either, the current directory ist | ||||
| # used. | ||||
| logwatch_dir = os.getenv("LOGWATCH_DIR") | ||||
| if logwatch_dir: | ||||
|     mk_confdir = logwatch_dir | ||||
|     mk_vardir = logwatch_dir | ||||
| else: | ||||
|     mk_confdir = os.getenv("MK_CONFDIR") or "." | ||||
|     mk_vardir = os.getenv("MK_VARDIR") or os.getenv("MK_STATEDIR") or "." | ||||
|  | ||||
|  | ||||
| sys.stdout.write("<<<logwatch>>>\n") | ||||
|  | ||||
| config_filename = mk_confdir + "/logwatch.cfg" | ||||
| config_dir      = mk_confdir + "/logwatch.d/*.cfg" | ||||
|  | ||||
|  | ||||
| # Determine the name of the state file | ||||
| # $REMOTE set                   -> logwatch.state.$REMOTE | ||||
| # $REMOTE not set and a tty     -> logwatch.state.local | ||||
| # $REMOTE not set and not a tty -> logwatch.state | ||||
| remote_hostname = os.getenv("REMOTE", "") | ||||
| remote_hostname = remote_hostname.replace(":", "_") | ||||
| if remote_hostname != "": | ||||
|     status_filename = "%s/logwatch.state.%s" % (mk_vardir, remote_hostname) | ||||
| else: | ||||
|     if sys.stdout.isatty(): | ||||
|         status_filename = "%s/logwatch.state.local" % mk_vardir | ||||
|     else: | ||||
|         status_filename = "%s/logwatch.state" % mk_vardir | ||||
|  | ||||
| # Copy the last known state from the logwatch.state when there is no status_filename yet. | ||||
| if not os.path.exists(status_filename) and os.path.exists("%s/logwatch.state" % mk_vardir): | ||||
|     import shutil | ||||
|     shutil.copy("%s/logwatch.state" % mk_vardir, status_filename) | ||||
|  | ||||
| def is_not_comment(line): | ||||
|     if line.lstrip().startswith('#') or \ | ||||
|        line.strip() == '': | ||||
|         return False | ||||
|     return True | ||||
|  | ||||
| def parse_filenames(line): | ||||
|     return line.split() | ||||
|  | ||||
| def parse_pattern(level, pattern, line): | ||||
|     if level not in [ 'C', 'W', 'I', 'O' ]: | ||||
|         raise Exception("Invalid pattern line '%s'" % line) | ||||
|  | ||||
|     try: | ||||
|         compiled = re.compile(pattern) | ||||
|     except: | ||||
|         raise Exception("Invalid regular expression in line '%s'" % line) | ||||
|  | ||||
|     return (level, compiled) | ||||
|  | ||||
| def read_config(): | ||||
|     config_lines = [] | ||||
|     try: | ||||
|         config_lines += [ line.rstrip() for line in filter(is_not_comment, file(config_filename).readlines()) ] | ||||
|     except IOError, e: | ||||
|         if debug: | ||||
|             raise | ||||
|  | ||||
|     # Add config from a logwatch.d folder | ||||
|     for config_file in glob.glob(config_dir): | ||||
|         config_lines += [ line.rstrip() for line in filter(is_not_comment, file(config_file).readlines()) ] | ||||
|  | ||||
|     have_filenames = False | ||||
|     config = [] | ||||
|     cont_list = [] | ||||
|     rewrite_list = [] | ||||
|  | ||||
|     for line in config_lines: | ||||
|         if line[0].isspace(): # pattern line | ||||
|             if not have_filenames: | ||||
|                 raise Exception("Missing logfile names") | ||||
|  | ||||
|             level, pattern = line.split(None, 1) | ||||
|  | ||||
|             if level == 'A': | ||||
|                 cont_list.append(parse_cont_pattern(pattern)) | ||||
|             elif level == 'R': | ||||
|                 rewrite_list.append(pattern) | ||||
|             else: | ||||
|                 level, compiled = parse_pattern(level, pattern, line) | ||||
|                 # New pattern for line matching => clear continuation and rewrite patterns | ||||
|                 cont_list = [] | ||||
|                 rewrite_list = [] | ||||
|                 # TODO: Fix the code and remove the pragma below! | ||||
|                 patterns.append((level, compiled, cont_list, rewrite_list))  # pylint: disable=used-before-assignment | ||||
|  | ||||
|         else: # filename line | ||||
|             patterns = [] | ||||
|             cont_list = [] # Clear list of continuation patterns from last file | ||||
|             rewrite_list = [] # Same for rewrite patterns | ||||
|             config.append((parse_filenames(line), patterns)) | ||||
|             have_filenames = True | ||||
|     return config | ||||
|  | ||||
| def parse_cont_pattern(pattern): | ||||
|     try: | ||||
|         return int(pattern) | ||||
|     except: | ||||
|         try: | ||||
|             return re.compile(pattern) | ||||
|         except: | ||||
|             if debug: | ||||
|                 raise | ||||
|             raise Exception("Invalid regular expression in line '%s'" % pattern) | ||||
|  | ||||
| # structure of statusfile | ||||
| # # LOGFILE         OFFSET    INODE | ||||
| # /var/log/messages|7767698|32455445 | ||||
| # /var/test/x12134.log|12345|32444355 | ||||
| def read_status(): | ||||
|     if debug: | ||||
|         return {} | ||||
|  | ||||
|     status = {} | ||||
|     for line in file(status_filename): | ||||
|         # TODO: Remove variants with spaces. rsplit is | ||||
|         # not portable. split fails if logfilename contains | ||||
|         # spaces | ||||
|         inode = -1 | ||||
|         try: | ||||
|             parts = line.split('|') | ||||
|             filename = parts[0] | ||||
|             offset = parts[1] | ||||
|             if len(parts) >= 3: | ||||
|                 inode = parts[2] | ||||
|  | ||||
|         except: | ||||
|             try: | ||||
|                 filename, offset = line.rsplit(None, 1) | ||||
|             except: | ||||
|                 filename, offset = line.split(None, 1) | ||||
|         status[filename] = int(offset), int(inode) | ||||
|     return status | ||||
|  | ||||
| def save_status(status): | ||||
|     f = file(status_filename, "w") | ||||
|     for filename, (offset, inode) in status.items(): | ||||
|         f.write("%s|%d|%d\n" % (filename, offset, inode)) | ||||
|  | ||||
| pushed_back_line = None | ||||
| def next_line(file_handle): | ||||
|     global pushed_back_line | ||||
|     if pushed_back_line != None: | ||||
|         line = pushed_back_line | ||||
|         pushed_back_line = None | ||||
|         return line | ||||
|     else: | ||||
|         try: | ||||
|             line = file_handle.next() | ||||
|             # Avoid parsing of (yet) incomplete lines (when acutal application | ||||
|             # is just in the process of writing) | ||||
|             # Just check if the line ends with a \n. This handles \n and \r\n | ||||
|             if not line.endswith("\n"): | ||||
|                 begin_of_line_offset = file_handle.tell() - len(line) | ||||
|                 os.lseek(file_handle.fileno(), begin_of_line_offset, 0) | ||||
|                 return None | ||||
|             return line | ||||
|         except: | ||||
|             return None | ||||
|  | ||||
|  | ||||
| def is_inode_cabable(path): | ||||
|     if "linux" in os_type: | ||||
|         return True | ||||
|     elif "windows" in os_type: | ||||
|         volume_name = "%s:\\\\" % path.split(":", 1)[0] | ||||
|         import win32api  # pylint: disable=import-error | ||||
|         volume_info = win32api.GetVolumeInformation(volume_name) | ||||
|         volume_type = volume_info[-1] | ||||
|         if "ntfs" in volume_type.lower(): | ||||
|             return True | ||||
|         else: | ||||
|             return False | ||||
|     else: | ||||
|         return False | ||||
|  | ||||
|  | ||||
| def process_logfile(logfile, patterns): | ||||
|     global pushed_back_line | ||||
|  | ||||
|     # Look at which file offset we have finished scanning | ||||
|     # the logfile last time. If we have never seen this file | ||||
|     # before, we set the offset to -1 | ||||
|     offset, prev_inode = status.get(logfile, (-1, -1)) | ||||
|     try: | ||||
|         file_desc = os.open(logfile, os.O_RDONLY) | ||||
|         if not is_inode_cabable(logfile): | ||||
|             inode = 1 # Create a dummy inode | ||||
|         else: | ||||
|             inode = os.fstat(file_desc)[1] # 1 = st_ino | ||||
|     except: | ||||
|         if debug: | ||||
|             raise | ||||
|         sys.stdout.write("[[[%s:cannotopen]]]\n" % logfile) | ||||
|         return | ||||
|  | ||||
|     sys.stdout.write("[[[%s]]]\n" % logfile) | ||||
|  | ||||
|     # Seek to the current end in order to determine file size | ||||
|     current_end = os.lseek(file_desc, 0, 2) # os.SEEK_END not available in Python 2.4 | ||||
|     status[logfile] = current_end, inode | ||||
|  | ||||
|     # If we have never seen this file before, we just set the | ||||
|     # current pointer to the file end. We do not want to make | ||||
|     # a fuss about ancient log messages... | ||||
|     if offset == -1: | ||||
|         if not debug: | ||||
|             return | ||||
|         else: | ||||
|             offset = 0 | ||||
|  | ||||
|  | ||||
|     # If the inode of the logfile has changed it has appearently | ||||
|     # been started from new (logfile rotation). At least we must | ||||
|     # assume that. In some rare cases (restore of a backup, etc) | ||||
|     # we are wrong and resend old log messages | ||||
|     if prev_inode >= 0 and inode != prev_inode: | ||||
|         offset = 0 | ||||
|  | ||||
|     # Our previously stored offset is the current end -> | ||||
|     # no new lines in this file | ||||
|     if offset == current_end: | ||||
|         return # nothing new | ||||
|  | ||||
|     # If our offset is beyond the current end, the logfile has been | ||||
|     # truncated or wrapped while keeping the same inode. We assume | ||||
|     # that it contains all new data in that case and restart from | ||||
|     # offset 0. | ||||
|     if offset > current_end: | ||||
|         offset = 0 | ||||
|  | ||||
|     # now seek to offset where interesting data begins | ||||
|     os.lseek(file_desc, offset, 0) # os.SEEK_SET not available in Python 2.4 | ||||
|     if os_type == "windows": | ||||
|         import io # Available with python 2.6 | ||||
|         import codecs | ||||
|         # Some windows files are encoded in utf_16 | ||||
|         # Peak the first two bytes to determine the encoding... | ||||
|         peak_handle = os.fdopen(file_desc, "rb") | ||||
|         first_two_bytes = peak_handle.read(2) | ||||
|         use_encoding = None | ||||
|         if first_two_bytes == "\xFF\xFE": | ||||
|             use_encoding = "utf_16" | ||||
|         elif first_two_bytes == "\xFE\xFF": | ||||
|             use_encoding = "utf_16_be" | ||||
|  | ||||
|         os.lseek(file_desc, offset, 0) # os.SEEK_SET not available in Python 2.4 | ||||
|         file_handle = io.open(file_desc, encoding = use_encoding) | ||||
|     else: | ||||
|         file_handle = os.fdopen(file_desc) | ||||
|     worst = -1 | ||||
|     outputtxt = "" | ||||
|     lines_parsed = 0 | ||||
|     start_time = time.time() | ||||
|  | ||||
|     while True: | ||||
|         line = next_line(file_handle) | ||||
|         if line == None: | ||||
|             break # End of file | ||||
|  | ||||
|         # Handle option maxlinesize | ||||
|         if opt_maxlinesize != None and len(line) > opt_maxlinesize: | ||||
|             line = line[:opt_maxlinesize] + "[TRUNCATED]\n" | ||||
|  | ||||
|         lines_parsed += 1 | ||||
|         # Check if maximum number of new log messages is exceeded | ||||
|         if opt_maxlines != None and lines_parsed > opt_maxlines: | ||||
|             outputtxt += "%s Maximum number (%d) of new log messages exceeded.\n" % ( | ||||
|                opt_overflow, opt_maxlines) | ||||
|             worst = max(worst, opt_overflow_level) | ||||
|             os.lseek(file_desc, 0, 2) # Seek to end of file, skip all other messages | ||||
|             break | ||||
|  | ||||
|         # Check if maximum processing time (per file) is exceeded. Check only | ||||
|         # every 100'th line in order to save system calls | ||||
|         if opt_maxtime != None and lines_parsed % 100 == 10 \ | ||||
|             and time.time() - start_time > opt_maxtime: | ||||
|             outputtxt += "%s Maximum parsing time (%.1f sec) of this log file exceeded.\n" % ( | ||||
|                opt_overflow, opt_maxtime) | ||||
|             worst = max(worst, opt_overflow_level) | ||||
|             os.lseek(file_desc, 0, 2) # Seek to end of file, skip all other messages | ||||
|             break | ||||
|  | ||||
|         level = "." | ||||
|         for lev, pattern, cont_patterns, replacements in patterns: | ||||
|             matches = pattern.search(line[:-1]) | ||||
|             if matches: | ||||
|                 level = lev | ||||
|                 levelint = {'C': 2, 'W': 1, 'O': 0, 'I': -1, '.': -1}[lev] | ||||
|                 worst = max(levelint, worst) | ||||
|  | ||||
|                 # Check for continuation lines | ||||
|                 for cont_pattern in cont_patterns: | ||||
|                     if type(cont_pattern) == int: # add that many lines | ||||
|                         for _unused_x in range(cont_pattern): | ||||
|                             cont_line = next_line(file_handle) | ||||
|                             if cont_line == None: # end of file | ||||
|                                 break | ||||
|                             line = line[:-1] + "\1" + cont_line | ||||
|  | ||||
|                     else: # pattern is regex | ||||
|                         while True: | ||||
|                             cont_line = next_line(file_handle) | ||||
|                             if cont_line == None: # end of file | ||||
|                                 break | ||||
|                             elif cont_pattern.search(cont_line[:-1]): | ||||
|                                 line = line[:-1] + "\1" + cont_line | ||||
|                             else: | ||||
|                                 pushed_back_line = cont_line # sorry for stealing this line | ||||
|                                 break | ||||
|  | ||||
|                 # Replacement | ||||
|                 for replace in replacements: | ||||
|                     line = replace.replace('\\0', line.rstrip()) + "\n" | ||||
|                     for nr, group in enumerate(matches.groups()): | ||||
|                         line = line.replace('\\%d' % (nr+1), group) | ||||
|  | ||||
|                 break # matching rule found and executed | ||||
|  | ||||
|         color = {'C': tty_red, 'W': tty_yellow, 'O': tty_green, 'I': tty_blue, '.': ''}[level] | ||||
|         if debug: | ||||
|             line = line.replace("\1", "\nCONT:") | ||||
|         if level == "I": | ||||
|             level = "." | ||||
|         if opt_nocontext and level == '.': | ||||
|             continue | ||||
|         outputtxt += "%s%s %s%s\n" % (color, level, line[:-1], tty_normal) | ||||
|  | ||||
|     new_offset = os.lseek(file_desc, 0, 1) # os.SEEK_CUR not available in Python 2.4 | ||||
|     status[logfile] = new_offset, inode | ||||
|  | ||||
|     # output all lines if at least one warning, error or ok has been found | ||||
|     if worst > -1: | ||||
|         sys.stdout.write(outputtxt) | ||||
|         sys.stdout.flush() | ||||
|  | ||||
|     # Handle option maxfilesize, regardless of warning or errors that have happened | ||||
|     if opt_maxfilesize != None and (offset / opt_maxfilesize) < (new_offset / opt_maxfilesize): | ||||
|         sys.stdout.write("%sW Maximum allowed logfile size (%d bytes) exceeded for the %dth time.%s\n" % | ||||
|                   (tty_yellow, opt_maxfilesize, new_offset / opt_maxfilesize, tty_normal)) | ||||
|  | ||||
| try: | ||||
|     # This removes leftover folders which may be generated by crashing frozen binaries | ||||
|     folder_cleaner = MEIFolderCleaner() | ||||
|     folder_cleaner.find_and_remove_leftover_folders(hint_filenames = ["mk_logwatch.exe.manifest"]) | ||||
| except Exception, e: | ||||
|     sys.stdout.write("ERROR WHILE DOING FOLDER: %s\n" % e) | ||||
|     sys.exit(1) | ||||
|  | ||||
| try: | ||||
|     config = read_config() | ||||
| except Exception, e: | ||||
|     if debug: | ||||
|         raise | ||||
|     sys.stdout.write("CANNOT READ CONFIG FILE: %s\n" % e) | ||||
|     sys.exit(1) | ||||
|  | ||||
| # Simply ignore errors in the status file.  In case of a corrupted status file we simply begin | ||||
| # with an empty status. That keeps the monitoring up and running - even if we might lose a | ||||
| # message in the extreme case of a corrupted status file. | ||||
| try: | ||||
|     status = read_status() | ||||
| except Exception, e: | ||||
|     status = {} | ||||
|  | ||||
|  | ||||
| logfile_patterns = {} | ||||
| # The filename line may contain options like 'maxlines=100' or 'maxtime=10' | ||||
| for filenames, patterns in config: | ||||
|     # Initialize options with default values | ||||
|     opt_maxlines = None | ||||
|     opt_maxtime = None | ||||
|     opt_maxlinesize = None | ||||
|     opt_maxfilesize = None | ||||
|     opt_regex = None | ||||
|     opt_overflow = 'C' | ||||
|     opt_overflow_level = 2 | ||||
|     opt_nocontext = False | ||||
|     try: | ||||
|         options = [ o.split('=', 1) for o in filenames if '=' in o ] | ||||
|         for key, value in options: | ||||
|             if key == 'maxlines': | ||||
|                 opt_maxlines = int(value) | ||||
|             elif key == 'maxtime': | ||||
|                 opt_maxtime = float(value) | ||||
|             elif key == 'maxlinesize': | ||||
|                 opt_maxlinesize = int(value) | ||||
|             elif key == 'maxfilesize': | ||||
|                 opt_maxfilesize = int(value) | ||||
|             elif key == 'overflow': | ||||
|                 if value not in [ 'C', 'I', 'W', 'O' ]: | ||||
|                     raise Exception("Invalid value %s for overflow. Allowed are C, I, O and W" % value) | ||||
|                 opt_overflow = value | ||||
|                 opt_overflow_level = {'C':2, 'W':1, 'O':0, 'I':0}[value] | ||||
|             elif key == 'regex': | ||||
|                 opt_regex = re.compile(value) | ||||
|             elif key == 'iregex': | ||||
|                 opt_regex = re.compile(value, re.I) | ||||
|             elif key == 'nocontext': | ||||
|                 opt_nocontext = True | ||||
|             else: | ||||
|                 raise Exception("Invalid option %s" % key) | ||||
|     except Exception, e: | ||||
|         if debug: | ||||
|             raise | ||||
|         sys.stdout.write("INVALID CONFIGURATION: %s\n" % e) | ||||
|         sys.exit(1) | ||||
|  | ||||
|  | ||||
|     for glob_pattern in filenames: | ||||
|         if '=' in glob_pattern: | ||||
|             continue | ||||
|         logfiles = glob.glob(glob_pattern) | ||||
|         if opt_regex: | ||||
|             logfiles = [ f for f in logfiles if opt_regex.search(f) ] | ||||
|         if len(logfiles) == 0: | ||||
|             sys.stdout.write('[[[%s:missing]]]\n' % glob_pattern) | ||||
|         else: | ||||
|             for logfile in logfiles: | ||||
|                 logfile_patterns[logfile] = logfile_patterns.get(logfile, []) + patterns | ||||
|  | ||||
| for logfile, patterns in logfile_patterns.items(): | ||||
|     process_logfile(logfile, patterns) | ||||
|  | ||||
| if not debug: | ||||
|     save_status(status) | ||||
							
								
								
									
										71
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/ownership
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										71
									
								
								common-debian/files/usr/lib/check_mk_agent/plugins/ownership
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # File ownership check for Check_MK | ||||
| # Ensures that no files outside of homedirs are owned by administrative users | ||||
| # Installed by BLSE 2.x ansible | ||||
|  | ||||
| ADMIN_UID_MIN=200 | ||||
| ADMIN_UID_MAX=599 | ||||
| # http://www.debian.org/doc/debian-policy/ch-opersys.html | ||||
| # 0-99: Globally allocated by the Debian project | ||||
| # 100-199: (BLSE) Dynamically allocated system users and groups | ||||
| # 200-299: (BLSE) BLSE service users and groups | ||||
| # 300-499: (BLSE) reserved | ||||
| # 500-599: (BLSE) system administrators | ||||
| # 600-999: (BLSE) Dynamically allocated system users and groups | ||||
| # 64045:   (BLSE) ceph | ||||
|  | ||||
| function is_element_of { | ||||
|     local TO_FIND=$1 | ||||
|     shift | ||||
|  | ||||
|     for ARRAY_ELEMENT in $* | ||||
|     do | ||||
|         if test $TO_FIND = $ARRAY_ELEMENT | ||||
|         then | ||||
|             return 0 | ||||
|         fi | ||||
|     done | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| OK=0 | ||||
| WARNING=1 | ||||
|  | ||||
| FILESYSTEMs=(/ /var/log) | ||||
| MOUNTs=($(awk '{print $2}' '/proc/mounts')) | ||||
|  | ||||
| FILEs=() | ||||
| for FILESYSTEM in ${FILESYSTEMs[@]}; do | ||||
|     while IFS= read -r -d $'\0' FILE | ||||
|     do | ||||
|         if ! is_element_of "$FILE" ${FILESYSTEMs[*]}; then | ||||
|             if is_element_of $FILE ${MOUNTs[*]}; then | ||||
|                 continue | ||||
|             fi | ||||
|         fi | ||||
|         FILEs+=($FILE) | ||||
|     done < <( find ${FILESYSTEM} -xdev -uid +${ADMIN_UID_MIN} -uid -${ADMIN_UID_MAX} \ | ||||
|         -not \( -type d -a \( -path /media -o -path /mnt \) \) \ | ||||
|         -not \( -name '.*.swp' -a -mtime -3 \) \ | ||||
|         -not \( -path '*/.git' -o -path '*/.git/*' \) \ | ||||
|         -not \( -path '*.dirtrack.Storable' \) \ | ||||
|         -not \( -path '/home/*' \) \ | ||||
|         -not \( -path '/tmp/*' \) \ | ||||
|         -not \( -path '/var/home/*' \) \ | ||||
|         -not \( -path '/var/log/gitlab/*' \) \ | ||||
|         -not \( -path '/var/spool/cron/crontabs/*' \) \ | ||||
|         -print0 2>/dev/null ) | ||||
| done | ||||
|  | ||||
| echo "<<<file_ownership>>>" | ||||
|  | ||||
| if ! test ${#FILEs[*]} -eq 0; then | ||||
|     echo -n "${#FILEs[*]} file(s) found with invalid ownership (must be UID outside of ${ADMIN_UID_MIN}-${ADMIN_UID_MAX}): " | ||||
|     echo "${FILEs[*]}" | ||||
|     exit $WARNING | ||||
| else | ||||
|     echo "All files have valid ownership" | ||||
|     exit $OK | ||||
| fi | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								common-debian/files/usr/lib/openssh/ssh-keysign
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								common-debian/files/usr/lib/openssh/ssh-keysign
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										42
									
								
								common-debian/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								common-debian/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| --- | ||||
| - name: load sysctl tweaks | ||||
|   shell: "/sbin/sysctl -p /etc/sysctl.d/{{ item }}" | ||||
|   loop: "{{ sysctl_files }}" | ||||
|  | ||||
| - name: restart zramswap | ||||
|   service: | ||||
|     name: zramswap | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart ntp | ||||
|   service: | ||||
|     name: ntp | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart postfix | ||||
|   service: | ||||
|     name: postfix | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart nftables | ||||
|   service: | ||||
|     name: nftables | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart rsyslog | ||||
|   service: | ||||
|     name: rsyslog | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart ssh | ||||
|   service: | ||||
|     name: ssh | ||||
|     state: restarted | ||||
|  | ||||
| - name: restart fail2ban | ||||
|   service: | ||||
|     name: fail2ban | ||||
|     state: restarted | ||||
|  | ||||
| - name: generate locales | ||||
|   command: /usr/sbin/locale-gen | ||||
							
								
								
									
										92
									
								
								common-debian/tasks/apt-base.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								common-debian/tasks/apt-base.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| --- | ||||
| - name: install apt prerequisite packages | ||||
|   apt: | ||||
|     name: | ||||
|       - gpg | ||||
|       - gnupg | ||||
|     state: latest | ||||
|   when: bootstrap | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: no | ||||
|  | ||||
| - name: install apt configuration files | ||||
|   template: | ||||
|     src: "etc/apt/apt.conf.d/{{ item }}.j2" | ||||
|     dest: "/etc/apt/apt.conf.d/{{ item }}" | ||||
|     mode: 0644 | ||||
|   loop: "{{ apt_configurations }}" | ||||
|   register: configuration | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: yes | ||||
|   when: configuration.changed | ||||
|  | ||||
| - name: install apt pins configuration file | ||||
|   template: | ||||
|     src: "etc/apt/preferences.d/pins.j2" | ||||
|     dest: "/etc/apt/preferences.d/pins" | ||||
|     mode: 0644 | ||||
|   register: pins | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: yes | ||||
|   when: pins.changed | ||||
|  | ||||
| - name: remove base apt sources files | ||||
|   file: | ||||
|     dest: /etc/apt/sources.list | ||||
|     state: absent | ||||
|  | ||||
| - name: install apt sources files | ||||
|   template: | ||||
|     src: "etc/apt/sources.list.d/source.j2" | ||||
|     dest: "/etc/apt/sources.list.d/{{ item.name }}.list" | ||||
|     mode: 0644 | ||||
|   loop: "{{ apt_sources }}" | ||||
|   register: sources | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: yes | ||||
|   when: sources.changed | ||||
|  | ||||
| - name: install supplemental apt keyrings | ||||
|   apt_key: | ||||
|     url: "{{ item.gpg_url }}" | ||||
|     id: "{{ item.gpg_id }}" | ||||
|     keyring: "/etc/apt/trusted.gpg.d/{{ item.name }}.gpg" | ||||
|     state: present | ||||
|   when: item.gpg_url is defined and item.gpg_url | ||||
|   loop: "{{ apt_sources }}" | ||||
|   register: keyrings | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: yes | ||||
|   when: keyrings.changed | ||||
|  | ||||
| - name: set apt package preferences | ||||
|   debconf: | ||||
|     name: "{{ item.name }}" | ||||
|     question: "{{ item.question }}" | ||||
|     vtype: "{{ item.vtype }}" | ||||
|     value: "{{ item.value }}" | ||||
|   loop: "{{ apt_preferences }}" | ||||
|   register: preferences | ||||
|  | ||||
| - set_fact: | ||||
|     update_cache: yes | ||||
|   when: preferences.changed | ||||
|  | ||||
| - name: install cleanup scripts | ||||
|   template: | ||||
|     src: "usr/local/sbin/{{ item }}.j2" | ||||
|     dest: "/usr/local/sbin/{{ item }}" | ||||
|     mode: 0755 | ||||
|   loop: | ||||
|     - dpkg-cleanup.sh | ||||
|     - kernel-cleanup.sh | ||||
|  | ||||
| - name: update apt cache | ||||
|   apt: | ||||
|     update_cache: yes | ||||
|   when: update_cache | ||||
							
								
								
									
										17
									
								
								common-debian/tasks/apt-bootstrap.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								common-debian/tasks/apt-bootstrap.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| --- | ||||
| - name: clean out apt cache | ||||
|   file: | ||||
|     path: /var/cache/apt/archives | ||||
|     state: absent | ||||
|  | ||||
| - name: install pending updates and autoremove | ||||
|   apt: | ||||
|     update_cache: yes | ||||
|     autoremove: yes | ||||
|     upgrade: full | ||||
|  | ||||
| - name: install dbus if missing | ||||
|   apt: | ||||
|     name: | ||||
|       - dbus | ||||
|     state: latest | ||||
							
								
								
									
										24
									
								
								common-debian/tasks/apt-packages.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								common-debian/tasks/apt-packages.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| --- | ||||
| - name: install new packages | ||||
|   apt: | ||||
|     name: "{{ packages_add }}" | ||||
|     state: latest | ||||
|  | ||||
| - name: remove unneeded packages | ||||
|   apt: | ||||
|     name: "{{ packages_remove }}" | ||||
|     state: absent | ||||
|     purge: yes | ||||
|  | ||||
| - name: ensure services are started and enabled | ||||
|   service: | ||||
|     name: "{{ item }}" | ||||
|     state: started | ||||
|     enabled: yes | ||||
|   loop: "{{ enabled_services }}" | ||||
|  | ||||
| - name: disable needrestrt dpkg integration if present | ||||
|   file: | ||||
|     dest: /usr/lib/needrestart/dpkg-status | ||||
|     mode: o-x,g-x,u-x | ||||
|   when: "'needrestart' in packages_add" | ||||
							
								
								
									
										23
									
								
								common-debian/tasks/facts.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								common-debian/tasks/facts.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| --- | ||||
| - name: create local facts directory | ||||
|   file: | ||||
|     dest: /etc/ansible/facts.d | ||||
|     state: directory | ||||
|     recurse: yes | ||||
|  | ||||
| - name: install local facts | ||||
|   template: | ||||
|     src: "etc/ansible/facts.d/{{ item }}.fact.j2" | ||||
|     dest: "/etc/ansible/facts.d/{{ item }}.fact" | ||||
|     mode: 0755 | ||||
|   register: installed_facts | ||||
|   loop: "{{ custom_facts }}" | ||||
|  | ||||
| - name: regather all facts | ||||
|   setup: | ||||
|     gather_subset: "all,local" | ||||
|   when: installed_facts.changed | ||||
|  | ||||
| - name: set moe_release fact | ||||
|   set_fact: | ||||
|     moe_release: "{{ ansible_local.moe_release }}" | ||||
							
								
								
									
										117
									
								
								common-debian/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								common-debian/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| --- | ||||
|  | ||||
| # First-run check | ||||
| # Determines if the system has been bootstrapped previously | ||||
| - name: ensure moe directory exists | ||||
|   file: | ||||
|     dest: /etc/moe | ||||
|     state: directory | ||||
|   tags: always | ||||
|  | ||||
| - name: first run bootstrap check | ||||
|   shell: "date > /etc/moe/bootstrapped" | ||||
|   register: bootstrap_check | ||||
|   args: | ||||
|     creates: "/etc/moe/bootstrapped" | ||||
|   tags: always | ||||
|  | ||||
| - set_fact: | ||||
|     bootstrap: no | ||||
|   tags: always | ||||
|  | ||||
| - set_fact: | ||||
|     bootstrap: yes | ||||
|   when: bootstrap_check.changed | ||||
|   tags: always | ||||
|  | ||||
| # Set system hostname | ||||
| # Ensures that the system hostname matches the inventory hostname | ||||
| - name: set hostname to inventory_hostname | ||||
|   copy: | ||||
|     dest: /etc/hostname | ||||
|     content: "{{ inventory_hostname }}\n" | ||||
|   tags: always | ||||
|  | ||||
| # Custom facts | ||||
| # Loads facts.yml which installs and regathers supplemental local facts | ||||
| - include: facts.yml | ||||
|   tags: debian-facts | ||||
|  | ||||
| # Configure APT environment | ||||
| # Loads apt-base.yml which configures base Debian repositories | ||||
| - include: apt-base.yml | ||||
|   tags: debian-apt-base | ||||
|  | ||||
| # Bootstrap APT configuration | ||||
| # Loads apt-bootstrap.yml when bootstrap=yes to ensure system is ready for bootstrap | ||||
| - include: apt-bootstrap.yml | ||||
|   when: bootstrap | ||||
|   tags: debian-apt-bootstrap | ||||
|  | ||||
| # Bootstrap restart (pre-configure) | ||||
| # Loads restart.yml when bootstrap=yes to ensure system is ready for bootstrap | ||||
| - include: restart.yml | ||||
|   when: bootstrap | ||||
|   tags: always | ||||
|  | ||||
| # Package configuration | ||||
| # Loads apt-packages.yml to install and remove packages for base system setup | ||||
| - include: apt-packages.yml | ||||
|   tags: debian-apt-packages | ||||
|  | ||||
| # General system setup | ||||
| # Loads system.yml to configure core system items like capabilities, locales, timezones, cron, ntp, etc. | ||||
| - include: system.yml | ||||
|   tags: debian-system | ||||
|  | ||||
| # Networking setup | ||||
| # Loads network.yml to configure core network items like resolv.conf, hosts, firewall, etc. | ||||
| - include: network.yml | ||||
|   tags: debian-network | ||||
|  | ||||
| # Syslog setup | ||||
| # Loads syslog.yml to configure rsyslog | ||||
| - include: syslog.yml | ||||
|   tags: debian-syslog | ||||
|  | ||||
| # Shell setup | ||||
| # Loads shell.yml to configure basic global shell items like sudo, bash, motd, etc. | ||||
| - include: shell.yml | ||||
|   tags: debian-shell | ||||
|  | ||||
| # SSH setup | ||||
| # Loads ssh.yml to configure SSH server for remote management | ||||
| - include: ssh.yml | ||||
|   tags: debian-ssh | ||||
|  | ||||
| # Monitoring setup | ||||
| # Loads monitoring.yml to configure remote monitoring items like check_mk, etc. | ||||
| - include: monitoring.yml | ||||
|   tags: debian-monitoring | ||||
|  | ||||
| # Root user setup | ||||
| # Loads root.yml to configure root user | ||||
| - include: users/root.yml | ||||
|   tags: debian-users-root | ||||
|  | ||||
| # Backup user setup | ||||
| # Loads backup.yml to configure backup user | ||||
| - include: users/backup.yml | ||||
|   tags: debian-users-backup | ||||
|  | ||||
| # Deploy (Ansible) user setup | ||||
| # Loads deploy.yml to configure deploy user | ||||
| - include: users/deploy.yml | ||||
|   tags: debian-users-deploy | ||||
|  | ||||
| # Administrative users setup | ||||
| # Loads admin.yml to configure administrative shell users | ||||
| - include: users/admin.yml | ||||
|   loop: "{{ admin_users }}" | ||||
|   tags: debian-users-admin | ||||
|  | ||||
| # Bootstrap restart (post-configure) | ||||
| # Loads restart.yml when bootstrap=yes to ensure system is finalized after bootstrap | ||||
| - include: restart.yml | ||||
|   when: bootstrap | ||||
|   tags: always | ||||
							
								
								
									
										13
									
								
								common-debian/tasks/monitoring.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								common-debian/tasks/monitoring.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| --- | ||||
| - name: install check_mk logwatch configuration file | ||||
|   template: | ||||
|     src: etc/check_mk/logwatch.cfg.j2 | ||||
|     dest: /etc/check_mk/logwatch.cfg | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: install check_mk agent check configuration files | ||||
|   copy: | ||||
|     src: "usr/lib/check_mk_agent/plugins/{{ item }}" | ||||
|     dest: "/usr/lib/check_mk_agent/plugins/{{ item }}" | ||||
|     mode: 0755 | ||||
|   loop: "{{ check_mk_plugins }}" | ||||
							
								
								
									
										33
									
								
								common-debian/tasks/network.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								common-debian/tasks/network.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| --- | ||||
| - name: disable managed /etc/hosts from cloud-init | ||||
|   lineinfile: | ||||
|     dest: /etc/cloud/cloud.cfg | ||||
|     regexp: "^manage_etc_hosts" | ||||
|     line: "    manage_etc_hosts:false" | ||||
|   ignore_errors: yes | ||||
|  | ||||
| - name: write hosts configuration file | ||||
|   template: | ||||
|     src: etc/hosts.j2 | ||||
|     dest: /etc/hosts | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: write resolver configuration files | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0644 | ||||
|   loop: | ||||
|     - etc/dhcp/dhclient-enter-hooks.d/noresolv | ||||
|     - etc/resolv.conf | ||||
|   ignore_errors: yes | ||||
|  | ||||
| - name: write firewall rules configuration file | ||||
|   template: | ||||
|     src: etc/nftables.conf.j2 | ||||
|     dest: /etc/nftables.conf | ||||
|   when: nftables_rules is defined and nftables_rules | ||||
|   notify: | ||||
|     - restart nftables | ||||
|  | ||||
| - meta: flush_handlers | ||||
							
								
								
									
										10
									
								
								common-debian/tasks/restart.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								common-debian/tasks/restart.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| --- | ||||
| - name: restart system | ||||
|   reboot: | ||||
|     post_reboot_delay: 15 | ||||
|  | ||||
| - name: wait 15 seconds for system to stabilize | ||||
|   pause: | ||||
|     seconds: 15 | ||||
|   become: no | ||||
|   connection: local | ||||
							
								
								
									
										49
									
								
								common-debian/tasks/shell.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								common-debian/tasks/shell.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| --- | ||||
| - name: install sudo configuration file | ||||
|   template: | ||||
|     src: etc/sudoers.j2 | ||||
|     dest: /etc/sudoers | ||||
|     mode: 0440 | ||||
|  | ||||
| - name: install global bashrc configuration file | ||||
|   template: | ||||
|     src: etc/bash.bashrc.j2 | ||||
|     dest: /etc/bash.bashrc | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: install general profile.d script files | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0755 | ||||
|   loop: | ||||
|     - etc/profile.d/w.sh | ||||
|  | ||||
| - name: remove default motd configuration file | ||||
|   file: | ||||
|     dest: /etc/motd | ||||
|     state: absent | ||||
|  | ||||
| - name: install motd handler script file | ||||
|   template: | ||||
|     src: usr/local/sbin/update-motd.sh.j2 | ||||
|     dest: /usr/local/sbin/update-motd.sh | ||||
|     mode: 0755 | ||||
|  | ||||
| - name: install motd update cron file | ||||
|   template: | ||||
|     src: etc/cron.d/update-motd.j2 | ||||
|     dest: /etc/cron.d/update-motd | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: install global htoprc configuration file | ||||
|   template: | ||||
|     src: etc/htoprc.j2 | ||||
|     dest: /etc/htoprc | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: add additional user groups | ||||
|   group: | ||||
|     name: "{{ item.name }}" | ||||
|     gid: "{{ item.gid }}" | ||||
|   loop: "{{ add_groups }}" | ||||
							
								
								
									
										56
									
								
								common-debian/tasks/ssh.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								common-debian/tasks/ssh.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| --- | ||||
| - name: install ssh configuration files | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - restart ssh | ||||
|   loop: | ||||
|     - etc/ssh/ssh_config | ||||
|     - etc/ssh/sshd_config | ||||
|     - etc/ssh/shosts.equiv | ||||
|     - etc/ssh/ssh_known_hosts | ||||
|     - etc/pam.d/sshd | ||||
|  | ||||
| - name: clean up unwanted ssh host keys (DSA and ECDSA) | ||||
|   file: | ||||
|     name: "{{ item }}" | ||||
|     state: absent | ||||
|   notify: | ||||
|     - restart ssh | ||||
|   loop: | ||||
|     - /etc/ssh/ssh_host_dsa_key | ||||
|     - /etc/ssh/ssh_host_dsa_key.pub | ||||
|     - /etc/ssh/ssh_host_ecdsa_key | ||||
|     - /etc/ssh/ssh_host_ecdsa_key.pub | ||||
|  | ||||
| - name: correct permissions on host keys | ||||
|   file: | ||||
|     dest: "{{ item.name }}" | ||||
|     mode: "{{ item.mode }}" | ||||
|   loop: | ||||
|     - name: /etc/ssh/ssh_host_rsa_key | ||||
|       mode: "0600" | ||||
|     - name: /etc/ssh/ssh_host_rsa_key.pub | ||||
|       mode: "0644" | ||||
|     - name: /etc/ssh/ssh_host_ed25519_key | ||||
|       mode: "0600" | ||||
|     - name: /etc/ssh/ssh_host_ed25519_key.pub | ||||
|       mode: "0644" | ||||
|  | ||||
| - name: install fail2ban configuration files | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - restart fail2ban | ||||
|   loop: | ||||
|     - etc/fail2ban/action.d/route.conf | ||||
|     - etc/fail2ban/filter.d/sshd.conf | ||||
|     - etc/fail2ban/jail.d/global.local | ||||
|     - etc/fail2ban/jail.d/sshd.conf | ||||
|     - etc/fail2ban/jail.d/sshd.local | ||||
|  | ||||
| - meta: flush_handlers | ||||
							
								
								
									
										25
									
								
								common-debian/tasks/syslog.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								common-debian/tasks/syslog.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| --- | ||||
| - name: install rsyslog config | ||||
|   template: | ||||
|     src: etc/rsyslog.conf.j2 | ||||
|     dest: /etc/rsyslog.conf | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - restart rsyslog | ||||
|  | ||||
| - name: install logrotate configs | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0644 | ||||
|   loop: | ||||
|     - etc/logrotate.d/rsyslog | ||||
|     - etc/logrotate.d/backup-rsync | ||||
|  | ||||
| - name: set journalctl persistence | ||||
|   template: | ||||
|     src: etc/systemd/journald.conf.j2 | ||||
|     dest: /etc/systemd/journald.conf | ||||
|     mode: 0644 | ||||
|  | ||||
| - meta: flush_handlers | ||||
							
								
								
									
										77
									
								
								common-debian/tasks/system.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								common-debian/tasks/system.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| --- | ||||
| - name: install zramswap configuration | ||||
|   template: | ||||
|     src: etc/default/zramswap.j2 | ||||
|     dest: /etc/default/zramswap | ||||
|   notify: restart zramswap | ||||
|  | ||||
| - name: enable and activate zramswap | ||||
|   service: | ||||
|     name: zramswap | ||||
|     state: started | ||||
|     enabled: yes | ||||
|  | ||||
| - name: set bin capabilities | ||||
|   capabilities: | ||||
|     path: "{{ item.path }}" | ||||
|     capability: "{{ item.capability }}" | ||||
|   ignore_errors: yes | ||||
|   loop: "{{ set_capabilities }}" | ||||
|  | ||||
| - name: install locale configuration files | ||||
|   template: | ||||
|     src: "{{ item }}.j2" | ||||
|     dest: "/{{ item }}" | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - generate locales | ||||
|   loop: | ||||
|     - etc/default/locale | ||||
|     - etc/locale.gen | ||||
|  | ||||
| - name: set timezone | ||||
|   file: | ||||
|     src: "/usr/share/zoneinfo/{{ timezone }}" | ||||
|     dest: /etc/localtime | ||||
|     state: link | ||||
|     mode: 0644 | ||||
|     force: yes | ||||
|  | ||||
| - name: install sysctl tweaks | ||||
|   template: | ||||
|     src: "etc/sysctl.d/{{ item }}.j2" | ||||
|     dest: "/etc/sysctl.d/{{ item }}" | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - load sysctl tweaks | ||||
|   loop: "{{ sysctl_files }}" | ||||
|  | ||||
| - name: install base crontab file | ||||
|   template: | ||||
|     src: etc/crontab.j2 | ||||
|     dest: /etc/crontab | ||||
|     mode: 0644 | ||||
|  | ||||
| - name: install ntp configuration file | ||||
|   template: | ||||
|     src: etc/ntp.conf.j2 | ||||
|     dest: /etc/ntp.conf | ||||
|     mode: 0644 | ||||
|   notify: | ||||
|     - restart ntp | ||||
|  | ||||
| - name: register status of mailhost flag file | ||||
|   stat: | ||||
|     path: "{{ postfix_mailhost_flag_file }}" | ||||
|   register: mailhost_flag | ||||
|  | ||||
| - name: install postfix configuration file (non-mailhost only) | ||||
|   template: | ||||
|     src: etc/postfix/main.cf.j2 | ||||
|     dest: /etc/postfix/main.cf | ||||
|     mode: 0644 | ||||
|   when: not mailhost_flag.stat.exists | ||||
|   notify: | ||||
|     - restart postfix | ||||
|  | ||||
| - meta: flush_handlers | ||||
							
								
								
									
										77
									
								
								common-debian/tasks/users/admin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								common-debian/tasks/users/admin.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| --- | ||||
| - name: "ensure {{ item.name }} user exists and is configured properly" | ||||
|   user: | ||||
|     name: "{{ item.name }}" | ||||
|     uid: "{{ item.uid }}" | ||||
|     group: operator | ||||
|     groups: "adm,sudo,{{ item.add_groups|join(',') }}" | ||||
|     shell: "{{ item.shell }}" | ||||
|     home: "/var/home/{{ item.name }}" | ||||
|     createhome: yes | ||||
|     move_home: yes | ||||
|     append: yes | ||||
|     state: present | ||||
|  | ||||
| - name: "set ownership of {{ item.name }} home directory" | ||||
|   file: | ||||
|     dest: "/var/home/{{ item.name }}" | ||||
|     state: directory | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: "create {{ item.name }} .ssh configuration directory" | ||||
|   file: | ||||
|     dest: "/var/home/{{ item.name }}/.ssh" | ||||
|     state: directory | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: "write {{ item.name }} ssh authorized_keys configuration file" | ||||
|   template: | ||||
|     src: var/home/user/ssh/authorized_keys.j2 | ||||
|     dest: "/var/home/{{ item.name }}/.ssh/authorized_keys" | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0640 | ||||
|  | ||||
| - name: "write {{ item.name }} profile configuration file" | ||||
|   template: | ||||
|     src: var/home/user/profile.j2 | ||||
|     dest: "/var/home/{{ item.name }}/.profile" | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0750 | ||||
|  | ||||
| - name: "write {{ item.name }} bashrc configuration file" | ||||
|   template: | ||||
|     src: var/home/user/bashrc.j2 | ||||
|     dest: "/var/home/{{ item.name }}/.bashrc" | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0750 | ||||
|  | ||||
| - name: "write {{ item.name }} bash_logout configuration file" | ||||
|   template: | ||||
|     src: var/home/user/bash_logout.j2 | ||||
|     dest: "/var/home/{{ item.name }}/.bash_logout" | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0750 | ||||
|  | ||||
| - name: "create {{ item.name }} vim state directory" | ||||
|   file: | ||||
|     dest: "/var/home/{{ item.name }}/.vim" | ||||
|     state: directory | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: "write {{ item.name }} vimrc configuration file" | ||||
|   template: | ||||
|     src: var/home/user/vimrc.j2 | ||||
|     dest: "/var/home/{{ item.name }}/.vimrc" | ||||
|     owner: "{{ item.name }}" | ||||
|     group: operator | ||||
|     mode: 0600 | ||||
							
								
								
									
										40
									
								
								common-debian/tasks/users/backup.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								common-debian/tasks/users/backup.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| --- | ||||
| - name: ensure backup user has /bin/sh shell | ||||
|   user: | ||||
|     name: backup | ||||
|     shell: /bin/sh | ||||
|     state: present | ||||
|  | ||||
| - name: create backup .ssh configuration directory | ||||
|   file: | ||||
|     dest: /var/backups/.ssh | ||||
|     state: directory | ||||
|     owner: backup | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: write backup ssh authorized_keys configuration file | ||||
|   template: | ||||
|     src: var/backups/ssh/authorized_keys.j2 | ||||
|     dest: /var/backups/.ssh/authorized_keys | ||||
|     owner: backup | ||||
|     group: operator | ||||
|     mode: 0640 | ||||
|  | ||||
| - name: install post-backup timestamp script | ||||
|   template: | ||||
|     src: var/backups/timestamp.sh.j2 | ||||
|     dest: /var/backups/timestamp.sh | ||||
|     mode: 0755 | ||||
|  | ||||
| - name: create backup shares file | ||||
|   command: touch /var/backups/shares | ||||
|   args: | ||||
|     creates: /var/backups/shares | ||||
|  | ||||
| - name: set ownership of backup shares file | ||||
|   file: | ||||
|     dest: /var/backups/shares | ||||
|     owner: backup | ||||
|     group: operator | ||||
|     mode: 0644 | ||||
							
								
								
									
										35
									
								
								common-debian/tasks/users/deploy.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								common-debian/tasks/users/deploy.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| --- | ||||
| - name: ensure deploy user exists and is configured properly | ||||
|   user: | ||||
|     name: deploy | ||||
|     uid: 200 | ||||
|     group: operator | ||||
|     shell: /bin/bash | ||||
|     home: /var/home/deploy | ||||
|     createhome: yes | ||||
|     move_home: yes | ||||
|     state: present | ||||
|  | ||||
| - name: set ownership of deploy home directory | ||||
|   file: | ||||
|     dest: /var/home/deploy | ||||
|     state: directory | ||||
|     owner: deploy | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: create deploy .ssh configuration directory | ||||
|   file: | ||||
|     dest: /var/home/deploy/.ssh | ||||
|     state: directory | ||||
|     owner: deploy | ||||
|     group: operator | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: write deploy ssh authorized_keys configuration file | ||||
|   template: | ||||
|     src: var/home/deploy/ssh/authorized_keys.j2 | ||||
|     dest: /var/home/deploy/.ssh/authorized_keys | ||||
|     owner: deploy | ||||
|     group: operator | ||||
|     mode: 0640 | ||||
							
								
								
									
										23
									
								
								common-debian/tasks/users/root.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								common-debian/tasks/users/root.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| --- | ||||
| - name: set root password | ||||
|   user: | ||||
|     name: root | ||||
|     password: "{{ root_password | password_hash('sha512', root_password) }}" # Use password as salt for idemptence | ||||
|     state: present | ||||
|  | ||||
| - name: remove any root known_hosts configuration file | ||||
|   file: | ||||
|     dest: /root/.ssh/known_hosts | ||||
|     state: absent | ||||
|  | ||||
| - name: create root vim state directory | ||||
|   file: | ||||
|     dest: /root/.vim | ||||
|     state: directory | ||||
|     mode: 0700 | ||||
|  | ||||
| - name: write admin user vimrc configuration file to root homedir | ||||
|   template: | ||||
|     src: var/home/user/vimrc.j2 | ||||
|     dest: /root/.vimrc | ||||
|     mode: 0600 | ||||
| @@ -0,0 +1,5 @@ | ||||
| #!/bin/bash | ||||
| # Ansible fact - dhcp_status | ||||
| # {{ ansible_managed }} | ||||
| DHCP_STATUS="$( grep -o 'dhcp' /etc/network/interfaces | uniq )" | ||||
| echo "\"${DHCP_STATUS}\"" | ||||
| @@ -0,0 +1,5 @@ | ||||
| #!/bin/bash | ||||
| # Ansible fact - host_group | ||||
| # {{ ansible_managed }} | ||||
| HOST_GROUP="$( hostname -s | sed 's/[0-9]*//g' )" | ||||
| echo "\"${HOST_GROUP}\"" | ||||
| @@ -0,0 +1,8 @@ | ||||
| #!/bin/bash | ||||
| # Ansible fact - host_id | ||||
| # {{ ansible_managed }} | ||||
| HOST_ID="$( hostname -s | grep -o '[0-9]\+' )" | ||||
| if [[ -z ${HOST_ID} ]]; then | ||||
| 	HOST_ID="0" | ||||
| fi | ||||
| echo "\"${HOST_ID}\"" | ||||
| @@ -0,0 +1,8 @@ | ||||
| #!/bin/bash | ||||
| # Ansible fact - moe_release | ||||
| # {{ ansible_managed }} | ||||
| DPKG_ARCHITECTURE="$( dpkg --print-architecture )" | ||||
| DEBIAN_CODENAME="$( grep 'VERSION_CODENAME=' /etc/os-release | sed 's/VERSION_CODENAME=//' )" | ||||
| DEBIAN_VERSION="$( grep 'VERSION_ID=' /etc/os-release | sed -E 's/VERSION_ID="(.*)"/\1/' )" | ||||
| MOE_VERSION="1.$(( ${DEBIAN_VERSION} - 11 ))" | ||||
| echo "{ \"dpkg_architecture\": \"${DPKG_ARCHITECTURE}\", \"moe_version\": \"${MOE_VERSION}\", \"debian_version\": \"${DEBIAN_VERSION}\", \"debian_codename\": \"${DEBIAN_CODENAME}\" }" | ||||
| @@ -0,0 +1,5 @@ | ||||
| # apt configuration: disable recommends | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| APT::Install-Recommends "0"; | ||||
| APT::Install-Suggests "0"; | ||||
| @@ -0,0 +1,5 @@ | ||||
| # apt configuration: enable apt-cacher-ng proxy | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Acquire::http::Proxy::debian.mirror.rafal.ca "http://{{ blsedomains_admindomain }}:3142"; | ||||
| Acquire::http::Proxy::security.debian.org "http://{{ blsedomains_admindomain }}:3142"; | ||||
| @@ -0,0 +1,30 @@ | ||||
| # apt configuration: unattended upgrades | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Unattended-Upgrade::Origins-Pattern { | ||||
|         "origin=Debian,codename=${distro_codename},label=Debian"; | ||||
|         "origin=Debian,codename=${distro_codename},label=Debian-Security"; | ||||
| }; | ||||
|  | ||||
| Unattended-Upgrade::Package-Blacklist { | ||||
|     # "libc6$"; | ||||
|     # "libc6-dev$"; | ||||
|     # "libc6-i686$"; | ||||
| }; | ||||
|  | ||||
| # General configurations | ||||
| Unattended-Upgrade::AutoFixInterruptedDpkg "true"; | ||||
| Unattended-Upgrade::MinimalSteps "true"; | ||||
| Unattended-Upgrade::InstallOnShutdown "false"; | ||||
| Unattended-Upgrade::Mail ""; | ||||
| Unattended-Upgrade::MailOnlyOnError "true"; | ||||
| Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; | ||||
| Unattended-Upgrade::Remove-New-Unused-Dependencies "true"; | ||||
| Unattended-Upgrade::Remove-Unused-Dependencies "true"; | ||||
| Unattended-Upgrade::SyslogEnable "true"; | ||||
| Unattended-Upgrade::SyslogFacility "daemon"; | ||||
| Unattended-Upgrade::Verbose "false"; | ||||
| Unattended-Upgrade::Debug "false"; | ||||
|  | ||||
| # Reboot configurations - do not reboot automatically | ||||
| Unattended-Upgrade::Automatic-Reboot "false"; | ||||
							
								
								
									
										11
									
								
								common-debian/templates/etc/apt/preferences.d/pins.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								common-debian/templates/etc/apt/preferences.d/pins.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| # apt configuration: pinning preferences | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Package: * | ||||
| Pin: release a={{ moe_release.debian_codename }} | ||||
| Pin-Priority: 999 | ||||
|  | ||||
| # Ensure backports are not installed by default | ||||
| Package: * | ||||
| Pin: release a={{ moe_release.debian_codename }}-backports | ||||
| Pin-Priority: -1 | ||||
							
								
								
									
										7
									
								
								common-debian/templates/etc/apt/sources.list.d/source.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								common-debian/templates/etc/apt/sources.list.d/source.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # {{ item.name }} sources.list entry | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| deb {% if item.gpg_url is defined and item.gpg_url -%}[signed-by=/etc/apt/trusted.gpg.d/{{ item.name }}.gpg] {% endif -%} {{ item.url }} {{ item.distribution }} {{ item.components|join(' ') }} | ||||
| {% if item.has_src %} | ||||
| deb-src {% if item.gpg_url is defined and item.gpg_url -%}[signed-by=/etc/apt/trusted.gpg.d/{{ item.name }}.gpg] {% endif -%} {{ item.url }} {{ item.distribution }} {{ item.components|join(' ') }} | ||||
| {% endif %} | ||||
							
								
								
									
										126
									
								
								common-debian/templates/etc/bash.bashrc.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										126
									
								
								common-debian/templates/etc/bash.bashrc.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| # System-wide .bashrc file for interactive bash(1) shells. | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # To enable the settings / commands in this file for login shells as well, | ||||
| # this file has to be sourced in /etc/profile. | ||||
|  | ||||
| # Fix the preceeding space stupidity | ||||
| export HISTCONTROL=ignorespace | ||||
|  | ||||
| # If not running interactively, don't do anything | ||||
| [ -z "$PS1" ] && return | ||||
|  | ||||
| # check the window size after each command and, if necessary, | ||||
| # update the values of LINES and COLUMNS. | ||||
| shopt -s checkwinsize | ||||
|  | ||||
| # set variable identifying the chroot you work in (used in the prompt below) | ||||
| if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then | ||||
|     debian_chroot=$(cat /etc/debian_chroot) | ||||
| fi | ||||
|  | ||||
| #------------------------------------------------------------------------------ | ||||
| # Returncode. | ||||
| #------------------------------------------------------------------------------ | ||||
| function returncode | ||||
| { | ||||
|   returncode=$? | ||||
|   if [ $returncode != 0 ]; then | ||||
|     echo "[$returncode]" | ||||
|   else | ||||
|     echo "" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| alias ll='ls -al' | ||||
|  | ||||
| use_color=false | ||||
|  | ||||
| # Set colorful PS1 only on colorful terminals. | ||||
| # dircolors --print-database uses its own built-in database | ||||
| # instead of using /etc/DIR_COLORS.  Try to use the external file | ||||
| # first to take advantage of user additions.  Use internal bash | ||||
| # globbing instead of external grep binary. | ||||
| safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM | ||||
| match_lhs="" | ||||
| [[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" | ||||
| [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)" | ||||
| [[ -z ${match_lhs}    ]] \ | ||||
|         && type -P dircolors >/dev/null \ | ||||
|         && match_lhs=$(dircolors --print-database) | ||||
| [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true | ||||
|  | ||||
| if ${use_color} ; then | ||||
|         # Enable colors for ls, etc.  Prefer ~/.dir_colors #64489 | ||||
|         if type -P dircolors >/dev/null ; then | ||||
|                 if [[ -f ~/.dir_colors ]] ; then | ||||
|                         eval $(dircolors -b ~/.dir_colors) | ||||
|                 elif [[ -f /etc/DIR_COLORS ]] ; then | ||||
|                         eval $(dircolors -b /etc/DIR_COLORS) | ||||
|                 else | ||||
|                         eval $(dircolors) | ||||
|                 fi | ||||
|         fi | ||||
|  | ||||
|         if [[ ${EUID} == 0 ]] ; then | ||||
|                 PS1='\[\033[0;31m\]$(returncode)\[\033[0;37m\]\[\033[0;35m\]${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\H\[\033[01;34m\] \w \$\[\033[00m\] ' | ||||
| 	elif [[ ${UID} == 200 ]] ; then | ||||
| 		PS1='\[\033[0;31m\]$(returncode)\[\033[0;37m\]\[\033[0;35m\]${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] ' | ||||
|         else | ||||
|                 PS1='\[\033[0;31m\]$(returncode)\[\033[0;37m\]\[\033[0;35m\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] ' | ||||
|         fi | ||||
|  | ||||
|         alias ls='ls --color=auto' | ||||
|         alias grep='grep --colour=auto' | ||||
|         alias fgrep='fgrep --colour=auto' | ||||
|         alias egrep='egrep --colour=auto' | ||||
|         alias ll='ls -lF' | ||||
|         alias la='ls -A' | ||||
|         alias l='ls -CF' | ||||
| else | ||||
|         if [[ ${EUID} == 0 ]] ; then | ||||
|                 # show root@ when we don't have colors | ||||
|                 PS1='\[$(returncode)\]\u@\H \w \$ ' | ||||
|         else | ||||
|                 PS1='\[$(returncode)\]\u@\H \w \$ ' | ||||
|         fi | ||||
| fi | ||||
|  | ||||
| # Try to keep environment pollution down, EPA loves us. | ||||
| unset use_color safe_term match_lhs | ||||
|  | ||||
| # Commented out, don't overwrite xterm -T "title" -n "icontitle" by default. | ||||
| # If this is an xterm set the title to user@host:dir | ||||
| #case "$TERM" in | ||||
| #xterm*|rxvt*) | ||||
| #    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"' | ||||
| #    ;; | ||||
| #*) | ||||
| #    ;; | ||||
| #esac | ||||
|  | ||||
| # enable bash completion in interactive shells | ||||
| if ! shopt -oq posix; then | ||||
|   if [ -f /usr/share/bash-completion/bash_completion ]; then | ||||
|     . /usr/share/bash-completion/bash_completion | ||||
|   elif [ -f /etc/bash_completion ]; then | ||||
|     . /etc/bash_completion | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| # if the command-not-found package is installed, use it | ||||
| if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then | ||||
| 	function command_not_found_handle { | ||||
| 	        # check because c-n-f could've been removed in the meantime | ||||
|                 if [ -x /usr/lib/command-not-found ]; then | ||||
| 		   /usr/bin/python /usr/lib/command-not-found -- "$1" | ||||
|                    return $? | ||||
|                 elif [ -x /usr/share/command-not-found/command-not-found ]; then | ||||
| 		   /usr/bin/python /usr/share/command-not-found/command-not-found -- "$1" | ||||
|                    return $? | ||||
| 		else | ||||
| 		   printf "%s: command not found\n" "$1" >&2 | ||||
| 		   return 127 | ||||
| 		fi | ||||
| 	} | ||||
| fi | ||||
							
								
								
									
										58
									
								
								common-debian/templates/etc/check_mk/logwatch.cfg.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								common-debian/templates/etc/check_mk/logwatch.cfg.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| # +------------------------------------------------------------------+ | ||||
| # |             ____ _               _        __  __ _  __           | | ||||
| # |            / ___| |__   ___  ___| | __   |  \/  | |/ /           | | ||||
| # |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            | | ||||
| # |           | |___| | | |  __/ (__|   <    | |  | | . \            | | ||||
| # |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           | | ||||
| # |                                                                  | | ||||
| # | Copyright Mathias Kettner 2014             mk@mathias-kettner.de | | ||||
| # +------------------------------------------------------------------+ | ||||
| # | ||||
| # This file is part of Check_MK. | ||||
| # The official homepage is at http://mathias-kettner.de/check_mk. | ||||
| # | ||||
| # check_mk is free software;  you can redistribute it and/or modify it | ||||
| # under the  terms of the  GNU General Public License  as published by | ||||
| # the Free Software Foundation in version 2.  check_mk is  distributed | ||||
| # in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with- | ||||
| # out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A | ||||
| # PARTICULAR PURPOSE. See the  GNU General Public License for more de- | ||||
| # tails. You should have  received  a copy of the  GNU  General Public | ||||
| # License along with GNU Make; see the file  COPYING.  If  not,  write | ||||
| # to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor, | ||||
| # Boston, MA 02110-1301 USA. | ||||
|  | ||||
| # logwatch.cfg | ||||
| # This file configures mk_logwatch. Define your logfiles | ||||
| # and patterns to be looked for here. | ||||
|  | ||||
| # Patterns are indented with one space are prefixed with: | ||||
| # C: Critical messages | ||||
| # W: Warning messages | ||||
| # I: ignore these lines (OK) | ||||
| # R: Rewrite the output previous match. You can use \1, \2 etc. for refer to groups (.*) of this match | ||||
| # The first match decided. Lines that do not match any pattern | ||||
| # are ignored | ||||
|  | ||||
| # Globbing patterns are allowed: | ||||
| # /sapdata/*/saptrans.log | ||||
| #  C ORA- | ||||
|  | ||||
| /var/log/kern.log | ||||
|  I registered panic notifier | ||||
|  C panic | ||||
|  C Oops | ||||
|  W generic protection rip | ||||
|  W .*Unrecovered read error - auto reallocate failed | ||||
|  | ||||
| /var/log/auth.log | ||||
|  I sshd.*Corrupted MAC on input | ||||
|  | ||||
| /var/log/system.log | ||||
|  C Fail event detected on md device | ||||
|  I mdadm.*: Rebuild.*event detected | ||||
|  W mdadm\[ | ||||
|  W ata.*hard resetting link | ||||
|  W ata.*soft reset failed (.*FIS failed) | ||||
|  W device-mapper: thin:.*reached low water mark | ||||
|  C device-mapper: thin:.*no free space | ||||
							
								
								
									
										6
									
								
								common-debian/templates/etc/cron.d/update-motd.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								common-debian/templates/etc/cron.d/update-motd.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| # cron file for motd | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | ||||
| @reboot        root  /usr/local/sbin/update-motd.sh &>/dev/null | ||||
| */5 *  * * *   root  /usr/local/sbin/update-motd.sh &>/dev/null | ||||
							
								
								
									
										12
									
								
								common-debian/templates/etc/crontab.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								common-debian/templates/etc/crontab.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| # /etc/crontab: system-wide crontab | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| SHELL=/bin/sh | ||||
| PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin | ||||
|  | ||||
| # m h dom mon dow user	command | ||||
| 00 *	* * *	root    cd / && run-parts --report /etc/cron.hourly | ||||
| 05 0	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) | ||||
| 15 0	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) | ||||
| 30 0	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) | ||||
| # | ||||
							
								
								
									
										7
									
								
								common-debian/templates/etc/default/locale.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								common-debian/templates/etc/default/locale.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # Default locale settings | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| LANGUAGE={{ locale }} | ||||
| LC_ALL={{ locale }} | ||||
| LANG={{ locale }} | ||||
| LC_TYPE={{ locale }} | ||||
							
								
								
									
										25
									
								
								common-debian/templates/etc/default/zramswap.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								common-debian/templates/etc/default/zramswap.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| # Default zramswap settings | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # Compression algorithm selection | ||||
| # speed: lz4 > zstd > lzo | ||||
| # compression: zstd > lzo > lz4 | ||||
| # This is not inclusive of all that is available in latest kernels | ||||
| # See /sys/block/zram0/comp_algorithm (when zram module is loaded) to see | ||||
| # what is currently set and available for your kernel[1] | ||||
| # [1]  https://github.com/torvalds/linux/blob/master/Documentation/blockdev/zram.txt#L86 | ||||
| ALGO=zstd | ||||
|  | ||||
| # Specifies the amount of RAM that should be used for zram | ||||
| # based on a percentage the total amount of available memory | ||||
| # This takes precedence and overrides SIZE below | ||||
| PERCENT=50 | ||||
|  | ||||
| # Specifies a static amount of RAM that should be used for | ||||
| # the ZRAM devices, this is in MiB | ||||
| #SIZE=256 | ||||
|  | ||||
| # Specifies the priority for the swap devices, see swapon(2) | ||||
| # for more details. Higher number = higher priority | ||||
| # This should probably be higher than hdd/ssd swaps. | ||||
| PRIORITY=1000 | ||||
| @@ -0,0 +1,6 @@ | ||||
| #!/bin/sh | ||||
| # Disasble resolv.conf generation from DHCP | ||||
| # {{ ansible_managed }} | ||||
| make_resolv_conf() { | ||||
|     : | ||||
| } | ||||
							
								
								
									
										15
									
								
								common-debian/templates/etc/fail2ban/action.d/route.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								common-debian/templates/etc/fail2ban/action.d/route.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| # fail2ban action - route | ||||
|  | ||||
| [Definition] | ||||
| actionban   = ip route add <blocktype> <ip> | ||||
| actionunban = ip route del <blocktype> <ip> | ||||
| actioncheck = | ||||
| actionstart = | ||||
| actionstop = | ||||
|  | ||||
| [Init] | ||||
|  | ||||
| # Option:  blocktype | ||||
| # Note:    Type can be blackhole, unreachable and prohibit. Unreachable and prohibit correspond to the ICMP reject messages. | ||||
| # Values:  STRING | ||||
| blocktype = blackhole | ||||
							
								
								
									
										51
									
								
								common-debian/templates/etc/fail2ban/filter.d/sshd.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								common-debian/templates/etc/fail2ban/filter.d/sshd.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| # Fail2Ban filter for openssh | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| [INCLUDES] | ||||
|  | ||||
| # Read common prefixes. If any customizations available -- read them from | ||||
| # common.local | ||||
| before = common.conf | ||||
|  | ||||
| [Definition] | ||||
|  | ||||
| _daemon = sshd | ||||
|  | ||||
| failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error|failed) for .* from <HOST>( via \S+)?\s*$ | ||||
|             ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$ | ||||
|             ^%(__prefix_line)sFailed \S+ for (?P<cond_inv>invalid user )?(?P<user>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)) from <HOST>(?: port \d+)?(?: ssh\d*)?(?(cond_user):|(?:(?:(?! from ).)*)$) | ||||
|             ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$ | ||||
|             ^%(__prefix_line)s[iI](?:llegal|nvalid) user .*? from <HOST>(?: port \d+)?\s*$ | ||||
|             ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s*$ | ||||
|             ^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s*$ | ||||
|             ^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s*$ | ||||
|             ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$ | ||||
|             ^%(__prefix_line)s(?:error: )?Received disconnect from <HOST>: 3: .*: Auth fail(?: \[preauth\])?$ | ||||
|             ^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s*$ | ||||
|             ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$ | ||||
|             ^(?P<__prefix>%(__prefix_line)s)User .+ not allowed because account is locked<SKIPLINES>(?P=__prefix)(?:error: )?Received disconnect from <HOST>: 11: .+ \[preauth\]$ | ||||
|             ^(?P<__prefix>%(__prefix_line)s)Disconnecting: Too many authentication failures for .+? \[preauth\]<SKIPLINES>(?P=__prefix)(?:error: )?Connection closed by <HOST> \[preauth\]$ | ||||
|             ^(?P<__prefix>%(__prefix_line)s)Connection from <HOST> port \d+(?: on \S+ port \d+)?<SKIPLINES>(?P=__prefix)Disconnecting: Too many authentication failures for .+? \[preauth\]$ | ||||
|             ^%(__prefix_line)s(error: )?maximum authentication attempts exceeded for .* from <HOST>(?: port \d*)?(?: ssh\d*)? \[preauth\]$ | ||||
|             ^%(__prefix_line)spam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=\S*\s*rhost=<HOST>\s.*$ | ||||
|             ^%(__prefix_line)sUnable to negotiate with <HOST> .*$ | ||||
|             ^%(__prefix_line)sConnection reset by authenticating user .* <HOST> port .* \[preauth\]$ | ||||
|  | ||||
| ignoreregex =  | ||||
|  | ||||
| [Init] | ||||
|  | ||||
| # "maxlines" is number of log lines to buffer for multi-line regex searches | ||||
| maxlines = 10 | ||||
|  | ||||
| journalmatch = _SYSTEMD_UNIT=sshd.service + _COMM=sshd | ||||
|  | ||||
| # DEV Notes: | ||||
| # | ||||
| #   "Failed \S+ for .*? from <HOST>..." failregex uses non-greedy catch-all because | ||||
| #   it is coming before use of <HOST> which is not hard-anchored at the end as well, | ||||
| #   and later catch-all's could contain user-provided input, which need to be greedily | ||||
| #   matched away first. | ||||
| # | ||||
| # Author: Cyril Jaquier, Yaroslav Halchenko, Petr Voralek, Daniel Black | ||||
|  | ||||
| @@ -0,0 +1,4 @@ | ||||
| [DEFAULT] | ||||
| maxretry    = 3 | ||||
| bantime     = 14400 | ||||
| ignoreip    = 127.0.0.0/8 10.0.0.0/8 198.55.48.48/28 24.53.125.139 | ||||
							
								
								
									
										30
									
								
								common-debian/templates/etc/fail2ban/jail.d/sshd.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								common-debian/templates/etc/fail2ban/jail.d/sshd.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| # Fail2Ban configuration file | ||||
| # | ||||
| # Author: Wolfgang Karall (based on sshd.conf from Cyril Jaquier) | ||||
| # | ||||
|  | ||||
| [INCLUDES] | ||||
|  | ||||
| # Read common prefixes. If any customizations available -- read them from | ||||
| # common.local | ||||
| before = common.conf | ||||
|  | ||||
|  | ||||
| [Definition] | ||||
|  | ||||
| _daemon = sshd | ||||
|  | ||||
| # Option:  failregex | ||||
| # Notes.:  regex to match the password failures messages in the logfile. The | ||||
| #          host must be matched by a group named "host". The tag "<HOST>" can | ||||
| #          be used for standard IP/hostname matching and is only an alias for | ||||
| #          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) | ||||
| # Values:  TEXT | ||||
| # | ||||
| failregex = ^%(__prefix_line)sUnable to negotiate with <HOST> .*$ | ||||
|  | ||||
| # Option:  ignoreregex | ||||
| # Notes.:  regex to ignore. If this regex matches, the line is ignored. | ||||
| # Values:  TEXT | ||||
| # | ||||
| ignoreregex = ^%(__prefix_line)sDid not receive identification string from .*$ | ||||
| @@ -0,0 +1,5 @@ | ||||
| [ssh] | ||||
| enabled     = true | ||||
| filter      = sshd | ||||
| action      = route | ||||
| logpath     = /var/log/auth.log | ||||
							
								
								
									
										14
									
								
								common-debian/templates/etc/hosts.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								common-debian/templates/etc/hosts.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # Local system hosts file | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| 127.0.0.1	localhost | ||||
| ::1		    ip6-localhost ip6-loopback | ||||
| ff02::1 	ip6-allmodes | ||||
| ff02::2		ip6-allrouters | ||||
|  | ||||
| {% if hosts_entries is defined %} | ||||
| {% for host in hosts_entries %} | ||||
| {{ host.ip }}{% for name in host.names %} {{ name }}{% endfor %} | ||||
|  | ||||
| {% endfor %} | ||||
| {% endif %} | ||||
							
								
								
									
										39
									
								
								common-debian/templates/etc/htoprc.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								common-debian/templates/etc/htoprc.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| # htop configuration file (Debian) | ||||
| # {{ ansible_managed }} | ||||
| fields=0 48 17 18 38 39 40 2 46 47 49 1 | ||||
| sort_key=46 | ||||
| sort_direction=0 | ||||
| tree_sort_key=0 | ||||
| tree_sort_direction=1 | ||||
| hide_kernel_threads=0 | ||||
| hide_userland_threads=0 | ||||
| shadow_other_users=0 | ||||
| show_thread_names=1 | ||||
| show_program_path=1 | ||||
| highlight_base_name=1 | ||||
| highlight_megabytes=1 | ||||
| highlight_threads=1 | ||||
| highlight_changes=0 | ||||
| highlight_changes_delay_secs=5 | ||||
| find_comm_in_cmdline=1 | ||||
| strip_exe_from_cmdline=1 | ||||
| show_merged_command=0 | ||||
| tree_view=0 | ||||
| tree_view_always_by_pid=0 | ||||
| header_margin=1 | ||||
| detailed_cpu_time=1 | ||||
| cpu_count_from_one=1 | ||||
| show_cpu_usage=1 | ||||
| show_cpu_frequency=0 | ||||
| show_cpu_temperature=0 | ||||
| degree_fahrenheit=0 | ||||
| update_process_names=1 | ||||
| account_guest_in_cpu_meter=1 | ||||
| color_scheme=0 | ||||
| enable_mouse=1 | ||||
| delay=15 | ||||
| left_meters=Hostname Clock Uptime Blank LeftCPUs2 Blank CPU Blank | ||||
| left_meter_modes=2 2 2 2 1 2 1 2 | ||||
| right_meters=LoadAverage Tasks Systemd Blank RightCPUs2 Blank Memory Swap | ||||
| right_meter_modes=2 2 2 2 1 2 1 1 | ||||
| hide_function_bar=0 | ||||
							
								
								
									
										4
									
								
								common-debian/templates/etc/locale.gen.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								common-debian/templates/etc/locale.gen.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| # Locales configuration file | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| en_CA.UTF-8 UTF-8 | ||||
							
								
								
									
										10
									
								
								common-debian/templates/etc/logrotate.d/backup-rsync.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								common-debian/templates/etc/logrotate.d/backup-rsync.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| # Logrotate configuration for backup rsync log | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| /var/backups/rsync.log | ||||
| { | ||||
| 	rotate 1 | ||||
| 	weekly | ||||
| 	missingok | ||||
| 	notifempty | ||||
| } | ||||
							
								
								
									
										22
									
								
								common-debian/templates/etc/logrotate.d/rsyslog.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								common-debian/templates/etc/logrotate.d/rsyslog.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| # Logrotate configuration for standard log files | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| /var/log/kern.log | ||||
| /var/log/daemon.log | ||||
| /var/log/auth.log | ||||
| /var/log/cron.log | ||||
| /var/log/mail.log | ||||
| /var/log/boot.log | ||||
| /var/log/system.log | ||||
| { | ||||
| 	rotate {{ logrotate_keepcount }} | ||||
| 	{{ logrotate_interval }} | ||||
| 	missingok | ||||
| 	notifempty | ||||
| 	compress | ||||
| 	delaycompress | ||||
| 	sharedscripts | ||||
| 	postrotate | ||||
|         /usr/lib/rsyslog/rsyslog-rotate | ||||
| 	endscript | ||||
| } | ||||
							
								
								
									
										25
									
								
								common-debian/templates/etc/nftables.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								common-debian/templates/etc/nftables.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #!/usr/sbin/nft -f | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| flush ruleset | ||||
|  | ||||
| table inet filter { | ||||
|         chain input { | ||||
|                 type filter hook input priority 0; | ||||
| {% for rule in nftables_rules if rule.chain == "input" %} | ||||
|                 {{ rule.rule }}; | ||||
| {% endfor %} | ||||
|         } | ||||
|         chain forward { | ||||
|                 type filter hook forward priority 0; | ||||
| {% for rule in nftables_rules if rule.chain == "forward" %} | ||||
|                 {{ rule.rule }}; | ||||
| {% endfor %} | ||||
|         } | ||||
|         chain output { | ||||
|                 type filter hook output priority 0; | ||||
| {% for rule in nftables_rules if rule.chain == "output" %} | ||||
|                 {{ rule.rule }}; | ||||
| {% endfor %} | ||||
|         } | ||||
| } | ||||
							
								
								
									
										38
									
								
								common-debian/templates/etc/ntp.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								common-debian/templates/etc/ntp.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| # Main NTP configuration | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| driftfile /var/lib/ntp/ntp.drift | ||||
|  | ||||
| statistics loopstats peerstats clockstats | ||||
|  | ||||
| filegen loopstats file loopstats type day enable | ||||
| filegen peerstats file peerstats type day enable | ||||
| filegen clockstats file clockstats type day enable | ||||
|  | ||||
| {% if 'remote' in group_names %} | ||||
| server time.nrc.ca | ||||
| server time.chu.nrc.ca | ||||
|  | ||||
| restrict -4 default kod notrap nomodify nopeer | ||||
| restrict -6 default kod notrap nomodify nopeer | ||||
|  | ||||
| {% elif 'role_ceph' in group_names %} | ||||
| server 10.60.0.251 iburst | ||||
| server 10.60.0.252 iburst | ||||
| server ceph1 iburst | ||||
| server ceph2 iburst | ||||
| server ceph3 iburst | ||||
|  | ||||
| restrict -4 default notrap nomodify | ||||
| restrict -6 default notrap nomodify | ||||
|  | ||||
| {% else %} | ||||
| server 10.100.0.251 burst | ||||
| server 10.100.0.252 burst | ||||
|  | ||||
| restrict -4 default notrap nomodify | ||||
| restrict -6 default notrap nomodify | ||||
|  | ||||
| {% endif %} | ||||
| restrict 127.0.0.1 | ||||
| restrict ::1 | ||||
							
								
								
									
										54
									
								
								common-debian/templates/etc/pam.d/sshd.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								common-debian/templates/etc/pam.d/sshd.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| # PAM configuration for the Secure Shell service | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # Standard Un*x authentication. | ||||
| @include common-auth | ||||
|  | ||||
| # Disallow non-root logins when /etc/nologin exists. | ||||
| account    required     pam_nologin.so | ||||
|  | ||||
| # Uncomment and edit /etc/security/access.conf if you need to set complex | ||||
| # access limits that are hard to express in sshd_config. | ||||
| # account  required     pam_access.so | ||||
|  | ||||
| # Standard Un*x authorization. | ||||
| @include common-account | ||||
|  | ||||
| # SELinux needs to be the first session rule.  This ensures that any | ||||
| # lingering context has been cleared.  Without this it is possible that a | ||||
| # module could execute code in the wrong domain. | ||||
| session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close | ||||
|  | ||||
| # Set the loginuid process attribute. | ||||
| session    required     pam_loginuid.so | ||||
|  | ||||
| # Create a new session keyring. | ||||
| session    optional     pam_keyinit.so force revoke | ||||
|  | ||||
| # Standard Un*x session setup and teardown. | ||||
| @include common-session | ||||
|  | ||||
| # Print the message of the day upon successful login. | ||||
| session    optional     pam_motd.so  motd=/run/blse-motd.dynamic | ||||
| session    optional     pam_motd.so noupdate | ||||
|  | ||||
| # Print the status of the user's mailbox upon successful login. | ||||
| #session    optional     pam_mail.so standard noenv # [1] | ||||
|  | ||||
| # Set up user limits from /etc/security/limits.conf. | ||||
| session    required     pam_limits.so | ||||
|  | ||||
| # Read environment variables from /etc/environment and | ||||
| # /etc/security/pam_env.conf. | ||||
| session    required     pam_env.so # [1] | ||||
| # In Debian 4.0 (etch), locale-related environment variables were moved to | ||||
| # /etc/default/locale, so read that as well. | ||||
| session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale | ||||
|  | ||||
| # SELinux needs to intervene at login time to ensure that the process starts | ||||
| # in the proper default security context.  Only sessions which are intended | ||||
| # to run in the user's context should be run after this. | ||||
| session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open | ||||
|  | ||||
| # Standard Un*x password updating. | ||||
| @include common-password | ||||
							
								
								
									
										22
									
								
								common-debian/templates/etc/postfix/main.cf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								common-debian/templates/etc/postfix/main.cf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| # Postfix main configuration for non-MTA hosts | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) | ||||
| biff = no | ||||
| append_dot_mydomain = no | ||||
| readme_directory = no | ||||
| smtpd_use_tls=no | ||||
|  | ||||
| alias_maps = hash:/etc/postfix/aliases | ||||
| alias_database = hash:/etc/postfix/aliases | ||||
| mydestination =  | ||||
| relayhost = {{ postfix_relay }} | ||||
| mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 | ||||
| mailbox_size_limit = 0 | ||||
| recipient_delimiter = + | ||||
| myorigin = $mydomain | ||||
| mydomain = {{ postfix_domain }} | ||||
| #inet_interfaces = 127.0.0.1,::1 | ||||
| inet_interfaces = 127.0.0.1 | ||||
| #inet_protocols = ipv4,ipv6 | ||||
| inet_protocols = ipv4 | ||||
							
								
								
									
										7
									
								
								common-debian/templates/etc/profile.d/w.sh.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								common-debian/templates/etc/profile.d/w.sh.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # Message of the day script to print active users | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| export PROCPS_FROMLEN=36 PROCPS_USERLEN=12 | ||||
| w | ||||
							
								
								
									
										19
									
								
								common-debian/templates/etc/resolv.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								common-debian/templates/etc/resolv.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| # DNS resolver configuration | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| options timeout:1 attempts:3 rotate | ||||
| {% if 'remote' in group_names %} | ||||
| search {{ blsedomains_admindomain }}. {{ blsedomains_rootdomain }}. | ||||
| nameserver 8.8.8.8 | ||||
| nameserver 8.8.4.4 | ||||
| {% else %} | ||||
| {% if 'role_env' in group_names %} | ||||
| search {{ blsedomains_mandomain }}. {{ blsedomains_hostdomain }}. {{ blsedomains_rootdomain }}. | ||||
| {% elif 'physical' in group_names %} | ||||
| search {{ blsedomains_mandomain }}. {{ blsedomains_hostdomain }}. {{ blsedomains_admindomain }}. {{ blsedomains_rootdomain }}. | ||||
| {% else %} | ||||
| search {{ blsedomains_hostdomain }}. {{ blsedomains_admindomain }}. {{ blsedomains_rootdomain }}. | ||||
| {% endif %} | ||||
| nameserver {{ blsecluster_rns1v4 }} | ||||
| nameserver {{ blsecluster_rns2v4 }} | ||||
| {% endif %} | ||||
							
								
								
									
										73
									
								
								common-debian/templates/etc/rsyslog.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								common-debian/templates/etc/rsyslog.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| # Main rsyslog configuration | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| ####		 #### | ||||
| #### MODULES #### | ||||
| ####		 #### | ||||
|  | ||||
| module(load="imuxsock") # provides support for local system logging (e.g. via logger command) | ||||
| module(load="imklog")   # provides kernel logging support (previously done by rklogd) | ||||
|  | ||||
| {% if 'role_log' in group_names %} | ||||
| module(load="imtcp" MaxSessions="1024") | ||||
| {% else %} | ||||
| $ModLoad imudp | ||||
| $UDPServerAddress ::1 | ||||
| $UDPServerRun 514 | ||||
| {% endif %} | ||||
|  | ||||
| ####				   #### | ||||
| #### GLOBAL DIRECTIVES #### | ||||
| ####				   #### | ||||
|  | ||||
| $PreserveFQDN on | ||||
| $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat | ||||
|  | ||||
| ####	   #### | ||||
|  | ||||
| $FileOwner root | ||||
| $FileGroup adm | ||||
| $FileCreateMode 0640 | ||||
| $DirCreateMode 0755 | ||||
| $Umask 0022 | ||||
|  | ||||
| $WorkDirectory /var/spool/rsyslog | ||||
| #### RULES #### | ||||
| ####	   #### | ||||
|  | ||||
| ruleset(name="local") { | ||||
| 	kern.*								/var/log/kern.log | ||||
| 	auth,authpriv.*	 					/var/log/auth.log | ||||
| 	{% if not 'rpi' in group_names %} | ||||
| 	cron.*								/var/log/cron.log | ||||
| 	daemon,user.*						/var/log/daemon.log | ||||
| 	mail.*								/var/log/mail.log | ||||
| 	local5.*							/var/log/nginx.log | ||||
| 	local6.*							/var/log/haproxy.log | ||||
| 	local7.*							/var/log/boot.log | ||||
| 	*.info;kern,daemon,user,auth,authpriv,cron,mail,local6.none,local7.none	/var/log/system.log | ||||
| 	{% endif %} | ||||
| 	{% if 'remote' in group_names %} | ||||
| 	# Send everything to central logserver (rsyslog) | ||||
| 	*.*									@@log.{{ blsedomains_admindomain }}:514 | ||||
| 	{% else %} | ||||
| 	# Send everything to central logserver (rsyslog) | ||||
| 	*.*									@@log.{{ blsedomains_hostdomain }}:514 | ||||
| 	{% endif %} | ||||
| } | ||||
| $DefaultRuleset local | ||||
| {% if 'role_log' in group_names %} | ||||
|  | ||||
| ruleset(name="remote") { | ||||
| 	kern.*								/srv/log/kern.log | ||||
| 	daemon,user.*						/srv/log/daemon.log | ||||
| 	auth,authpriv.*	 					/srv/log/auth.log | ||||
| 	cron.*								/srv/log/cron.log | ||||
| 	mail.*								/srv/log/mail.log | ||||
| 	local5.*							/srv/log/nginx.log | ||||
| 	local6.*							/srv/log/haproxy.log | ||||
| 	local7.*							/srv/log/boot.log | ||||
| 	*.info;kern,daemon,user,auth,authpriv,cron,mail,local6.none,local7.none	/srv/log/system.log | ||||
| } | ||||
| input(type="imtcp" port="514" ruleset="remote") | ||||
| {% endif %} | ||||
							
								
								
									
										8
									
								
								common-debian/templates/etc/ssh/shosts.equiv.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								common-debian/templates/etc/ssh/shosts.equiv.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # SSH remote allowed hosts | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% if hostbased_auth is defined and hostbased_auth %} | ||||
| {% for entry in hostbased_auth %} | ||||
| {{ entry }} | ||||
| {% endfor %} | ||||
| {% endif %} | ||||
							
								
								
									
										44
									
								
								common-debian/templates/etc/ssh/ssh_config.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								common-debian/templates/etc/ssh/ssh_config.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| # Default SSH client configuration | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Host * | ||||
| #   ForwardAgent no | ||||
| #   ForwardX11 no | ||||
| #   ForwardX11Trusted yes | ||||
| #   RhostsRSAAuthentication no | ||||
| #   RSAAuthentication yes | ||||
| #   PasswordAuthentication yes | ||||
| #   EnableSSHKeysign yes	 | ||||
| #   HostbasedAuthentication yes | ||||
| #   GSSAPIAuthentication no | ||||
| #   GSSAPIDelegateCredentials no | ||||
| #   GSSAPIKeyExchange no | ||||
| #   GSSAPITrustDNS no | ||||
| #   BatchMode no | ||||
| #   CheckHostIP yes | ||||
| #   AddressFamily any | ||||
| #   ConnectTimeout 0 | ||||
| #   StrictHostKeyChecking ask | ||||
| #   IdentityFile ~/.ssh/identity | ||||
| #   IdentityFile ~/.ssh/id_rsa | ||||
| #   IdentityFile ~/.ssh/id_dsa | ||||
| #   Port 22 | ||||
| #   Protocol 2,1 | ||||
| #   Cipher 3des | ||||
| #   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc | ||||
| #   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160 | ||||
| #   EscapeChar ~ | ||||
| #   Tunnel no | ||||
| #   TunnelDevice any:any | ||||
| #   PermitLocalCommand no | ||||
| #   VisualHostKey no | ||||
| #   ProxyCommand ssh -q -W %h:%p gateway.example.com | ||||
| #   PreferredAuthentications hostbased,pubkey | ||||
|     SendEnv LANG LC_* | ||||
|     HashKnownHosts no | ||||
|     GSSAPIAuthentication yes | ||||
|     GSSAPIDelegateCredentials no | ||||
|     PubkeyAuthentication yes | ||||
|     HostbasedAuthentication yes | ||||
|     EnableSSHKeysign yes | ||||
|     CheckHostIP no | ||||
							
								
								
									
										8
									
								
								common-debian/templates/etc/ssh/ssh_known_hosts.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								common-debian/templates/etc/ssh/ssh_known_hosts.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # SSH remote allowed hosts | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% if hostbased_auth is defined and hostbased_auth %} | ||||
| {% for entry in hostbased_auth %} | ||||
| {{ hostvars[entry]['ansible_hostname'] }},{{ hostvars[entry]['ansible_fqdn'] }},{{ hostvars[entry]['inventory_hostname'] }} ssh-ed25519 {{ hostvars[entry]['ansible_ssh_host_key_ed25519_public'] }} | ||||
| {% endfor %} | ||||
| {% endif %} | ||||
							
								
								
									
										40
									
								
								common-debian/templates/etc/ssh/sshd_config.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								common-debian/templates/etc/ssh/sshd_config.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # Main SSH daemon configuraton | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Port 22 | ||||
| ListenAddress :: | ||||
| ListenAddress 0.0.0.0 | ||||
| Protocol 2 | ||||
| HostKey /etc/ssh/ssh_host_ed25519_key | ||||
| HostKey /etc/ssh/ssh_host_rsa_key | ||||
| SyslogFacility AUTH | ||||
| LogLevel INFO | ||||
| LoginGraceTime 30 | ||||
| UsePAM yes | ||||
| StrictModes yes | ||||
| X11Forwarding no | ||||
| PrintMotd no | ||||
| PrintLastLog yes | ||||
| TCPKeepAlive yes | ||||
| AcceptEnv LANG LC_* | ||||
|  | ||||
| KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1 | ||||
| Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr | ||||
| MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com,hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96 | ||||
|  | ||||
| PubkeyAuthentication yes | ||||
| PermitEmptyPasswords no | ||||
| ChallengeResponseAuthentication no | ||||
| PasswordAuthentication no | ||||
| {% if 'role_hv' in group_names %} | ||||
| HostbasedAuthentication yes | ||||
| HostbasedUsesNameFromPacketOnly yes | ||||
| IgnoreRhosts no | ||||
| PermitRootLogin yes | ||||
| {% else %} | ||||
| HostbasedAuthentication no | ||||
| IgnoreRhosts yes | ||||
| PermitRootLogin no | ||||
| {% endif %} | ||||
|  | ||||
| Subsystem sftp /usr/lib/openssh/sftp-server -f AUTH -l INFO | ||||
							
								
								
									
										19
									
								
								common-debian/templates/etc/sudoers.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								common-debian/templates/etc/sudoers.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| # sudoers configuraton; per-host declarations go in /etc/sudoers.d | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| Defaults	env_reset | ||||
| Defaults	mail_badpass | ||||
| Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | ||||
|  | ||||
| Cmnd_Alias BACKUPS = /usr/bin/rsync, /var/backups/timestamp.sh | ||||
|  | ||||
| root	ALL=(ALL:ALL) NOPASSWD: ALL | ||||
| backup	ALL=(root) NOPASSWD: BACKUPS | ||||
| deploy	ALL=(ALL:ALL) NOPASSWD: /bin/sh | ||||
| %sudo	ALL=(ALL:ALL) NOPASSWD: ALL | ||||
|  | ||||
| {% if ansible_local.moe_release is defined and ansible_local.moe_release.debian_version|int >= 11 %} | ||||
| @includedir /etc/sudoers.d | ||||
| {% else %} | ||||
| #includedir /etc/sudoers.d | ||||
| {% endif %} | ||||
							
								
								
									
										55
									
								
								common-debian/templates/etc/sysctl.d/moe.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								common-debian/templates/etc/sysctl.d/moe.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| # General sysctl parameters for MOE | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% if 'virtual' in group_names %} | ||||
| # Turn off swap entirely | ||||
| vm.swappiness = 100 | ||||
| {% else %} | ||||
| # Lower swappiness | ||||
| vm.swappiness = 80 | ||||
| {% endif %} | ||||
|  | ||||
| # Increase the cache pressure | ||||
| vm.vfs_cache_pressure = 200 | ||||
|  | ||||
| # enable Spoof protection (reverse-path filter) | ||||
| # Turn on Source Address Verification in all interfaces to | ||||
| # prevent some spoofing attacks | ||||
| net.ipv4.conf.default.rp_filter = 1 | ||||
| net.ipv4.conf.all.rp_filter = 1 | ||||
|  | ||||
| # Ignore ICMP broadcasts | ||||
| net.ipv4.icmp_echo_ignore_broadcasts = 1 | ||||
|  | ||||
| # Ignore bogus ICMP errors | ||||
| net.ipv4.icmp_ignore_bogus_error_responses = 1 | ||||
|  | ||||
| # Do not accept ICMP redirects (prevent MITM attacks) | ||||
| net.ipv4.conf.all.accept_redirects = 0 | ||||
| {% if not 'rpi' in group_names %} | ||||
| net.ipv6.conf.all.accept_redirects = 0 | ||||
| {% endif %} | ||||
|  | ||||
| # Do not send ICMP redirects (we are not a router) | ||||
| net.ipv4.conf.all.send_redirects = 0 | ||||
|  | ||||
| # Do not accept IP source route packets (we are not a router) | ||||
| net.ipv4.conf.all.accept_source_route = 0 | ||||
| {% if not 'rpi' in group_names %} | ||||
| net.ipv6.conf.all.accept_source_route = 0 | ||||
| {% endif %} | ||||
|  | ||||
| # Don't log Martian Packets | ||||
| net.ipv4.conf.all.log_martians = 0 | ||||
|  | ||||
| # Explicit Congestion Notification (ECN) | ||||
| net.ipv4.tcp_ecn = 1 | ||||
|  | ||||
| # number of seconds the kernel waits before rebooting on a panic | ||||
| kernel.panic = 60 | ||||
|  | ||||
| # Panic on an OOPS | ||||
| kernel.panic_on_oops = 1 | ||||
|  | ||||
| # Restrict dmesg | ||||
| kernel.dmesg_restrict = 1 | ||||
							
								
								
									
										7
									
								
								common-debian/templates/etc/systemd/journald.conf.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								common-debian/templates/etc/systemd/journald.conf.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # Journald configuration | ||||
| # {{ ansible_managed }} | ||||
| [Journal] | ||||
| Storage=persistent | ||||
| ForwardToSyslog=yes | ||||
| SystemMaxFiles=8 | ||||
| RuntimeMaxFiles=8 | ||||
							
								
								
									
										18
									
								
								common-debian/templates/usr/local/sbin/dpkg-cleanup.sh.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								common-debian/templates/usr/local/sbin/dpkg-cleanup.sh.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # dpkg-cleanup.sh - Remove obsolete packages and config files | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # Phase 1 - purge `rc` packages | ||||
| PACKAGE_LIST=( $( dpkg --list | awk '/^rc/{ print $2 } /^ri/{ print $2 }' ) ) | ||||
| apt purge -y ${PACKAGE_LIST[@]} | ||||
|  | ||||
| # Phase 2 - autoremove packages | ||||
| apt autoremove --purge -y | ||||
|  | ||||
| # Phase 3 - clean archives | ||||
| apt clean | ||||
|  | ||||
| # Phase 4 - find and remove obsolete config files | ||||
| OLD_FILES_LIST=( $( find /etc -type f -a \( -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.update-*' \) 2>/dev/null ) ) | ||||
| rm -f ${OLD_FILES_LIST[@]} | ||||
							
								
								
									
										55
									
								
								common-debian/templates/usr/local/sbin/kernel-cleanup.sh.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										55
									
								
								common-debian/templates/usr/local/sbin/kernel-cleanup.sh.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| #!/bin/bash -x | ||||
|  | ||||
| # kernel-cleanup.sh - Remove obsolete packages and config files | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # Determine the active running kernel | ||||
| RUNNING_KERNEL="$( uname -v | awk '{ print $4 }' )" | ||||
|  | ||||
| # Determine the list of installed kernels (latest is always last) | ||||
| INSTALLED_KERNELS=( $( dpkg -l | grep 'linux-image-[0-9]' | awk '{ print $3 }' | sort -n ) ) | ||||
| echo ${INSTALLED_KERNELS} | ||||
| NUM_INSTALLED=${{ '{#' }}INSTALLED_KERNELS[@]} | ||||
|  | ||||
| if [[ ${NUM_INSTALLED} -le 1 ]]; then | ||||
|     echo "A single kernel is installed, aborting cleanly." | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| LATEST_KERNEL="${INSTALLED_KERNELS[-1]}" | ||||
| if [[ ${LATEST_KERNEL} == ${RUNNING_KERNEL} ]]; then | ||||
|     force="" | ||||
| else | ||||
|     force="--allow-remove-essential" | ||||
| fi | ||||
|  | ||||
| # Remove the latest kernel from the array | ||||
| NUM_REMOVABLE=$(( ${NUM_INSTALLED} - 1 )) | ||||
| REMOVABLE_KERNELS=( ${INSTALLED_KERNELS[@]:0:${NUM_REMOVABLE}} ) | ||||
|  | ||||
| PURGE_PACKAGES=() | ||||
| for KERNEL in ${REMOVABLE_KERNELS[@]}; do | ||||
|     PURGE_PACKAGES+=( $( dpkg -l | grep ${KERNEL} | grep -v 'linux-image-amd64\|linux-headers-amd64' | awk '{ print $2 }' ) ) | ||||
| done | ||||
|  | ||||
| # Override the "linux-check-removal" script | ||||
| mv /usr/bin/linux-check-removal /usr/bin/linux-check-removal.orig | ||||
| echo -e '#!/bin/sh\necho "Overriding default linux-check-removal script!"\nexit 0' > /usr/bin/linux-check-removal | ||||
| chmod +x /usr/bin/linux-check-removal | ||||
|  | ||||
| # Remove the packages | ||||
| echo "Removing: ${PURGE_PACKAGES[@]}" | ||||
| apt-get purge --yes ${force} ${PURGE_PACKAGES[@]} | ||||
|  | ||||
| # Restore the "linux-check-removal" script | ||||
| mv /usr/bin/linux-check-removal.orig /usr/bin/linux-check-removal | ||||
|  | ||||
| # Make sure there is still a valid kernel installed (just in case something broke) | ||||
| if [[ $( dpkg -l | grep 'linux-image-[0-9]' | wc -l ) -lt 1 ]]; then | ||||
|     echo "WARNING: NO KERNEL IS INSTALLED. THROWING ERROR AND ABORTING." | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| update-grub | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										75
									
								
								common-debian/templates/usr/local/sbin/update-motd.sh.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								common-debian/templates/usr/local/sbin/update-motd.sh.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # Update dynamic MOTD file | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| set -o errexit | ||||
|  | ||||
| TMPFILE=$(mktemp) | ||||
| TGTFILE=/run/blse-motd.dynamic | ||||
| {% if ansible_distribution_release == "jessie" %} | ||||
| BLSEVER="BLSE 2.x (Debian Jessie)" | ||||
| {% elif ansible_distribution_release == "stretch" %} | ||||
| BLSEVER="BLSE 2.1 (Debian Stretch)" | ||||
| {% elif ansible_distribution_release == "buster" %} | ||||
| BLSEVER="BLSE 2.2 (Debian Buster)" | ||||
| {% elif ansible_distribution_release == "bullseye" %} | ||||
| BLSEVER="BLSE 2.3 (Debian Bullseye)" | ||||
| {% elif ansible_distribution_release == "bookworm" %} | ||||
| BLSEVER="BLSE 2.4 (Debian Bookworm)" | ||||
| {% endif %} | ||||
|  | ||||
| echo >> $TMPFILE | ||||
| echo "\033[01;34mBoniface Labs Server Environment \033[01;36m${BLSEVER}\033[0m" >> $TMPFILE | ||||
| echo -n "> \033[01;32m$(hostname)\033[0m" >> $TMPFILE | ||||
| if test -f /etc/hostdesc; then | ||||
|     echo " - $( cat /etc/hostdesc )" >> $TMPFILE | ||||
| else | ||||
|     echo >> $TMPFILE | ||||
| fi | ||||
| echo -n "> " >> $TMPFILE | ||||
|  | ||||
| # Get virtual machine info from vhostmd if it exists | ||||
| VENDOR="$(/usr/sbin/dmidecode | grep Vendor | tr -d ' \t\n\r')" | ||||
| if [ "$VENDOR" = "Vendor:Bochs" ] || [ "$VENDOR" = "Vendor:SeaBIOS" ]; then | ||||
|     hvhostname=$(/usr/sbin/vm-dump-metrics | grep -A1 HostName | awk -F'>' '{ if ($1 == "    <value") print $2 }') | ||||
|     hvvirtproductinfo=$(/usr/sbin/vm-dump-metrics | grep -A1 VirtProductInfo | awk -F'>' '{ if ($1 == "    <value") print $2 }') | ||||
|     if [ "$hvhostname" ]; then  | ||||
|         echo "\033[1;37mKVM virtual machine\033[0m on node \033[1;31m${hvhostname}\033[0m (${hvvirtproductinfo})" >> $TMPFILE | ||||
|     else | ||||
|         echo "\033[1;37mRemote KVM virtual machine\033[0m" >> $TMPFILE | ||||
|     fi | ||||
| elif [ "$VENDOR" = 'Vendor:DigitalOcean' ]; then | ||||
|     echo "\033[1;37mRemote KVM virtual machine\033[0m on \033[1;31mDigitalOcean\033[0m" >> $TMPFILE | ||||
| else | ||||
|     # Are we a KVM hypervsor | ||||
|     if [ "$(hostname | grep dcrhv)" ]; then | ||||
|         echo "\033[1;37mRouter Hypervisor\033[0m on \033[1;31m$(/usr/sbin/dmidecode | grep -A1 'Base Board Information' | tail -1 | awk -F':' '{print $2}' | tr -s ' ' | sed 's/^ //' )\033[0m hardware" >> $TMPFILE | ||||
|     # Are we a Ceph node? | ||||
|     elif [ "$(hostname | grep ceph)" ]; then | ||||
|         echo "\033[1;37mCeph Storage Node\033[0m on \033[1;31m$(/usr/sbin/dmidecode | grep -A1 'Base Board Information' | tail -1 | awk -F':' '{print $2}' | tr -s ' ' | sed 's/^ //' )\033[0m hardware" >> $TMPFILE | ||||
|     # Are we a GPU node? | ||||
|     elif [ "$(hostname | grep gpu)" ]; then | ||||
|         echo "\033[1;37mGPU Processing Host\033[0m on \033[1;31m$(/usr/sbin/dmidecode | grep -A1 'Base Board Information' | tail -1 | awk -F':' '{print $2}' | tr -s ' ' | sed 's/^ //' )\033[0m hardware" >> $TMPFILE | ||||
|     # Are we Base? | ||||
|     elif [ "$(hostname | grep base)" ]; then | ||||
|         echo "\033[1;37mHome Base\033[0m on \033[1;31m$(/usr/sbin/dmidecode | grep -A1 'Base Board Information' | tail -1 | awk -F':' '{print $2}' | tr -s ' ' | sed 's/^ //' )\033[0m hardware" >> $TMPFILE | ||||
|     # Are we Env? | ||||
|     elif [ "$(hostname | grep env)" ]; then | ||||
|         echo "\033[1;37mEnvironmental Monitor\033[0m on \033[1;31mRaspberry Pi\033[0m hardware" >> $TMPFILE | ||||
|     # Are we Kal? | ||||
|     elif [ "$(hostname | grep kal)" ]; then | ||||
|         echo "\033[1;37mVoice Control Node\033[0m on \033[1;31mRaspberry Pi\033[0m hardware" >> $TMPFILE | ||||
|     # Are we IR? | ||||
|     elif [ "$(hostname | grep ir)" ]; then | ||||
|         echo "\033[1;37mInfared Control Node\033[0m on \033[1;31mRaspberry Pi\033[0m hardware" >> $TMPFILE | ||||
|     # Otherwise, we're generic | ||||
|     else | ||||
|         echo "\033[1;37mGeneric server\033[0m on \033[1;31m$(/usr/sbin/dmidecode | grep -A1 'Base Board Information' | tail -1 | awk -F':' '{print $2}' | tr -s ' ' | sed 's/^ //' )\033[0m hardware" >> $TMPFILE | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| echo "> $(/bin/uname -srvmo)" >> $TMPFILE | ||||
|  | ||||
| mv $TMPFILE $TGTFILE || rm $TMPFILE | ||||
| chmod 644 $TGTFILE | ||||
| @@ -0,0 +1,6 @@ | ||||
| # backup user authorized_keys | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% for entry in backup_ssh_keys %} | ||||
| {{ entry.type }} {{ entry.key }} {{ entry.name }} {{ entry.date }} | ||||
| {% endfor %} | ||||
							
								
								
									
										11
									
								
								common-debian/templates/var/backups/timestamp.sh.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								common-debian/templates/var/backups/timestamp.sh.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Writes timestamps on successful BackupPC completion and updates dynamic share inventory for this host | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| OK="$1" | ||||
| SHARE="$2" | ||||
| grep -F "${SHARE}" /var/backups/shares || echo "${SHARE}" >> /var/backups/shares | ||||
| if [[ ${OK} -eq 1 ]]; then | ||||
| 	/bin/date +%s > ${SHARE}/.backup | ||||
| fi | ||||
| @@ -0,0 +1,8 @@ | ||||
| # deploy user authorized_keys | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% for user in admin_users %} | ||||
| {% for entry in user.ssh_keys %} | ||||
| {{ entry.type }} {{ entry.key }} {{ entry.name }} {{ entry.date }} | ||||
| {% endfor %} | ||||
| {% endfor %} | ||||
							
								
								
									
										7
									
								
								common-debian/templates/var/home/user/bash_logout.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								common-debian/templates/var/home/user/bash_logout.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # BLSE 2.x bash_logout file | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # when leaving the console clear the screen to increase privacy | ||||
| if [ "$SHLVL" = 1 ]; then | ||||
|     [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q | ||||
| fi | ||||
							
								
								
									
										149
									
								
								common-debian/templates/var/home/user/bashrc.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										149
									
								
								common-debian/templates/var/home/user/bashrc.j2
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,149 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # BLSE 2.x bashrc file | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| # | ||||
| # GENERAL SETTINGS | ||||
| # | ||||
|  | ||||
| # Before anything, see if we're running interactively. If not, skip everything here. | ||||
| [[ $- == *i* ]] || return | ||||
|  | ||||
| # Ensure bash completion is enabled if installed | ||||
| if ! shopt -oq posix; then | ||||
|   if [ -f /usr/share/bash-completion/bash_completion ]; then | ||||
|     . /usr/share/bash-completion/bash_completion | ||||
|   elif [ -f /etc/bash_completion ]; then | ||||
|     . /etc/bash_completion | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| # Some other tweaks | ||||
| [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" | ||||
| if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then | ||||
|     debian_chroot=$(cat /etc/debian_chroot) | ||||
| fi | ||||
|  | ||||
| # Set history limits and values | ||||
| shopt -s cdspell | ||||
| shopt -s dirspell | ||||
| shopt -s dotglob | ||||
| shopt -s histreedit | ||||
| shopt -s histverify | ||||
| shopt -s histappend | ||||
| PROMPT_COMMAND="history -a;$PROMPT_COMMAND" | ||||
| HISTCONTROL=ignoreboth | ||||
| HISTSIZE=25000 | ||||
| HISTFILESIZE=25000 | ||||
|  | ||||
| # | ||||
| # BASH SETTINGS | ||||
| # | ||||
|  | ||||
| # Set a shiny Linux Mint-style PS1 with spaces for easy double-click-select | ||||
| git_branch() { | ||||
| 	git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/git:\1 /' | ||||
| } | ||||
| export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\[\033[01;32m\]\H\[\033[01;34m\] \[\e[35m\]$(git_branch)\[\033[01;34m\]\w \$\[\033[00m\] ' | ||||
|  | ||||
| # Sensible PATH (find things in *sbin* as non-root user) | ||||
| export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/lib/check_mk_agent/plugins" | ||||
|  | ||||
| # Set PATH to include ~/Scripts if it exists | ||||
| if [ -d ~/Scripts ]; then | ||||
| 	export PATH=~/Scripts:$PATH | ||||
| fi | ||||
|  | ||||
| # Set editor to vim | ||||
| export EDITOR=/usr/bin/vim | ||||
|  | ||||
| # Force SCREEN to xterm due to Debian weirdness | ||||
| export SCREEN="xterm" | ||||
|  | ||||
|  | ||||
| # | ||||
| # ALIASES | ||||
| # | ||||
|  | ||||
| # Coloured command aliases | ||||
| alias ls='ls --color=always' | ||||
| alias dir='dir --color=always' | ||||
| alias vdir='vdir --color=always' | ||||
| alias grep='grep --color=always' | ||||
| alias fgrep='fgrep --color=always' | ||||
| alias egrep='egrep --color=always' | ||||
| alias xzgrep='xzgrep --color=always' | ||||
| alias less='less -r' | ||||
|  | ||||
| # Convenient ls aliases | ||||
| alias ll='ls -alh' | ||||
| alias la='ls -A' | ||||
| alias l='ls -lh' | ||||
|  | ||||
| # Always-sudo commands, because fuck typing sudo all the time | ||||
| alias service='sudo service' | ||||
| alias systemctl='sudo systemctl' | ||||
| alias journalctl='sudo journalctl' | ||||
| alias dmesg='sudo dmesg' | ||||
| alias apt='sudo apt' | ||||
| alias dpkg='sudo dpkg' | ||||
| alias find='sudo find' | ||||
| alias htop='sudo htop' | ||||
| alias powertop='sudo powertop' | ||||
| alias jnettop='sudo jnettop' | ||||
| alias wavemon='sudo wavemon' | ||||
| alias parted='sudo parted' | ||||
| alias fdisk='sudo fdisk' | ||||
| alias gdisk='sudo gdisk' | ||||
| alias chroot='sudo chroot' | ||||
| alias mount='sudo mount' | ||||
| alias umount='sudo umount' | ||||
| alias virsh='sudo virsh -c qemu:///system' | ||||
| alias ceph='sudo ceph' | ||||
| alias rbd='sudo rbd' | ||||
| alias mysql='sudo mysql' | ||||
| alias zpool='sudo zpool' | ||||
| alias zfs='sudo zfs' | ||||
| alias crm='sudo crm' | ||||
|  | ||||
| # Cool aliases | ||||
| alias cccp='sudo rsync -auv --progress' | ||||
| alias untmp='sudo umount /tmp/tmp.*{/*/*,/*,} 2>/dev/null' | ||||
| alias txz='tar -p --same-owner -I "xz -T4"' | ||||
| alias stxz='sudo tar -p --same-owner -I "xz -T4"' | ||||
| alias hatop='sudo hatop -s /var/lib/haproxy/admin.sock' | ||||
| alias zkcli='sudo /usr/share/zookeeper/bin/zkCli.sh -server $(hostname -s):2181' | ||||
| alias patronictl='sudo patronictl -c /etc/patroni/config.yml -d zookeeper://$(hostname -s):2181' | ||||
| alias repo='sudo reprepro -b /srv/debrepo' | ||||
| alias beet='sudo -u debian-deluged beet --config=/srv/deluged/config.beets/config.yaml' | ||||
| alias glances='sudo glances -t 5' | ||||
| {% if 'role_mon' in group_names %} | ||||
| alias icli='sudo -u monitor icli --status-file /omd/sites/monitor/tmp/nagios/status.dat --config /omd/sites/monitor/var/nagios/objects.cache -z \!o' | ||||
|  | ||||
| # | ||||
| # Show monitoring stats | ||||
| # | ||||
|  | ||||
| icli | ||||
| {% endif %} | ||||
|  | ||||
| # | ||||
| # SOURCE OTHER SCRIPTS | ||||
| # | ||||
|  | ||||
| if [[ -d ~/.bashrc.d ]]; then | ||||
|     for script in ~/.bashrc.d/*; do | ||||
|         . "$script" | ||||
|     done | ||||
| fi | ||||
|  | ||||
| # | ||||
| # NICE AND CLEAN | ||||
| # | ||||
|  | ||||
| echo | ||||
|  | ||||
| # | ||||
| # END OF FILE | ||||
| # | ||||
							
								
								
									
										25
									
								
								common-debian/templates/var/home/user/config/htop/htoprc.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								common-debian/templates/var/home/user/config/htop/htoprc.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| # htop config file | ||||
| # {{ ansible_managed }} | ||||
| fields=0 48 17 18 38 39 40 2 46 47 49 1  | ||||
| sort_key=46 | ||||
| sort_direction=0 | ||||
| hide_threads=0 | ||||
| hide_kernel_threads=0 | ||||
| hide_userland_threads=0 | ||||
| shadow_other_users=0 | ||||
| show_thread_names=1 | ||||
| highlight_base_name=1 | ||||
| highlight_megabytes=1 | ||||
| highlight_threads=1 | ||||
| tree_view=0 | ||||
| header_margin=1 | ||||
| detailed_cpu_time=1 | ||||
| cpu_count_from_zero=0 | ||||
| update_process_names=1 | ||||
| account_guest_in_cpu_meter=1 | ||||
| color_scheme=0 | ||||
| delay=15 | ||||
| left_meters=LeftCPUs2 Blank CPU Blank Blank Memory Swap  | ||||
| left_meter_modes=1 2 1 2 2 1 1  | ||||
| right_meters=RightCPUs2 Blank LoadAverage Tasks Blank Hostname Clock Uptime Blank  | ||||
| right_meter_modes=1 2 2 2 2 2 2 2 2  | ||||
							
								
								
									
										16
									
								
								common-debian/templates/var/home/user/profile.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								common-debian/templates/var/home/user/profile.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| EDITOR=/usr/bin/vim | ||||
|  | ||||
| # if running bash | ||||
| if [ -n "$BASH_VERSION" ]; then | ||||
|     # include .bashrc if it exists | ||||
|     if [ -f "$HOME/.bashrc" ]; then | ||||
| 	. "$HOME/.bashrc" | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| # set PATH so it includes user's private bin if it exists | ||||
| if [ -d "$HOME/bin" ] ; then | ||||
|     PATH="$HOME/bin:$PATH" | ||||
| fi | ||||
| @@ -0,0 +1,6 @@ | ||||
| # administrative shell user authorized_keys ({{ item.name }}) | ||||
| # {{ ansible_managed }} | ||||
|  | ||||
| {% for entry in item.ssh_keys %} | ||||
| {{ entry.type }} {{ entry.key }} {{ entry.name }} {{ entry.date }} | ||||
| {% endfor %} | ||||
							
								
								
									
										13
									
								
								common-debian/templates/var/home/user/vimrc.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								common-debian/templates/var/home/user/vimrc.j2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| set showcmd | ||||
| set number | ||||
| set cursorline | ||||
| set autoindent | ||||
| set expandtab | ||||
| set tabstop=4 | ||||
| set viminfo='100,<1000,s1000,h | ||||
| hi CursorLine term=bold cterm=bold guibg=Grey40 | ||||
| syntax on | ||||
| set ruler | ||||
| set directory=~/.vim | ||||
| set mouse= | ||||
| autocmd Filetype gitcommit setlocal spell textwidth=72 | ||||
		Reference in New Issue
	
	Block a user