From 7a24089031bdc7ca8612b01426868c4d94eba5a2 Mon Sep 17 00:00:00 2001 From: Michael Grote Date: Wed, 25 Oct 2023 22:26:17 +0200 Subject: [PATCH] fix linter errors (#584) Reviewed-on: https://git.mgrote.net/mg/homeserver/pulls/584 Co-authored-by: Michael Grote Co-committed-by: Michael Grote --- .ansible-lint | 4 + .ansible-lint-ignore | 3 - .drone.yml | 16 +- .yamllint | 3 - README.md | 3 - .../general/plugins/modules/btrfs_info.py | 4 +- .../plugins/modules/btrfs_subvolume.py | 4 +- docker-compose/homer/assets/config.yml | 5 - docker-compose/httpd/docker-compose.yml.j2 | 2 +- docker-compose/traefik/file-provider.yml | 4 +- .../mgrote_acng}/LICENSE | 0 .../mgrote_acng}/README.md | 0 friedhof/mgrote_acng/defaults/main.yml | 6 + friedhof/mgrote_acng/handlers/main.yml | 7 + .../mgrote_acng/mgrote.acng}/LICENSE | 0 .../mgrote_acng}/mgrote.acng/README.md | 0 .../mgrote_acng/mgrote.acng/defaults/main.yml | 6 + .../mgrote_acng/mgrote.acng/handlers/main.yml | 7 + .../mgrote_acng/mgrote.acng/tasks/main.yml | 42 ++ .../mgrote.acng}/templates/acng.conf | 0 .../mgrote.acng}/templates/security.conf | 0 friedhof/mgrote_acng/tasks/main.yml | 35 + .../mgrote_acng}/templates/acng.conf | 0 .../mgrote_acng}/templates/security.conf | 0 .../mgrote_alacritty}/LICENSE | 0 .../mgrote_alacritty}/README.md | 0 friedhof/mgrote_alacritty/defaults/main.yml | 2 + .../mgrote.alacritty/LICENSE | 0 .../mgrote.alacritty/README.md | 8 + .../mgrote.alacritty/defaults/main.yml | 2 + .../mgrote.alacritty/tasks/main.yml | 11 + friedhof/mgrote_alacritty/tasks/main.yml | 11 + .../mgrote_apcupsd}/LICENSE | 0 .../mgrote_apcupsd}/README.md | 0 friedhof/mgrote_apcupsd/defaults/main.yml | 40 ++ friedhof/mgrote_apcupsd/handlers/main.yml | 12 + friedhof/mgrote_apcupsd/meta/main.yml | 14 + .../mgrote_apcupsd/mgrote.apcupsd}/LICENSE | 0 .../mgrote_apcupsd/mgrote.apcupsd/README.md | 20 + .../mgrote.apcupsd/defaults/main.yml | 40 ++ .../mgrote.apcupsd/handlers/main.yml | 10 + .../mgrote.apcupsd/meta/main.yml | 14 + .../mgrote.apcupsd/tasks/main.yml | 42 ++ .../mgrote.apcupsd/tasks/master.yml | 7 + .../mgrote.apcupsd/tasks/slave.yml | 7 + .../mgrote.apcupsd/templates/apccontrol.save | 0 .../mgrote.apcupsd/templates/apcupsd | 0 .../templates/master_apcupsd.conf | 0 .../templates/slave_apcupsd.conf | 0 friedhof/mgrote_apcupsd/tasks/main.yml | 42 ++ friedhof/mgrote_apcupsd/tasks/master.yml | 7 + friedhof/mgrote_apcupsd/tasks/slave.yml | 7 + .../mgrote_apcupsd/templates/apccontrol.save | 138 ++++ friedhof/mgrote_apcupsd/templates/apcupsd | 1 + .../templates/master_apcupsd.conf | 17 + .../templates/slave_apcupsd.conf | 16 + .../mgrote_dnsmasq_adblocker}/LICENSE | 0 .../mgrote_dnsmasq_adblocker}/README.md | 0 .../defaults/main.yml | 41 ++ .../handlers/main.yml | 6 + .../mgrote.dnsmasq_adblocker/LICENSE | 0 .../mgrote.dnsmasq_adblocker/README.md | 16 + .../defaults/main.yml | 41 ++ .../handlers/main.yml | 6 + .../tasks/blocklist.yml | 19 + .../mgrote.dnsmasq_adblocker/tasks/config.yml | 9 + .../tasks/install.yml | 62 ++ .../mgrote.dnsmasq_adblocker/tasks/main.yml | 12 + .../tasks/services.yml | 18 + .../templates/dnsmasq.conf.j2 | 0 .../templates/logrotate.j2 | 0 .../templates/resolv.conf.j2 | 0 .../tasks/blocklist.yml | 19 + .../mgrote_dnsmasq_adblocker/tasks/config.yml | 9 + .../tasks/install.yml | 62 ++ .../mgrote_dnsmasq_adblocker/tasks/main.yml | 12 + .../tasks/services.yml | 18 + .../templates/dnsmasq.conf.j2 | 63 ++ .../templates/logrotate.j2 | 7 +- .../templates/resolv.conf.j2 | 4 + .../mgrote_docker_compose_deploy}/LICENSE | 0 .../mgrote_docker_compose_deploy}/README.md | 0 .../tasks/dockercompose-down.yml | 24 + .../tasks/dockercompose-up.yml | 64 ++ .../tasks/main.yml | 16 + .../mgrote_i3}/LICENSE | 0 .../mgrote_i3/mgrote.i3}/LICENSE | 0 .../mgrote_i3}/mgrote.i3/readme.md | 0 friedhof/mgrote_i3/mgrote.i3/tasks/main.yml | 15 + friedhof/mgrote_i3/readme.md | 4 + friedhof/mgrote_i3/tasks/main.yml | 15 + .../mgrote_minio}/LICENSE | 0 .../mgrote_minio}/README.md | 0 friedhof/mgrote_minio/defaults/main.yml | 20 + friedhof/mgrote_minio/handlers/main.yml | 6 + .../mgrote_minio/mgrote.minio}/LICENSE | 0 friedhof/mgrote_minio/mgrote.minio/README.md | 12 + .../mgrote.minio/defaults/main.yml | 20 + .../mgrote.minio/handlers/main.yml | 6 + .../mgrote_minio/mgrote.minio/tasks/main.yml | 62 ++ .../mgrote.minio/templates/default.j2 | 0 .../mgrote.minio/templates/minio.service.j2 | 0 friedhof/mgrote_minio/tasks/main.yml | 62 ++ friedhof/mgrote_minio/templates/default.j2 | 7 + .../mgrote_minio/templates/minio.service.j2 | 36 + .../mgrote_motd}/README.md | 0 friedhof/mgrote_motd/defaults/main.yml | 12 + friedhof/mgrote_motd/handlers/main.yml | 6 + friedhof/mgrote_motd/tasks/base.yml | 70 ++ friedhof/mgrote_motd/tasks/fortune.yml | 16 + friedhof/mgrote_motd/tasks/main.yml | 16 + friedhof/mgrote_motd/tasks/systemctl.yml | 10 + friedhof/mgrote_motd/tasks/weather.yml | 9 + .../mgrote_motd}/templates/00-ansible-mgrote | 0 .../mgrote_motd}/templates/05-fortune-mgrote | 0 .../mgrote_motd}/templates/10-wetter-mgrote | 0 .../mgrote_motd}/templates/20-facts-mgrote | 0 .../mgrote_motd}/templates/90-updates-mgrote | 0 .../mgrote_motd}/templates/91-reboot-mgrote | 0 friedhof/mgrote_munin_node/defaults/main.yml | 33 + friedhof/mgrote_munin_node/handlers/main.yml | 15 + .../mgrote_munin_node}/readme.md | 0 .../mgrote_munin_node/tasks/additional.yml | 37 + friedhof/mgrote_munin_node/tasks/install.yml | 29 + friedhof/mgrote_munin_node/tasks/main.yml | 11 + friedhof/mgrote_munin_node/tasks/remove.yml | 16 + friedhof/mgrote_munin_node/tasks/user.yml | 26 + .../templates/munin-node.conf.j2 | 0 .../mgrote_ntp_chrony_server}/LICENSE | 0 .../mgrote_ntp_chrony_server}/README.md | 0 .../defaults/main.yml | 18 + .../handlers/main.yml | 7 + .../mgrote.ntp_chrony_server}/LICENSE | 0 .../mgrote.ntp_chrony_server/README.md | 13 + .../defaults/main.yml | 18 + .../handlers/main.yml | 7 + .../mgrote.ntp_chrony_server/tasks/main.yml | 59 ++ .../templates/chrony.conf.j2 | 0 .../templates/logrotate_chrony | 0 .../mgrote_ntp_chrony_server/tasks/main.yml | 59 ++ .../templates/chrony.conf.j2 | 32 + .../templates/logrotate_chrony | 0 .../mgrote_polybar}/LICENSE | 0 friedhof/mgrote_polybar/defaults/main.yml | 4 + .../mgrote_polybar/mgrote.polybar}/LICENSE | 0 .../mgrote.polybar/defaults/main.yml | 4 + .../mgrote_polybar}/mgrote.polybar/readme.md | 0 .../mgrote.polybar/tasks/main.yml | 47 ++ friedhof/mgrote_polybar/readme.md | 7 + friedhof/mgrote_polybar/tasks/main.yml | 47 ++ .../mgrote_r8152_kernel_module}/LICENSE | 0 .../mgrote_r8152_kernel_module}/README.md | 0 .../defaults/main.yml | 12 + .../files/r8125-dkms_9.004.01.tar.gz | Bin .../mgrote_r8152_kernel_module/meta/main.yml | 3 + .../mgrote.r8152_kernel_module}/LICENSE | 0 .../mgrote.r8152_kernel_module}/README.md | 0 .../defaults/main.yml | 12 + .../files/r8125-dkms_9.004.01.tar.gz | Bin 0 -> 99022 bytes .../mgrote.r8152_kernel_module/meta/main.yml | 3 + .../tasks/assert.yml | 20 + .../mgrote.r8152_kernel_module/tasks/dkms.yml | 34 + .../tasks/doing.yml | 36 + .../mgrote.r8152_kernel_module/tasks/main.yml | 4 + .../tasks/assert.yml | 20 + .../mgrote_r8152_kernel_module/tasks/dkms.yml | 34 + .../tasks/doing.yml | 36 + .../mgrote_r8152_kernel_module/tasks/main.yml | 4 + .../LICENSE | 0 .../README.md | 16 + .../defaults/main.yml | 11 + .../files/r8152.53.56-2.15.0.tar.bz2 | Bin .../meta/main.yml | 3 + .../LICENSE | 0 .../README.md | 16 + .../defaults/main.yml | 11 + .../files/r8152.53.56-2.15.0.tar.bz2 | Bin 0 -> 70602 bytes .../meta/main.yml | 3 + .../tasks/doing.yml | 83 +++ .../tasks/main.yml | 16 + .../tasks/doing.yml | 83 +++ .../tasks/main.yml | 16 + .../mgrote_supermicro_fan_control}/LICENSE | 0 .../mgrote_supermicro_fan_control}/README.md | 0 .../handlers/main.yml | 25 + .../mgrote.supermicro_fan_control}/LICENSE | 0 .../mgrote.supermicro_fan_control/README.md | 25 + .../handlers/main.yml | 25 + ... Fan Speed Control _ ServeTheHome Foru.png | Bin ...grote.lan - _default_1_bash - _pve2_ _.png | Bin .../tasks/main.yml | 36 + .../templates/sm_fan_control.service.j2 | 0 .../templates/sm_fan_control.timer.j2 | 0 ... Fan Speed Control _ ServeTheHome Foru.png | Bin 0 -> 164235 bytes ...grote.lan - _default_1_bash - _pve2_ _.png | Bin 0 -> 127495 bytes .../tasks/main.yml | 36 + .../templates/sm_fan_control.service.j2 | 17 + .../templates/sm_fan_control.timer.j2 | 5 +- .../mgrote_systemd_timesyncd}/LICENSE | 0 .../mgrote_systemd_timesyncd}/README.md | 0 .../defaults/main.yml | 4 + .../handlers/main.yml | 7 + .../mgrote_systemd_timesyncd/tasks/main.yml | 56 ++ .../templates/timesyncd.conf.j2 | 0 .../mgrote_timeshift}/LICENSE | 0 .../mgrote_timeshift}/README.md | 0 friedhof/mgrote_timeshift/handlers/main.yml | 4 + .../mgrote.timeshift}/LICENSE | 0 .../mgrote.timeshift/README.md | 10 + .../mgrote.timeshift/handlers/main.yml | 4 + .../mgrote.timeshift/tasks/main.yml | 23 + .../mgrote.timeshift/templates/timeshift.json | 0 friedhof/mgrote_timeshift/tasks/main.yml | 23 + .../mgrote_timeshift/templates/timeshift.json | 31 + .../mgrote_tor_node}/LICENSE | 0 .../mgrote_tor_node}/README.md | 0 friedhof/mgrote_tor_node/defaults/main.yml | 18 + friedhof/mgrote_tor_node/handlers/main.yml | 7 + friedhof/mgrote_tor_node/tasks/bridge.yml | 15 + friedhof/mgrote_tor_node/tasks/main.yml | 39 + friedhof/mgrote_tor_node/tasks/nyx.yml | 8 + friedhof/mgrote_tor_node/tasks/relay.yml | 7 + .../mgrote_tor_node}/templates/bridge_torrc | 0 .../mgrote_tor_node}/templates/relay_torrc | 0 .../mgrote_xnview}/LICENSE | 0 .../mgrote_xnview}/README.md | 0 friedhof/mgrote_xnview/defaults/main.yml | 2 + .../mgrote_xnview/mgrote.xnview}/LICENSE | 0 .../mgrote_xnview/mgrote.xnview/README.md | 8 + .../mgrote.xnview/defaults/main.yml | 2 + .../mgrote.xnview/tasks/main.yml | 5 + friedhof/mgrote_xnview/tasks/main.yml | 5 + .../mgrote_xrdp}/LICENSE | 0 .../mgrote_xrdp}/README.md | 0 .../mgrote_xrdp/mgrote.xrdp}/LICENSE | 0 friedhof/mgrote_xrdp/mgrote.xrdp/README.md | 11 + .../mgrote_xrdp/mgrote.xrdp/tasks/main.yml | 24 + friedhof/mgrote_xrdp/tasks/main.yml | 24 + .../mgrote_zswap}/LICENSE | 0 .../mgrote_zswap}/README.md | 0 friedhof/mgrote_zswap/defaults/main.yml | 2 + .../mgrote_zswap/mgrote.zswap}/LICENSE | 0 friedhof/mgrote_zswap/mgrote.zswap/README.md | 10 + .../mgrote.zswap/defaults/main.yml | 2 + .../mgrote_zswap/mgrote.zswap/tasks/main.yml | 6 + friedhof/mgrote_zswap/tasks/main.yml | 6 + group_vars/all.yml | 426 +++++------ group_vars/ansible.yml | 30 +- group_vars/docker.yml | 125 ++-- group_vars/dokuwiki.yml | 36 +- group_vars/fileserver.yml | 228 +++--- group_vars/gitea.yml | 180 ++--- group_vars/k3s.yml | 146 ++-- group_vars/laptop.yml | 83 --- group_vars/pbs.yml | 58 +- group_vars/pve.yml | 75 +- host_vars/docker10.grote.lan.yml | 140 ++-- host_vars/k3s4.grote.lan.yml | 4 +- host_vars/pbs-test.grote.lan.yml | 295 ++++---- host_vars/pbs.grote.lan.yml | 278 ++++---- host_vars/pve5-test.grote.lan.yml | 448 ++++++------ host_vars/pve5.grote.lan.yml | 474 ++++++------ inventory_laptop | 5 - playbooks/1_bootstrap.yml | 55 +- playbooks/2_all.yml | 33 +- playbooks/3_service/acng.yml | 4 - playbooks/3_service/dnsmasq.yml | 4 - playbooks/3_service/docker.yml | 6 +- playbooks/3_service/dokuwiki.yml | 2 +- playbooks/3_service/fileserver.yml | 6 +- playbooks/3_service/gitea.yml | 1 - playbooks/3_service/k3s.yml | 8 +- playbooks/3_service/laptop.yml | 11 - playbooks/3_service/nfs.yml | 4 - playbooks/3_service/pbs.yml | 22 +- playbooks/3_service/pve.yml | 30 +- playbooks/base/apt_sources.yml | 8 +- playbooks/base/dotfiles.yml | 6 +- playbooks/base/f2b.yml | 6 +- playbooks/base/fwupd.yml | 12 +- playbooks/base/lvm.yml | 14 +- playbooks/base/motd.yml | 4 - playbooks/base/ntp_client.yml | 6 +- playbooks/base/packages.yml | 10 +- playbooks/base/postfix.yml | 6 +- playbooks/base/remove_snapd.yml | 6 +- playbooks/base/restic.yml | 6 +- playbooks/base/ssh.yml | 8 +- playbooks/base/ufw.yml | 10 +- playbooks/base/unattended_upgrades.yml | 12 +- playbooks/base/update_packages.yml | 8 +- playbooks/base/users.yml | 6 +- playbooks/base/vim.yml | 6 +- .../on-off/activate_ssh_password_login.yml | 22 - playbooks/on-off/apt_autoremove.yml | 10 - playbooks/on-off/apt_update.yml | 10 - .../on-off/delete_old_upgrades_config.yml | 11 - playbooks/on-off/delete_ssh.yml | 26 - playbooks/on-off/f2b.yml | 6 - .../on-off/remove_bash-helper-scripts.yml | 2 +- playbooks/on-off/remove_chrony.yml | 29 - playbooks/on-off/remove_cowsay.yml | 8 - playbooks/on-off/remove_dotfiles_dir.yml | 54 -- playbooks/on-off/remove_ipmitool.yml | 13 - playbooks/on-off/remove_munin_node.yml | 27 - playbooks/on-off/remove_ntpd.yml | 18 - playbooks/on-off/remove_old_restic_config.yml | 71 -- .../on-off/remove_old_restic_cronjob.yml | 12 - playbooks/on-off/remove_old_ssh_key.yml | 4 +- playbooks/on-off/remove_sanoid.yml | 62 -- playbooks/on-off/remove_telegraf.yml | 14 - playbooks/on-off/repair_syslog.yml | 16 - playbooks/on-off/root_bash.yml | 8 - playbooks/on-off/rsyslog_template | 37 - playbooks/on-off/set_dns_resolver.yml | 12 - playbooks/on-off/set_id0.yml | 9 - playbooks/on-off/set_password_mg.yml | 14 - playbooks/on-off/set_r8152_driver.yml | 5 - roles/_mgrote.musterrolle/defaults/main.yml | 6 - roles/_mgrote.musterrolle/handlers/main.yml | 7 - roles/_mgrote.musterrolle/tasks/main.yml | 49 -- roles/_mgrote.musterrolle/tasks/user.yml | 34 - roles/_mgrote.musterrolle_systemd/README.md | 14 - .../defaults/main.yml | 17 - .../handlers/main.yml | 5 - .../tasks/main.yml | 67 -- .../templates/rclone.service.j2 | 10 - .../templates/rclone_mail@.service.j2 | 8 - roles/mgrote.acng/defaults/main.yml | 6 - roles/mgrote.acng/handlers/main.yml | 7 - roles/mgrote.acng/tasks/main.yml | 42 -- roles/mgrote.alacritty/defaults/main.yml | 2 - roles/mgrote.alacritty/tasks/main.yml | 11 - roles/mgrote.apcupsd/defaults/main.yml | 40 -- roles/mgrote.apcupsd/handlers/main.yml | 10 - roles/mgrote.apcupsd/meta/main.yml | 14 - roles/mgrote.apcupsd/tasks/main.yml | 42 -- roles/mgrote.apcupsd/tasks/master.yml | 7 - roles/mgrote.apcupsd/tasks/slave.yml | 7 - .../defaults/main.yml | 35 - .../mgrote.apt_manage_packages/tasks/main.yml | 41 -- .../handlers/main.yml | 5 - .../mgrote.apt_update_packages/tasks/main.yml | 10 - .../mgrote.cv4pve-autosnap/defaults/main.yml | 14 - .../mgrote.cv4pve-autosnap/handlers/main.yml | 26 - roles/mgrote.cv4pve-autosnap/tasks/main.yml | 73 -- roles/mgrote.cv4pve-autosnap/tasks/user.yml | 19 - .../mgrote.deactivate_caps/handlers/main.yml | 4 - roles/mgrote.deactivate_caps/tasks/main.yml | 8 - .../mgrote.disable_oom_killer/tasks/main.yml | 13 - .../defaults/main.yml | 41 -- .../handlers/main.yml | 6 - .../tasks/blocklist.yml | 19 - .../mgrote.dnsmasq_adblocker/tasks/config.yml | 9 - .../tasks/install.yml | 62 -- roles/mgrote.dnsmasq_adblocker/tasks/main.yml | 12 - .../tasks/services.yml | 18 - .../tasks/dockercompose-down.yml | 24 - .../tasks/dockercompose-up.yml | 64 -- .../tasks/main.yml | 16 - .../defaults/main.yml | 18 - .../tasks/main.yml | 97 --- roles/mgrote.dokuwiki/defaults/main.yml | 6 - roles/mgrote.dokuwiki/handlers/main.yml | 7 - roles/mgrote.dokuwiki/meta/main.yml | 3 - roles/mgrote.dokuwiki/tasks/apache2.yml | 21 - roles/mgrote.dokuwiki/tasks/dokuwiki.yml | 72 -- roles/mgrote.dokuwiki/tasks/install.yml | 13 - roles/mgrote.dokuwiki/tasks/main.yml | 7 - roles/mgrote.dotfiles/defaults/main.yml | 11 - roles/mgrote.dotfiles/tasks/main.yml | 62 -- roles/mgrote.exa/defaults/main.yml | 2 - roles/mgrote.exa/tasks/main.yml | 10 - roles/mgrote.fail2ban/defaults/main.yml | 8 - roles/mgrote.fail2ban/handlers/main.yml | 7 - roles/mgrote.fail2ban/meta/main.yml | 3 - roles/mgrote.fail2ban/tasks/main.yml | 22 - roles/mgrote.fileserver_smb/defaults/main.yml | 107 --- roles/mgrote.fileserver_smb/handlers/main.yml | 15 - roles/mgrote.fileserver_smb/tasks/main.yml | 11 - .../mgrote.fileserver_smb/tasks/packages.yml | 6 - roles/mgrote.fileserver_smb/tasks/shares.yml | 21 - roles/mgrote.fileserver_smb/tasks/users.yml | 18 - roles/mgrote.fluxcd/defaults/main.yml | 16 - roles/mgrote.fluxcd/tasks/main.yml | 95 --- roles/mgrote.fluxcd/tasks/user.yml | 18 - roles/mgrote.fwupd_settings/defaults/main.yml | 2 - roles/mgrote.fwupd_settings/handlers/main.yml | 7 - roles/mgrote.fwupd_settings/tasks/main.yml | 14 - roles/mgrote.i3/tasks/main.yml | 15 - .../mgrote.k8s_autocompletion/tasks/main.yml | 13 - roles/mgrote.k8s_misc/tasks/main.yml | 7 - roles/mgrote.minio/defaults/main.yml | 20 - roles/mgrote.minio/handlers/main.yml | 6 - roles/mgrote.minio/tasks/main.yml | 62 -- roles/mgrote.motd/defaults/main.yml | 12 - roles/mgrote.motd/handlers/main.yml | 6 - roles/mgrote.motd/tasks/base.yml | 70 -- roles/mgrote.motd/tasks/fortune.yml | 16 - roles/mgrote.motd/tasks/main.yml | 15 - roles/mgrote.motd/tasks/systemctl.yml | 10 - roles/mgrote.motd/tasks/weather.yml | 8 - roles/mgrote.mount_cifs/defaults/main.yml | 12 - roles/mgrote.mount_cifs/handlers/main.yml | 5 - roles/mgrote.mount_cifs/meta/main.yml | 3 - roles/mgrote.mount_cifs/tasks/main.yml | 41 -- roles/mgrote.munin-node/defaults/main.yml | 33 - roles/mgrote.munin-node/handlers/main.yml | 5 - roles/mgrote.munin-node/tasks/additional.yml | 34 - roles/mgrote.munin-node/tasks/install.yml | 36 - roles/mgrote.munin-node/tasks/main.yml | 11 - roles/mgrote.munin-node/tasks/remove.yml | 16 - roles/mgrote.munin-node/tasks/user.yml | 26 - .../defaults/main.yml | 9 - .../handlers/main.yml | 8 - roles/mgrote.ntp_chrony_client/tasks/main.yml | 67 -- .../defaults/main.yml | 18 - .../handlers/main.yml | 7 - roles/mgrote.ntp_chrony_server/tasks/main.yml | 59 -- roles/mgrote.pbs_datastores/tasks/main.yml | 42 -- .../mgrote.pbs_pve_integration/tasks/main.yml | 19 - roles/mgrote.pbs_users/tasks/main.yml | 26 - roles/mgrote.polybar/defaults/main.yml | 4 - roles/mgrote.polybar/tasks/main.yml | 47 -- roles/mgrote.postfix/defaults/main.yml | 12 - roles/mgrote.postfix/handlers/main.yml | 19 - roles/mgrote.postfix/tasks/main.yml | 57 -- .../defaults/main.yml | 3 - .../handlers/main.yml | 11 - roles/mgrote.proxmox_bind_mounts/tasks/bm.yml | 46 -- .../mgrote.proxmox_bind_mounts/tasks/main.yml | 7 - .../defaults/main.yml | 7 - .../handlers/main.yml | 11 - .../tasks/main.yml | 7 - .../tasks/profile.yml | 24 - .../mgrote.qemu_guest_agent/handlers/main.yml | 5 - roles/mgrote.qemu_guest_agent/tasks/main.yml | 13 - roles/mgrote.r8152_kernel_module/LICENSE | 674 ------------------ .../defaults/main.yml | 12 - .../mgrote.r8152_kernel_module/meta/main.yml | 3 - .../tasks/assert.yml | 20 - .../mgrote.r8152_kernel_module/tasks/dkms.yml | 34 - .../tasks/doing.yml | 36 - .../mgrote.r8152_kernel_module/tasks/main.yml | 4 - .../mgrote.r8152_kernel_module_on_off/LICENSE | 674 ------------------ .../defaults/main.yml | 11 - .../meta/main.yml | 3 - .../tasks/doing.yml | 83 --- .../tasks/main.yml | 16 - roles/mgrote.rclone/LICENSE | 674 ------------------ roles/mgrote.rclone/README.md | 14 - roles/mgrote.rclone/defaults/main.yml | 17 - roles/mgrote.rclone/handlers/main.yml | 5 - roles/mgrote.rclone/tasks/main.yml | 105 --- .../mgrote.rclone/templates/rclone.service.j2 | 10 - roles/mgrote.rclone/templates/rclone.timer.j2 | 10 - .../templates/rclone_mail@.service.j2 | 8 - roles/mgrote.remove_snapd/LICENSE | 674 ------------------ roles/mgrote.remove_snapd/tasks/main.yml | 13 - roles/mgrote.restic/LICENSE | 674 ------------------ roles/mgrote.restic/defaults/main.yml | 33 - roles/mgrote.restic/handlers/main.yml | 28 - roles/mgrote.restic/tasks/main.yml | 117 --- roles/mgrote.sealed-secrets/LICENSE | 674 ------------------ roles/mgrote.sealed-secrets/defaults/main.yml | 8 - roles/mgrote.sealed-secrets/tasks/import.yml | 29 - roles/mgrote.sealed-secrets/tasks/main.yml | 26 - roles/mgrote.sealed-secrets/tasks/user.yml | 18 - roles/mgrote.set_permissions/LICENSE | 674 ------------------ roles/mgrote.smart/LICENSE | 674 ------------------ roles/mgrote.smart/defaults/main.yml | 6 - roles/mgrote.smart/handlers/main.yml | 7 - roles/mgrote.smart/meta/main.yml | 14 - roles/mgrote.smart/tasks/main.yml | 27 - roles/mgrote.smart/tasks/user.yml | 19 - roles/mgrote.ssh/LICENSE | 674 ------------------ roles/mgrote.ssh/handlers/main.yml | 7 - roles/mgrote.ssh/tasks/main.yml | 10 - roles/mgrote.ssh/tasks/pve.yml | 15 - roles/mgrote.ssh/tasks/ubuntu.yml | 15 - roles/mgrote.ssh/vars/pve.yml | 6 - roles/mgrote.ssh/vars/ubuntu.yml | 6 - roles/mgrote.supermicro_fan_control/LICENSE | 674 ------------------ .../handlers/main.yml | 25 - .../tasks/main.yml | 36 - .../mgrote.systemd-resolved/handlers/main.yml | 5 - roles/mgrote.systemd-resolved/tasks/main.yml | 24 - roles/mgrote.systemd-timesyncd/LICENSE | 674 ------------------ .../defaults/main.yml | 4 - .../handlers/main.yml | 7 - roles/mgrote.systemd-timesyncd/tasks/main.yml | 57 -- roles/mgrote.timeshift/LICENSE | 674 ------------------ roles/mgrote.timeshift/handlers/main.yml | 4 - roles/mgrote.timeshift/tasks/main.yml | 23 - roles/mgrote.tor-node/LICENSE | 674 ------------------ roles/mgrote.tor-node/defaults/main.yml | 18 - roles/mgrote.tor-node/handlers/main.yml | 7 - roles/mgrote.tor-node/tasks/bridge.yml | 15 - roles/mgrote.tor-node/tasks/main.yml | 39 - roles/mgrote.tor-node/tasks/nyx.yml | 8 - roles/mgrote.tor-node/tasks/relay.yml | 7 - roles/mgrote.users/LICENSE | 674 ------------------ roles/mgrote.users/tasks/main.yml | 43 -- roles/mgrote.vim/LICENSE | 674 ------------------ roles/mgrote.vim/defaults/main.yml | 4 - roles/mgrote.vim/tasks/main.yml | 45 -- roles/mgrote.xnview/LICENSE | 674 ------------------ roles/mgrote.xnview/defaults/main.yml | 2 - roles/mgrote.xnview/tasks/main.yml | 5 - roles/mgrote.xrdp/LICENSE | 674 ------------------ roles/mgrote.xrdp/tasks/main.yml | 24 - roles/mgrote.youtubedl/LICENSE | 674 ------------------ roles/mgrote.youtubedl/handlers/main.yml | 5 - roles/mgrote.youtubedl/tasks/main.yml | 83 --- roles/mgrote.zfs_arc_mem/LICENSE | 674 ------------------ roles/mgrote.zfs_arc_mem/defaults/main.yml | 2 - roles/mgrote.zfs_arc_mem/tasks/main.yml | 6 - roles/mgrote.zfs_health/LICENSE | 674 ------------------ roles/mgrote.zfs_health/defaults/main.yml | 7 - roles/mgrote.zfs_health/tasks/main.yml | 22 - roles/mgrote.zfs_health/tasks/user.yml | 19 - roles/mgrote.zfs_manage_datasets/LICENSE | 674 ------------------ .../mgrote.zfs_manage_datasets/meta/main.yml | 3 - .../mgrote.zfs_manage_datasets/tasks/main.yml | 59 -- roles/mgrote.zfs_packages/LICENSE | 674 ------------------ roles/mgrote.zfs_packages/tasks/main.yml | 9 - roles/mgrote.zfs_sanoid/LICENSE | 674 ------------------ roles/mgrote.zfs_sanoid/handlers/main.yml | 5 - roles/mgrote.zfs_sanoid/tasks/destination.yml | 77 -- roles/mgrote.zfs_sanoid/tasks/main.yml | 64 -- roles/mgrote.zfs_sanoid/tasks/snaps.yml | 49 -- roles/mgrote.zfs_sanoid/tasks/source.yml | 23 - roles/mgrote.zfs_sanoid/tasks/user.yml | 19 - roles/mgrote.zfs_scrub/LICENSE | 674 ------------------ roles/mgrote.zfs_scrub/defaults/main.yml | 2 - roles/mgrote.zfs_scrub/tasks/main.yml | 84 --- roles/mgrote.zfs_zed/LICENSE | 674 ------------------ roles/mgrote.zfs_zed/handlers/main.yml | 3 - roles/mgrote.zfs_zed/tasks/main.yml | 9 - roles/mgrote.zswap/LICENSE | 674 ------------------ roles/mgrote.zswap/defaults/main.yml | 2 - roles/mgrote.zswap/tasks/main.yml | 6 - .../README.md | 0 .../defaults/main.yml | 35 + .../mgrote_apt_manage_packages/tasks/main.yml | 41 ++ .../README.md | 0 .../defaults/main.yml | 0 .../handlers/main.yml | 5 + .../tasks/main.yml | 3 + .../tasks/pbs.yml | 4 +- .../tasks/pve.yml | 6 +- .../templates/sources.j2 | 0 .../vars/mint.yml | 0 .../vars/pbs.yaml | 0 .../vars/pve.yaml | 0 .../vars/ubuntu.yaml | 0 .../README.md | 0 .../mgrote_apt_update_packages/tasks/main.yml | 10 + .../README.md | 0 .../mgrote_cv4pve_autosnap/defaults/main.yml | 14 + .../mgrote_cv4pve_autosnap/handlers/main.yml | 26 + roles/mgrote_cv4pve_autosnap/tasks/main.yml | 75 ++ roles/mgrote_cv4pve_autosnap/tasks/user.yml | 19 + .../templates/cv4pve.service.j2 | 0 .../templates/cv4pve.timer.j2 | 0 .../templates/cv4pve_mail.service.j2 | 0 .../mgrote_deactivate_caps/handlers/main.yml | 4 + .../readme.md | 0 roles/mgrote_deactivate_caps/tasks/main.yml | 8 + .../README.md | 0 .../handlers/main.yml | 5 + .../mgrote_disable_oom_killer/tasks/main.yml | 8 + .../README.md | 0 .../defaults/main.yml | 18 + .../tasks/main.yml | 97 +++ .../README.md | 0 roles/mgrote_dokuwiki/defaults/main.yml | 6 + roles/mgrote_dokuwiki/handlers/main.yml | 7 + roles/mgrote_dokuwiki/tasks/apache2.yml | 27 + roles/mgrote_dokuwiki/tasks/dokuwiki.yml | 73 ++ roles/mgrote_dokuwiki/tasks/install.yml | 13 + roles/mgrote_dokuwiki/tasks/main.yml | 7 + .../templates/000-default.conf | 0 .../templates/apache2.conf | 0 .../README.md | 0 roles/mgrote_dotfiles/defaults/main.yml | 11 + roles/mgrote_dotfiles/handlers/main.yml | 8 + roles/mgrote_dotfiles/tasks/main.yml | 57 ++ roles/{mgrote.exa => mgrote_exa}/README.md | 0 roles/mgrote_exa/defaults/main.yml | 2 + roles/mgrote_exa/tasks/main.yml | 10 + .../README.md | 0 roles/mgrote_fail2ban/defaults/main.yml | 8 + roles/mgrote_fail2ban/handlers/main.yml | 7 + roles/mgrote_fail2ban/tasks/main.yml | 22 + .../templates/jail.local | 0 .../templates/sendmail-common.local | 0 .../README.md | 0 roles/mgrote_fileserver_smb/defaults/main.yml | 107 +++ roles/mgrote_fileserver_smb/handlers/main.yml | 15 + roles/mgrote_fileserver_smb/tasks/main.yml | 11 + .../mgrote_fileserver_smb/tasks/packages.yml | 6 + roles/mgrote_fileserver_smb/tasks/shares.yml | 24 + roles/mgrote_fileserver_smb/tasks/users.yml | 18 + .../templates/smb.conf.j2 | 0 .../README.md | 0 roles/mgrote_fluxcd/defaults/main.yml | 16 + roles/mgrote_fluxcd/handlers/main.yml | 6 + roles/mgrote_fluxcd/tasks/main.yml | 93 +++ roles/mgrote_fluxcd/tasks/user.yml | 18 + .../templates/bootstrap.sh | 0 .../README.md | 0 roles/mgrote_fwupd_settings/defaults/main.yml | 2 + roles/mgrote_fwupd_settings/handlers/main.yml | 7 + roles/mgrote_fwupd_settings/tasks/main.yml | 17 + .../README.md | 0 .../mgrote_k8s_autocompletion/tasks/main.yml | 14 + .../README.md | 0 roles/mgrote_k8s_misc/tasks/main.yml | 7 + .../README.md | 0 roles/mgrote_mount_cifs/defaults/main.yml | 12 + roles/mgrote_mount_cifs/handlers/main.yml | 5 + roles/mgrote_mount_cifs/meta/main.yml | 3 + roles/mgrote_mount_cifs/tasks/main.yml | 41 ++ .../templates/smb_passwords | 0 .../README.md | 0 .../defaults/main.yml | 9 + .../handlers/main.yml | 8 + roles/mgrote_ntp_chrony_client/tasks/main.yml | 69 ++ .../templates/chrony.conf.j2 | 0 .../templates/logrotate_chrony | 16 + .../defaults/main.yml | 0 roles/mgrote_pbs_datastores/tasks/main.yml | 42 ++ .../templates/datastores.j2 | 0 .../templates/permissions.j2 | 0 .../templates/prune-jobs.j2 | 0 .../defaults/main.yml | 0 .../mgrote_pbs_pve_integration/tasks/main.yml | 21 + .../defaults/main.yml | 0 roles/mgrote_pbs_users/tasks/main.yml | 26 + .../README.md | 0 roles/mgrote_postfix/defaults/main.yml | 12 + roles/mgrote_postfix/handlers/main.yml | 21 + roles/mgrote_postfix/tasks/main.yml | 66 ++ .../templates/main.cf | 0 .../templates/sasl_passwd | 0 .../templates/sender_canonical | 0 .../README.md | 2 +- .../defaults/main.yml | 3 + .../handlers/main.yml | 11 + roles/mgrote_proxmox_bind_mounts/tasks/bm.yml | 48 ++ .../mgrote_proxmox_bind_mounts/tasks/main.yml | 7 + .../README.md | 2 +- .../defaults/main.yml | 7 + .../handlers/main.yml | 11 + .../tasks/main.yml | 7 + .../tasks/profile.yml | 24 + .../README.md | 0 .../mgrote_qemu_guest_agent/handlers/main.yml | 5 + roles/mgrote_qemu_guest_agent/tasks/main.yml | 13 + .../README.md | 0 roles/mgrote_remove_snapd/tasks/main.yml | 13 + .../README.md | 0 roles/mgrote_restic/defaults/main.yml | 33 + roles/mgrote_restic/handlers/main.yml | 28 + roles/mgrote_restic/tasks/main.yml | 117 +++ .../templates/media-restic.automount.j2 | 0 .../templates/media-restic.mount.j2 | 0 .../templates/restic.env.j2 | 0 .../templates/restic.service.j2 | 0 .../templates/restic.timer.j2 | 0 .../templates/restic_mail.service.j2 | 0 .../templates/smb.cred.j2 | 0 .../README.md | 0 roles/mgrote_sealed_secrets/defaults/main.yml | 8 + roles/mgrote_sealed_secrets/tasks/import.yml | 29 + roles/mgrote_sealed_secrets/tasks/main.yml | 26 + roles/mgrote_sealed_secrets/tasks/user.yml | 18 + .../templates/private.key.j2 | 0 .../README.md | 0 .../tasks/main.yml | 0 .../{mgrote.smart => mgrote_smart}/README.md | 0 roles/mgrote_smart/defaults/main.yml | 6 + roles/mgrote_smart/handlers/main.yml | 7 + roles/mgrote_smart/tasks/main.yml | 29 + roles/mgrote_smart/tasks/user.yml | 19 + .../templates/smartd.conf | 0 .../templates/smartmontools | 0 roles/{mgrote.ssh => mgrote_ssh}/README.md | 0 roles/mgrote_ssh/handlers/main.yml | 7 + roles/mgrote_ssh/tasks/main.yml | 10 + roles/mgrote_ssh/tasks/pve.yml | 15 + roles/mgrote_ssh/tasks/ubuntu.yml | 15 + .../templates/pve.j2 | 0 .../templates/ubuntu.j2 | 0 roles/mgrote_ssh/vars/pve.yml | 6 + roles/mgrote_ssh/vars/ubuntu.yml | 6 + .../README.md | 0 .../defaults/main.yml | 1 + .../mgrote_systemd_resolved/handlers/main.yml | 5 + roles/mgrote_systemd_resolved/tasks/main.yml | 24 + .../templates/resolv.conf.j2 | 0 .../templates/resolved.conf.j2 | 0 .../{mgrote.users => mgrote_users}/README.md | 0 roles/mgrote_users/tasks/main.yml | 43 ++ roles/mgrote_vim/defaults/main.yml | 4 + roles/mgrote_vim/handlers/main.yml | 7 + roles/{mgrote.vim => mgrote_vim}/readme.md | 0 roles/mgrote_vim/tasks/main.yml | 38 + .../README.md | 0 .../defaults/main.yml | 0 roles/mgrote_youtubedl/handlers/main.yml | 5 + roles/mgrote_youtubedl/tasks/main.yml | 86 +++ .../templates/podcast.txt | 0 .../templates/youtube.txt | 0 .../templates/youtubedl.service.j2 | 0 .../templates/youtubedl.timer.j2 | 0 .../templates/youtubedl_mail.service.j2 | 0 .../README.md | 0 roles/mgrote_zfs_arc_mem/defaults/main.yml | 2 + roles/mgrote_zfs_arc_mem/tasks/main.yml | 9 + .../README.md | 0 roles/mgrote_zfs_health/defaults/main.yml | 7 + roles/mgrote_zfs_health/tasks/main.yml | 22 + roles/mgrote_zfs_health/tasks/user.yml | 19 + .../templates/zfs-health.sh | 0 .../README.md | 0 .../mgrote_zfs_manage_datasets/tasks/main.yml | 59 ++ .../README.md | 0 roles/mgrote_zfs_packages/tasks/main.yml | 9 + .../README.md | 2 +- .../defaults/main.yml | 50 +- roles/mgrote_zfs_sanoid/handlers/main.yml | 5 + roles/mgrote_zfs_sanoid/tasks/destination.yml | 77 ++ roles/mgrote_zfs_sanoid/tasks/main.yml | 64 ++ roles/mgrote_zfs_sanoid/tasks/snaps.yml | 49 ++ roles/mgrote_zfs_sanoid/tasks/source.yml | 23 + roles/mgrote_zfs_sanoid/tasks/user.yml | 19 + .../templates/sanoid.conf.j2 | 0 .../templates/sanoid_mail.service.j2 | 0 .../templates/syncoid.service.j2 | 0 .../templates/syncoid.timer.j2 | 0 .../templates/syncoid_mail.service.j2 | 0 .../README.md | 0 roles/mgrote_zfs_scrub/defaults/main.yml | 2 + roles/mgrote_zfs_scrub/tasks/main.yml | 84 +++ .../templates/zpool-scrub-mail.service.j2 | 0 .../templates/zpool-scrub@.service.j2 | 0 .../templates/zpool-scrub@.timer.j2 | 0 .../README.md | 0 roles/mgrote_zfs_zed/handlers/main.yml | 5 + roles/mgrote_zfs_zed/tasks/main.yml | 9 + .../templates/zed.rc | 0 .../molecule/default/converge.yml | 2 +- .../molecule/kvm/converge.yml | 2 +- .../molecule/kvmonlyvg/converge.yml | 2 +- .../molecule/kvmsinglelv/converge.yml | 2 +- .../playbook.yml | 4 +- 758 files changed, 7206 insertions(+), 24226 deletions(-) delete mode 100644 .ansible-lint-ignore delete mode 100644 .yamllint rename {roles/_mgrote.musterrolle => friedhof/mgrote_acng}/LICENSE (100%) rename {roles/_mgrote.musterrolle => friedhof/mgrote_acng}/README.md (100%) create mode 100644 friedhof/mgrote_acng/defaults/main.yml create mode 100644 friedhof/mgrote_acng/handlers/main.yml rename {roles/_mgrote.musterrolle_systemd => friedhof/mgrote_acng/mgrote.acng}/LICENSE (100%) rename {roles => friedhof/mgrote_acng}/mgrote.acng/README.md (100%) create mode 100644 friedhof/mgrote_acng/mgrote.acng/defaults/main.yml create mode 100644 friedhof/mgrote_acng/mgrote.acng/handlers/main.yml create mode 100644 friedhof/mgrote_acng/mgrote.acng/tasks/main.yml rename {roles/_mgrote.musterrolle => friedhof/mgrote_acng/mgrote.acng}/templates/acng.conf (100%) rename {roles/_mgrote.musterrolle => friedhof/mgrote_acng/mgrote.acng}/templates/security.conf (100%) create mode 100644 friedhof/mgrote_acng/tasks/main.yml rename {roles/mgrote.acng => friedhof/mgrote_acng}/templates/acng.conf (100%) rename {roles/mgrote.acng => friedhof/mgrote_acng}/templates/security.conf (100%) rename {roles/mgrote.acng => friedhof/mgrote_alacritty}/LICENSE (100%) rename {roles/mgrote.alacritty => friedhof/mgrote_alacritty}/README.md (100%) create mode 100644 friedhof/mgrote_alacritty/defaults/main.yml rename {roles => friedhof/mgrote_alacritty}/mgrote.alacritty/LICENSE (100%) create mode 100644 friedhof/mgrote_alacritty/mgrote.alacritty/README.md create mode 100644 friedhof/mgrote_alacritty/mgrote.alacritty/defaults/main.yml create mode 100644 friedhof/mgrote_alacritty/mgrote.alacritty/tasks/main.yml create mode 100644 friedhof/mgrote_alacritty/tasks/main.yml rename {roles/mgrote.apcupsd => friedhof/mgrote_apcupsd}/LICENSE (100%) rename {roles/mgrote.apcupsd => friedhof/mgrote_apcupsd}/README.md (100%) create mode 100644 friedhof/mgrote_apcupsd/defaults/main.yml create mode 100644 friedhof/mgrote_apcupsd/handlers/main.yml create mode 100644 friedhof/mgrote_apcupsd/meta/main.yml rename {roles/mgrote.cv4pve-autosnap => friedhof/mgrote_apcupsd/mgrote.apcupsd}/LICENSE (100%) create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/README.md create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/defaults/main.yml create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/handlers/main.yml create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/meta/main.yml create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/main.yml create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/master.yml create mode 100644 friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/slave.yml rename {roles => friedhof/mgrote_apcupsd}/mgrote.apcupsd/templates/apccontrol.save (100%) rename {roles => friedhof/mgrote_apcupsd}/mgrote.apcupsd/templates/apcupsd (100%) rename {roles => friedhof/mgrote_apcupsd}/mgrote.apcupsd/templates/master_apcupsd.conf (100%) rename {roles => friedhof/mgrote_apcupsd}/mgrote.apcupsd/templates/slave_apcupsd.conf (100%) create mode 100644 friedhof/mgrote_apcupsd/tasks/main.yml create mode 100644 friedhof/mgrote_apcupsd/tasks/master.yml create mode 100644 friedhof/mgrote_apcupsd/tasks/slave.yml create mode 100644 friedhof/mgrote_apcupsd/templates/apccontrol.save create mode 100644 friedhof/mgrote_apcupsd/templates/apcupsd create mode 100644 friedhof/mgrote_apcupsd/templates/master_apcupsd.conf create mode 100644 friedhof/mgrote_apcupsd/templates/slave_apcupsd.conf rename {roles/mgrote.disable_oom_killer => friedhof/mgrote_dnsmasq_adblocker}/LICENSE (100%) rename {roles/mgrote.dnsmasq_adblocker => friedhof/mgrote_dnsmasq_adblocker}/README.md (100%) create mode 100644 friedhof/mgrote_dnsmasq_adblocker/defaults/main.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/handlers/main.yml rename {roles => friedhof/mgrote_dnsmasq_adblocker}/mgrote.dnsmasq_adblocker/LICENSE (100%) create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/README.md create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/defaults/main.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/handlers/main.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/blocklist.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/config.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/install.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/main.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/services.yml rename {roles => friedhof/mgrote_dnsmasq_adblocker}/mgrote.dnsmasq_adblocker/templates/dnsmasq.conf.j2 (100%) rename {roles => friedhof/mgrote_dnsmasq_adblocker}/mgrote.dnsmasq_adblocker/templates/logrotate.j2 (100%) rename {roles => friedhof/mgrote_dnsmasq_adblocker}/mgrote.dnsmasq_adblocker/templates/resolv.conf.j2 (100%) create mode 100644 friedhof/mgrote_dnsmasq_adblocker/tasks/blocklist.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/tasks/config.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/tasks/install.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/tasks/main.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/tasks/services.yml create mode 100644 friedhof/mgrote_dnsmasq_adblocker/templates/dnsmasq.conf.j2 rename roles/_mgrote.musterrolle/templates/logrotate_restic => friedhof/mgrote_dnsmasq_adblocker/templates/logrotate.j2 (62%) create mode 100644 friedhof/mgrote_dnsmasq_adblocker/templates/resolv.conf.j2 rename {roles/mgrote.docker-compose-deploy => friedhof/mgrote_docker_compose_deploy}/LICENSE (100%) rename {roles/mgrote.docker-compose-deploy => friedhof/mgrote_docker_compose_deploy}/README.md (100%) create mode 100644 friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-down.yml create mode 100644 friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-up.yml create mode 100644 friedhof/mgrote_docker_compose_deploy/tasks/main.yml rename {roles/mgrote.docker-compose-inline => friedhof/mgrote_i3}/LICENSE (100%) rename {roles/mgrote.dokuwiki => friedhof/mgrote_i3/mgrote.i3}/LICENSE (100%) rename {roles => friedhof/mgrote_i3}/mgrote.i3/readme.md (100%) create mode 100644 friedhof/mgrote_i3/mgrote.i3/tasks/main.yml create mode 100644 friedhof/mgrote_i3/readme.md create mode 100644 friedhof/mgrote_i3/tasks/main.yml rename {roles/mgrote.dotfiles => friedhof/mgrote_minio}/LICENSE (100%) rename {roles/mgrote.minio => friedhof/mgrote_minio}/README.md (100%) create mode 100644 friedhof/mgrote_minio/defaults/main.yml create mode 100644 friedhof/mgrote_minio/handlers/main.yml rename {roles/mgrote.exa => friedhof/mgrote_minio/mgrote.minio}/LICENSE (100%) create mode 100644 friedhof/mgrote_minio/mgrote.minio/README.md create mode 100644 friedhof/mgrote_minio/mgrote.minio/defaults/main.yml create mode 100644 friedhof/mgrote_minio/mgrote.minio/handlers/main.yml create mode 100644 friedhof/mgrote_minio/mgrote.minio/tasks/main.yml rename {roles => friedhof/mgrote_minio}/mgrote.minio/templates/default.j2 (100%) rename {roles => friedhof/mgrote_minio}/mgrote.minio/templates/minio.service.j2 (100%) create mode 100644 friedhof/mgrote_minio/tasks/main.yml create mode 100644 friedhof/mgrote_minio/templates/default.j2 create mode 100644 friedhof/mgrote_minio/templates/minio.service.j2 rename {roles/mgrote.motd => friedhof/mgrote_motd}/README.md (100%) create mode 100644 friedhof/mgrote_motd/defaults/main.yml create mode 100644 friedhof/mgrote_motd/handlers/main.yml create mode 100644 friedhof/mgrote_motd/tasks/base.yml create mode 100644 friedhof/mgrote_motd/tasks/fortune.yml create mode 100644 friedhof/mgrote_motd/tasks/main.yml create mode 100644 friedhof/mgrote_motd/tasks/systemctl.yml create mode 100644 friedhof/mgrote_motd/tasks/weather.yml rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/00-ansible-mgrote (100%) rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/05-fortune-mgrote (100%) rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/10-wetter-mgrote (100%) rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/20-facts-mgrote (100%) rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/90-updates-mgrote (100%) rename {roles/mgrote.motd => friedhof/mgrote_motd}/templates/91-reboot-mgrote (100%) create mode 100644 friedhof/mgrote_munin_node/defaults/main.yml create mode 100644 friedhof/mgrote_munin_node/handlers/main.yml rename {roles/mgrote.munin-node => friedhof/mgrote_munin_node}/readme.md (100%) create mode 100644 friedhof/mgrote_munin_node/tasks/additional.yml create mode 100644 friedhof/mgrote_munin_node/tasks/install.yml create mode 100644 friedhof/mgrote_munin_node/tasks/main.yml create mode 100644 friedhof/mgrote_munin_node/tasks/remove.yml create mode 100644 friedhof/mgrote_munin_node/tasks/user.yml rename {roles/mgrote.munin-node => friedhof/mgrote_munin_node}/templates/munin-node.conf.j2 (100%) rename {roles/mgrote.fail2ban => friedhof/mgrote_ntp_chrony_server}/LICENSE (100%) rename {roles/mgrote.ntp_chrony_server => friedhof/mgrote_ntp_chrony_server}/README.md (100%) create mode 100644 friedhof/mgrote_ntp_chrony_server/defaults/main.yml create mode 100644 friedhof/mgrote_ntp_chrony_server/handlers/main.yml rename {roles/mgrote.fluxcd => friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server}/LICENSE (100%) create mode 100644 friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/README.md create mode 100644 friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/defaults/main.yml create mode 100644 friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/handlers/main.yml create mode 100644 friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/tasks/main.yml rename {roles => friedhof/mgrote_ntp_chrony_server}/mgrote.ntp_chrony_server/templates/chrony.conf.j2 (100%) rename {roles/mgrote.ntp_chrony_client => friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server}/templates/logrotate_chrony (100%) create mode 100644 friedhof/mgrote_ntp_chrony_server/tasks/main.yml create mode 100644 friedhof/mgrote_ntp_chrony_server/templates/chrony.conf.j2 rename {roles/mgrote.ntp_chrony_server => friedhof/mgrote_ntp_chrony_server}/templates/logrotate_chrony (100%) rename {roles/mgrote.fwupd_settings => friedhof/mgrote_polybar}/LICENSE (100%) create mode 100644 friedhof/mgrote_polybar/defaults/main.yml rename {roles/mgrote.i3 => friedhof/mgrote_polybar/mgrote.polybar}/LICENSE (100%) create mode 100644 friedhof/mgrote_polybar/mgrote.polybar/defaults/main.yml rename {roles => friedhof/mgrote_polybar}/mgrote.polybar/readme.md (100%) create mode 100644 friedhof/mgrote_polybar/mgrote.polybar/tasks/main.yml create mode 100644 friedhof/mgrote_polybar/readme.md create mode 100644 friedhof/mgrote_polybar/tasks/main.yml rename {roles/mgrote.k8s_autocompletion => friedhof/mgrote_r8152_kernel_module}/LICENSE (100%) rename {roles/mgrote.r8152_kernel_module => friedhof/mgrote_r8152_kernel_module}/README.md (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module/defaults/main.yml rename {roles/mgrote.r8152_kernel_module => friedhof/mgrote_r8152_kernel_module}/files/r8125-dkms_9.004.01.tar.gz (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module/meta/main.yml rename {roles/mgrote.k8s_misc => friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module}/LICENSE (100%) rename {roles/mgrote.r8152_kernel_module_on_off => friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module}/README.md (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/defaults/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/meta/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/assert.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/dkms.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/doing.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/tasks/assert.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/tasks/dkms.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/tasks/doing.yml create mode 100644 friedhof/mgrote_r8152_kernel_module/tasks/main.yml rename {roles/mgrote.minio => friedhof/mgrote_r8152_kernel_module_on_off}/LICENSE (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/README.md create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/defaults/main.yml rename {roles/mgrote.r8152_kernel_module_on_off => friedhof/mgrote_r8152_kernel_module_on_off}/files/r8152.53.56-2.15.0.tar.bz2 (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/meta/main.yml rename {roles/mgrote.motd => friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off}/LICENSE (100%) create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/README.md create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/defaults/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/meta/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/doing.yml create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/main.yml create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/tasks/doing.yml create mode 100644 friedhof/mgrote_r8152_kernel_module_on_off/tasks/main.yml rename {roles/mgrote.mount_cifs => friedhof/mgrote_supermicro_fan_control}/LICENSE (100%) rename {roles/mgrote.supermicro_fan_control => friedhof/mgrote_supermicro_fan_control}/README.md (100%) create mode 100644 friedhof/mgrote_supermicro_fan_control/handlers/main.yml rename {roles/mgrote.munin-node => friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control}/LICENSE (100%) create mode 100644 friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/README.md create mode 100644 friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/handlers/main.yml rename {roles => friedhof/mgrote_supermicro_fan_control}/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png (100%) rename {roles => friedhof/mgrote_supermicro_fan_control}/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png (100%) create mode 100644 friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/tasks/main.yml rename {roles => friedhof/mgrote_supermicro_fan_control}/mgrote.supermicro_fan_control/templates/sm_fan_control.service.j2 (100%) rename {roles => friedhof/mgrote_supermicro_fan_control}/mgrote.supermicro_fan_control/templates/sm_fan_control.timer.j2 (100%) create mode 100644 friedhof/mgrote_supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png create mode 100644 friedhof/mgrote_supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png create mode 100644 friedhof/mgrote_supermicro_fan_control/tasks/main.yml create mode 100644 friedhof/mgrote_supermicro_fan_control/templates/sm_fan_control.service.j2 rename roles/_mgrote.musterrolle_systemd/templates/rclone.timer.j2 => friedhof/mgrote_supermicro_fan_control/templates/sm_fan_control.timer.j2 (51%) rename {roles/mgrote.ntp_chrony_client => friedhof/mgrote_systemd_timesyncd}/LICENSE (100%) rename {roles/mgrote.systemd-timesyncd => friedhof/mgrote_systemd_timesyncd}/README.md (100%) create mode 100644 friedhof/mgrote_systemd_timesyncd/defaults/main.yml create mode 100644 friedhof/mgrote_systemd_timesyncd/handlers/main.yml create mode 100644 friedhof/mgrote_systemd_timesyncd/tasks/main.yml rename {roles/mgrote.systemd-timesyncd => friedhof/mgrote_systemd_timesyncd}/templates/timesyncd.conf.j2 (100%) rename {roles/mgrote.ntp_chrony_server => friedhof/mgrote_timeshift}/LICENSE (100%) rename {roles/mgrote.timeshift => friedhof/mgrote_timeshift}/README.md (100%) create mode 100644 friedhof/mgrote_timeshift/handlers/main.yml rename {roles/mgrote.pbs_datastores => friedhof/mgrote_timeshift/mgrote.timeshift}/LICENSE (100%) create mode 100644 friedhof/mgrote_timeshift/mgrote.timeshift/README.md create mode 100644 friedhof/mgrote_timeshift/mgrote.timeshift/handlers/main.yml create mode 100644 friedhof/mgrote_timeshift/mgrote.timeshift/tasks/main.yml rename {roles => friedhof/mgrote_timeshift}/mgrote.timeshift/templates/timeshift.json (100%) create mode 100644 friedhof/mgrote_timeshift/tasks/main.yml create mode 100644 friedhof/mgrote_timeshift/templates/timeshift.json rename {roles/mgrote.pbs_pve_integration => friedhof/mgrote_tor_node}/LICENSE (100%) rename {roles/mgrote.tor-node => friedhof/mgrote_tor_node}/README.md (100%) create mode 100644 friedhof/mgrote_tor_node/defaults/main.yml create mode 100644 friedhof/mgrote_tor_node/handlers/main.yml create mode 100644 friedhof/mgrote_tor_node/tasks/bridge.yml create mode 100644 friedhof/mgrote_tor_node/tasks/main.yml create mode 100644 friedhof/mgrote_tor_node/tasks/nyx.yml create mode 100644 friedhof/mgrote_tor_node/tasks/relay.yml rename {roles/mgrote.tor-node => friedhof/mgrote_tor_node}/templates/bridge_torrc (100%) rename {roles/mgrote.tor-node => friedhof/mgrote_tor_node}/templates/relay_torrc (100%) rename {roles/mgrote.pbs_users => friedhof/mgrote_xnview}/LICENSE (100%) rename {roles/mgrote.xnview => friedhof/mgrote_xnview}/README.md (100%) create mode 100644 friedhof/mgrote_xnview/defaults/main.yml rename {roles/mgrote.polybar => friedhof/mgrote_xnview/mgrote.xnview}/LICENSE (100%) create mode 100644 friedhof/mgrote_xnview/mgrote.xnview/README.md create mode 100644 friedhof/mgrote_xnview/mgrote.xnview/defaults/main.yml create mode 100644 friedhof/mgrote_xnview/mgrote.xnview/tasks/main.yml create mode 100644 friedhof/mgrote_xnview/tasks/main.yml rename {roles/mgrote.postfix => friedhof/mgrote_xrdp}/LICENSE (100%) rename {roles/mgrote.xrdp => friedhof/mgrote_xrdp}/README.md (100%) rename {roles/mgrote.proxmox_bind_mounts => friedhof/mgrote_xrdp/mgrote.xrdp}/LICENSE (100%) create mode 100644 friedhof/mgrote_xrdp/mgrote.xrdp/README.md create mode 100644 friedhof/mgrote_xrdp/mgrote.xrdp/tasks/main.yml create mode 100644 friedhof/mgrote_xrdp/tasks/main.yml rename {roles/mgrote.proxmox_lxc_profiles => friedhof/mgrote_zswap}/LICENSE (100%) rename {roles/mgrote.zswap => friedhof/mgrote_zswap}/README.md (100%) create mode 100644 friedhof/mgrote_zswap/defaults/main.yml rename {roles/mgrote.qemu_guest_agent => friedhof/mgrote_zswap/mgrote.zswap}/LICENSE (100%) create mode 100644 friedhof/mgrote_zswap/mgrote.zswap/README.md create mode 100644 friedhof/mgrote_zswap/mgrote.zswap/defaults/main.yml create mode 100644 friedhof/mgrote_zswap/mgrote.zswap/tasks/main.yml create mode 100644 friedhof/mgrote_zswap/tasks/main.yml delete mode 100644 group_vars/laptop.yml delete mode 100644 inventory_laptop delete mode 100644 playbooks/3_service/acng.yml delete mode 100644 playbooks/3_service/dnsmasq.yml delete mode 100644 playbooks/3_service/laptop.yml delete mode 100644 playbooks/3_service/nfs.yml delete mode 100644 playbooks/base/motd.yml delete mode 100644 playbooks/on-off/activate_ssh_password_login.yml delete mode 100644 playbooks/on-off/apt_autoremove.yml delete mode 100644 playbooks/on-off/apt_update.yml delete mode 100644 playbooks/on-off/delete_old_upgrades_config.yml delete mode 100644 playbooks/on-off/delete_ssh.yml delete mode 100644 playbooks/on-off/f2b.yml delete mode 100644 playbooks/on-off/remove_chrony.yml delete mode 100644 playbooks/on-off/remove_cowsay.yml delete mode 100644 playbooks/on-off/remove_dotfiles_dir.yml delete mode 100644 playbooks/on-off/remove_ipmitool.yml delete mode 100644 playbooks/on-off/remove_munin_node.yml delete mode 100644 playbooks/on-off/remove_ntpd.yml delete mode 100644 playbooks/on-off/remove_old_restic_config.yml delete mode 100644 playbooks/on-off/remove_old_restic_cronjob.yml delete mode 100644 playbooks/on-off/remove_sanoid.yml delete mode 100644 playbooks/on-off/remove_telegraf.yml delete mode 100644 playbooks/on-off/repair_syslog.yml delete mode 100644 playbooks/on-off/root_bash.yml delete mode 100644 playbooks/on-off/rsyslog_template delete mode 100644 playbooks/on-off/set_dns_resolver.yml delete mode 100644 playbooks/on-off/set_id0.yml delete mode 100644 playbooks/on-off/set_password_mg.yml delete mode 100644 playbooks/on-off/set_r8152_driver.yml delete mode 100644 roles/_mgrote.musterrolle/defaults/main.yml delete mode 100644 roles/_mgrote.musterrolle/handlers/main.yml delete mode 100644 roles/_mgrote.musterrolle/tasks/main.yml delete mode 100644 roles/_mgrote.musterrolle/tasks/user.yml delete mode 100644 roles/_mgrote.musterrolle_systemd/README.md delete mode 100644 roles/_mgrote.musterrolle_systemd/defaults/main.yml delete mode 100644 roles/_mgrote.musterrolle_systemd/handlers/main.yml delete mode 100644 roles/_mgrote.musterrolle_systemd/tasks/main.yml delete mode 100644 roles/_mgrote.musterrolle_systemd/templates/rclone.service.j2 delete mode 100644 roles/_mgrote.musterrolle_systemd/templates/rclone_mail@.service.j2 delete mode 100644 roles/mgrote.acng/defaults/main.yml delete mode 100644 roles/mgrote.acng/handlers/main.yml delete mode 100644 roles/mgrote.acng/tasks/main.yml delete mode 100644 roles/mgrote.alacritty/defaults/main.yml delete mode 100644 roles/mgrote.alacritty/tasks/main.yml delete mode 100644 roles/mgrote.apcupsd/defaults/main.yml delete mode 100644 roles/mgrote.apcupsd/handlers/main.yml delete mode 100644 roles/mgrote.apcupsd/meta/main.yml delete mode 100644 roles/mgrote.apcupsd/tasks/main.yml delete mode 100644 roles/mgrote.apcupsd/tasks/master.yml delete mode 100644 roles/mgrote.apcupsd/tasks/slave.yml delete mode 100644 roles/mgrote.apt_manage_packages/defaults/main.yml delete mode 100644 roles/mgrote.apt_manage_packages/tasks/main.yml delete mode 100644 roles/mgrote.apt_manage_sources/handlers/main.yml delete mode 100644 roles/mgrote.apt_update_packages/tasks/main.yml delete mode 100644 roles/mgrote.cv4pve-autosnap/defaults/main.yml delete mode 100644 roles/mgrote.cv4pve-autosnap/handlers/main.yml delete mode 100644 roles/mgrote.cv4pve-autosnap/tasks/main.yml delete mode 100644 roles/mgrote.cv4pve-autosnap/tasks/user.yml delete mode 100644 roles/mgrote.deactivate_caps/handlers/main.yml delete mode 100644 roles/mgrote.deactivate_caps/tasks/main.yml delete mode 100644 roles/mgrote.disable_oom_killer/tasks/main.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/defaults/main.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/handlers/main.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/tasks/blocklist.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/tasks/config.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/tasks/install.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/tasks/main.yml delete mode 100644 roles/mgrote.dnsmasq_adblocker/tasks/services.yml delete mode 100644 roles/mgrote.docker-compose-deploy/tasks/dockercompose-down.yml delete mode 100644 roles/mgrote.docker-compose-deploy/tasks/dockercompose-up.yml delete mode 100644 roles/mgrote.docker-compose-deploy/tasks/main.yml delete mode 100644 roles/mgrote.docker-compose-inline/defaults/main.yml delete mode 100644 roles/mgrote.docker-compose-inline/tasks/main.yml delete mode 100644 roles/mgrote.dokuwiki/defaults/main.yml delete mode 100644 roles/mgrote.dokuwiki/handlers/main.yml delete mode 100644 roles/mgrote.dokuwiki/meta/main.yml delete mode 100644 roles/mgrote.dokuwiki/tasks/apache2.yml delete mode 100644 roles/mgrote.dokuwiki/tasks/dokuwiki.yml delete mode 100644 roles/mgrote.dokuwiki/tasks/install.yml delete mode 100644 roles/mgrote.dokuwiki/tasks/main.yml delete mode 100644 roles/mgrote.dotfiles/defaults/main.yml delete mode 100644 roles/mgrote.dotfiles/tasks/main.yml delete mode 100644 roles/mgrote.exa/defaults/main.yml delete mode 100644 roles/mgrote.exa/tasks/main.yml delete mode 100644 roles/mgrote.fail2ban/defaults/main.yml delete mode 100644 roles/mgrote.fail2ban/handlers/main.yml delete mode 100644 roles/mgrote.fail2ban/meta/main.yml delete mode 100644 roles/mgrote.fail2ban/tasks/main.yml delete mode 100644 roles/mgrote.fileserver_smb/defaults/main.yml delete mode 100644 roles/mgrote.fileserver_smb/handlers/main.yml delete mode 100644 roles/mgrote.fileserver_smb/tasks/main.yml delete mode 100644 roles/mgrote.fileserver_smb/tasks/packages.yml delete mode 100644 roles/mgrote.fileserver_smb/tasks/shares.yml delete mode 100644 roles/mgrote.fileserver_smb/tasks/users.yml delete mode 100644 roles/mgrote.fluxcd/defaults/main.yml delete mode 100644 roles/mgrote.fluxcd/tasks/main.yml delete mode 100644 roles/mgrote.fluxcd/tasks/user.yml delete mode 100644 roles/mgrote.fwupd_settings/defaults/main.yml delete mode 100644 roles/mgrote.fwupd_settings/handlers/main.yml delete mode 100644 roles/mgrote.fwupd_settings/tasks/main.yml delete mode 100644 roles/mgrote.i3/tasks/main.yml delete mode 100644 roles/mgrote.k8s_autocompletion/tasks/main.yml delete mode 100644 roles/mgrote.k8s_misc/tasks/main.yml delete mode 100644 roles/mgrote.minio/defaults/main.yml delete mode 100644 roles/mgrote.minio/handlers/main.yml delete mode 100644 roles/mgrote.minio/tasks/main.yml delete mode 100644 roles/mgrote.motd/defaults/main.yml delete mode 100644 roles/mgrote.motd/handlers/main.yml delete mode 100644 roles/mgrote.motd/tasks/base.yml delete mode 100644 roles/mgrote.motd/tasks/fortune.yml delete mode 100644 roles/mgrote.motd/tasks/main.yml delete mode 100644 roles/mgrote.motd/tasks/systemctl.yml delete mode 100644 roles/mgrote.motd/tasks/weather.yml delete mode 100644 roles/mgrote.mount_cifs/defaults/main.yml delete mode 100644 roles/mgrote.mount_cifs/handlers/main.yml delete mode 100644 roles/mgrote.mount_cifs/meta/main.yml delete mode 100644 roles/mgrote.mount_cifs/tasks/main.yml delete mode 100644 roles/mgrote.munin-node/defaults/main.yml delete mode 100644 roles/mgrote.munin-node/handlers/main.yml delete mode 100644 roles/mgrote.munin-node/tasks/additional.yml delete mode 100644 roles/mgrote.munin-node/tasks/install.yml delete mode 100644 roles/mgrote.munin-node/tasks/main.yml delete mode 100644 roles/mgrote.munin-node/tasks/remove.yml delete mode 100644 roles/mgrote.munin-node/tasks/user.yml delete mode 100644 roles/mgrote.ntp_chrony_client/defaults/main.yml delete mode 100644 roles/mgrote.ntp_chrony_client/handlers/main.yml delete mode 100644 roles/mgrote.ntp_chrony_client/tasks/main.yml delete mode 100644 roles/mgrote.ntp_chrony_server/defaults/main.yml delete mode 100644 roles/mgrote.ntp_chrony_server/handlers/main.yml delete mode 100644 roles/mgrote.ntp_chrony_server/tasks/main.yml delete mode 100644 roles/mgrote.pbs_datastores/tasks/main.yml delete mode 100644 roles/mgrote.pbs_pve_integration/tasks/main.yml delete mode 100644 roles/mgrote.pbs_users/tasks/main.yml delete mode 100644 roles/mgrote.polybar/defaults/main.yml delete mode 100644 roles/mgrote.polybar/tasks/main.yml delete mode 100644 roles/mgrote.postfix/defaults/main.yml delete mode 100644 roles/mgrote.postfix/handlers/main.yml delete mode 100644 roles/mgrote.postfix/tasks/main.yml delete mode 100644 roles/mgrote.proxmox_bind_mounts/defaults/main.yml delete mode 100644 roles/mgrote.proxmox_bind_mounts/handlers/main.yml delete mode 100644 roles/mgrote.proxmox_bind_mounts/tasks/bm.yml delete mode 100644 roles/mgrote.proxmox_bind_mounts/tasks/main.yml delete mode 100644 roles/mgrote.proxmox_lxc_profiles/defaults/main.yml delete mode 100644 roles/mgrote.proxmox_lxc_profiles/handlers/main.yml delete mode 100644 roles/mgrote.proxmox_lxc_profiles/tasks/main.yml delete mode 100644 roles/mgrote.proxmox_lxc_profiles/tasks/profile.yml delete mode 100644 roles/mgrote.qemu_guest_agent/handlers/main.yml delete mode 100644 roles/mgrote.qemu_guest_agent/tasks/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module/LICENSE delete mode 100644 roles/mgrote.r8152_kernel_module/defaults/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module/meta/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module/tasks/assert.yml delete mode 100644 roles/mgrote.r8152_kernel_module/tasks/dkms.yml delete mode 100644 roles/mgrote.r8152_kernel_module/tasks/doing.yml delete mode 100644 roles/mgrote.r8152_kernel_module/tasks/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module_on_off/LICENSE delete mode 100644 roles/mgrote.r8152_kernel_module_on_off/defaults/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module_on_off/meta/main.yml delete mode 100644 roles/mgrote.r8152_kernel_module_on_off/tasks/doing.yml delete mode 100644 roles/mgrote.r8152_kernel_module_on_off/tasks/main.yml delete mode 100644 roles/mgrote.rclone/LICENSE delete mode 100644 roles/mgrote.rclone/README.md delete mode 100644 roles/mgrote.rclone/defaults/main.yml delete mode 100644 roles/mgrote.rclone/handlers/main.yml delete mode 100644 roles/mgrote.rclone/tasks/main.yml delete mode 100644 roles/mgrote.rclone/templates/rclone.service.j2 delete mode 100644 roles/mgrote.rclone/templates/rclone.timer.j2 delete mode 100644 roles/mgrote.rclone/templates/rclone_mail@.service.j2 delete mode 100644 roles/mgrote.remove_snapd/LICENSE delete mode 100644 roles/mgrote.remove_snapd/tasks/main.yml delete mode 100644 roles/mgrote.restic/LICENSE delete mode 100644 roles/mgrote.restic/defaults/main.yml delete mode 100644 roles/mgrote.restic/handlers/main.yml delete mode 100644 roles/mgrote.restic/tasks/main.yml delete mode 100644 roles/mgrote.sealed-secrets/LICENSE delete mode 100644 roles/mgrote.sealed-secrets/defaults/main.yml delete mode 100644 roles/mgrote.sealed-secrets/tasks/import.yml delete mode 100644 roles/mgrote.sealed-secrets/tasks/main.yml delete mode 100644 roles/mgrote.sealed-secrets/tasks/user.yml delete mode 100644 roles/mgrote.set_permissions/LICENSE delete mode 100644 roles/mgrote.smart/LICENSE delete mode 100644 roles/mgrote.smart/defaults/main.yml delete mode 100644 roles/mgrote.smart/handlers/main.yml delete mode 100644 roles/mgrote.smart/meta/main.yml delete mode 100644 roles/mgrote.smart/tasks/main.yml delete mode 100644 roles/mgrote.smart/tasks/user.yml delete mode 100644 roles/mgrote.ssh/LICENSE delete mode 100644 roles/mgrote.ssh/handlers/main.yml delete mode 100644 roles/mgrote.ssh/tasks/main.yml delete mode 100644 roles/mgrote.ssh/tasks/pve.yml delete mode 100644 roles/mgrote.ssh/tasks/ubuntu.yml delete mode 100644 roles/mgrote.ssh/vars/pve.yml delete mode 100644 roles/mgrote.ssh/vars/ubuntu.yml delete mode 100644 roles/mgrote.supermicro_fan_control/LICENSE delete mode 100644 roles/mgrote.supermicro_fan_control/handlers/main.yml delete mode 100644 roles/mgrote.supermicro_fan_control/tasks/main.yml delete mode 100644 roles/mgrote.systemd-resolved/handlers/main.yml delete mode 100644 roles/mgrote.systemd-resolved/tasks/main.yml delete mode 100644 roles/mgrote.systemd-timesyncd/LICENSE delete mode 100644 roles/mgrote.systemd-timesyncd/defaults/main.yml delete mode 100644 roles/mgrote.systemd-timesyncd/handlers/main.yml delete mode 100644 roles/mgrote.systemd-timesyncd/tasks/main.yml delete mode 100644 roles/mgrote.timeshift/LICENSE delete mode 100644 roles/mgrote.timeshift/handlers/main.yml delete mode 100644 roles/mgrote.timeshift/tasks/main.yml delete mode 100644 roles/mgrote.tor-node/LICENSE delete mode 100644 roles/mgrote.tor-node/defaults/main.yml delete mode 100644 roles/mgrote.tor-node/handlers/main.yml delete mode 100644 roles/mgrote.tor-node/tasks/bridge.yml delete mode 100644 roles/mgrote.tor-node/tasks/main.yml delete mode 100644 roles/mgrote.tor-node/tasks/nyx.yml delete mode 100644 roles/mgrote.tor-node/tasks/relay.yml delete mode 100644 roles/mgrote.users/LICENSE delete mode 100644 roles/mgrote.users/tasks/main.yml delete mode 100644 roles/mgrote.vim/LICENSE delete mode 100644 roles/mgrote.vim/defaults/main.yml delete mode 100644 roles/mgrote.vim/tasks/main.yml delete mode 100644 roles/mgrote.xnview/LICENSE delete mode 100644 roles/mgrote.xnview/defaults/main.yml delete mode 100644 roles/mgrote.xnview/tasks/main.yml delete mode 100644 roles/mgrote.xrdp/LICENSE delete mode 100644 roles/mgrote.xrdp/tasks/main.yml delete mode 100644 roles/mgrote.youtubedl/LICENSE delete mode 100644 roles/mgrote.youtubedl/handlers/main.yml delete mode 100644 roles/mgrote.youtubedl/tasks/main.yml delete mode 100644 roles/mgrote.zfs_arc_mem/LICENSE delete mode 100644 roles/mgrote.zfs_arc_mem/defaults/main.yml delete mode 100644 roles/mgrote.zfs_arc_mem/tasks/main.yml delete mode 100644 roles/mgrote.zfs_health/LICENSE delete mode 100644 roles/mgrote.zfs_health/defaults/main.yml delete mode 100644 roles/mgrote.zfs_health/tasks/main.yml delete mode 100644 roles/mgrote.zfs_health/tasks/user.yml delete mode 100644 roles/mgrote.zfs_manage_datasets/LICENSE delete mode 100644 roles/mgrote.zfs_manage_datasets/meta/main.yml delete mode 100644 roles/mgrote.zfs_manage_datasets/tasks/main.yml delete mode 100644 roles/mgrote.zfs_packages/LICENSE delete mode 100644 roles/mgrote.zfs_packages/tasks/main.yml delete mode 100644 roles/mgrote.zfs_sanoid/LICENSE delete mode 100644 roles/mgrote.zfs_sanoid/handlers/main.yml delete mode 100644 roles/mgrote.zfs_sanoid/tasks/destination.yml delete mode 100644 roles/mgrote.zfs_sanoid/tasks/main.yml delete mode 100644 roles/mgrote.zfs_sanoid/tasks/snaps.yml delete mode 100644 roles/mgrote.zfs_sanoid/tasks/source.yml delete mode 100644 roles/mgrote.zfs_sanoid/tasks/user.yml delete mode 100644 roles/mgrote.zfs_scrub/LICENSE delete mode 100644 roles/mgrote.zfs_scrub/defaults/main.yml delete mode 100644 roles/mgrote.zfs_scrub/tasks/main.yml delete mode 100644 roles/mgrote.zfs_zed/LICENSE delete mode 100644 roles/mgrote.zfs_zed/handlers/main.yml delete mode 100644 roles/mgrote.zfs_zed/tasks/main.yml delete mode 100644 roles/mgrote.zswap/LICENSE delete mode 100644 roles/mgrote.zswap/defaults/main.yml delete mode 100644 roles/mgrote.zswap/tasks/main.yml rename roles/{mgrote.apt_manage_packages => mgrote_apt_manage_packages}/README.md (100%) create mode 100644 roles/mgrote_apt_manage_packages/defaults/main.yml create mode 100644 roles/mgrote_apt_manage_packages/tasks/main.yml rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/README.md (100%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/defaults/main.yml (100%) create mode 100644 roles/mgrote_apt_manage_sources/handlers/main.yml rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/tasks/main.yml (96%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/tasks/pbs.yml (82%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/tasks/pve.yml (79%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/templates/sources.j2 (100%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/vars/mint.yml (100%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/vars/pbs.yaml (100%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/vars/pve.yaml (100%) rename roles/{mgrote.apt_manage_sources => mgrote_apt_manage_sources}/vars/ubuntu.yaml (100%) rename roles/{mgrote.apt_update_packages => mgrote_apt_update_packages}/README.md (100%) create mode 100644 roles/mgrote_apt_update_packages/tasks/main.yml rename roles/{mgrote.cv4pve-autosnap => mgrote_cv4pve_autosnap}/README.md (100%) create mode 100644 roles/mgrote_cv4pve_autosnap/defaults/main.yml create mode 100644 roles/mgrote_cv4pve_autosnap/handlers/main.yml create mode 100644 roles/mgrote_cv4pve_autosnap/tasks/main.yml create mode 100644 roles/mgrote_cv4pve_autosnap/tasks/user.yml rename roles/{mgrote.cv4pve-autosnap => mgrote_cv4pve_autosnap}/templates/cv4pve.service.j2 (100%) rename roles/{mgrote.cv4pve-autosnap => mgrote_cv4pve_autosnap}/templates/cv4pve.timer.j2 (100%) rename roles/{mgrote.cv4pve-autosnap => mgrote_cv4pve_autosnap}/templates/cv4pve_mail.service.j2 (100%) create mode 100644 roles/mgrote_deactivate_caps/handlers/main.yml rename roles/{mgrote.deactivate_caps => mgrote_deactivate_caps}/readme.md (100%) create mode 100644 roles/mgrote_deactivate_caps/tasks/main.yml rename roles/{mgrote.disable_oom_killer => mgrote_disable_oom_killer}/README.md (100%) create mode 100644 roles/mgrote_disable_oom_killer/handlers/main.yml create mode 100644 roles/mgrote_disable_oom_killer/tasks/main.yml rename roles/{mgrote.docker-compose-inline => mgrote_docker_compose_inline}/README.md (100%) create mode 100644 roles/mgrote_docker_compose_inline/defaults/main.yml create mode 100644 roles/mgrote_docker_compose_inline/tasks/main.yml rename roles/{mgrote.dokuwiki => mgrote_dokuwiki}/README.md (100%) create mode 100644 roles/mgrote_dokuwiki/defaults/main.yml create mode 100644 roles/mgrote_dokuwiki/handlers/main.yml create mode 100644 roles/mgrote_dokuwiki/tasks/apache2.yml create mode 100644 roles/mgrote_dokuwiki/tasks/dokuwiki.yml create mode 100644 roles/mgrote_dokuwiki/tasks/install.yml create mode 100644 roles/mgrote_dokuwiki/tasks/main.yml rename roles/{mgrote.dokuwiki => mgrote_dokuwiki}/templates/000-default.conf (100%) rename roles/{mgrote.dokuwiki => mgrote_dokuwiki}/templates/apache2.conf (100%) rename roles/{mgrote.dotfiles => mgrote_dotfiles}/README.md (100%) create mode 100644 roles/mgrote_dotfiles/defaults/main.yml create mode 100644 roles/mgrote_dotfiles/handlers/main.yml create mode 100644 roles/mgrote_dotfiles/tasks/main.yml rename roles/{mgrote.exa => mgrote_exa}/README.md (100%) create mode 100644 roles/mgrote_exa/defaults/main.yml create mode 100644 roles/mgrote_exa/tasks/main.yml rename roles/{mgrote.fail2ban => mgrote_fail2ban}/README.md (100%) create mode 100644 roles/mgrote_fail2ban/defaults/main.yml create mode 100644 roles/mgrote_fail2ban/handlers/main.yml create mode 100644 roles/mgrote_fail2ban/tasks/main.yml rename roles/{mgrote.fail2ban => mgrote_fail2ban}/templates/jail.local (100%) rename roles/{mgrote.fail2ban => mgrote_fail2ban}/templates/sendmail-common.local (100%) rename roles/{mgrote.fileserver_smb => mgrote_fileserver_smb}/README.md (100%) create mode 100644 roles/mgrote_fileserver_smb/defaults/main.yml create mode 100644 roles/mgrote_fileserver_smb/handlers/main.yml create mode 100644 roles/mgrote_fileserver_smb/tasks/main.yml create mode 100644 roles/mgrote_fileserver_smb/tasks/packages.yml create mode 100644 roles/mgrote_fileserver_smb/tasks/shares.yml create mode 100644 roles/mgrote_fileserver_smb/tasks/users.yml rename roles/{mgrote.fileserver_smb => mgrote_fileserver_smb}/templates/smb.conf.j2 (100%) rename roles/{mgrote.fluxcd => mgrote_fluxcd}/README.md (100%) create mode 100644 roles/mgrote_fluxcd/defaults/main.yml create mode 100644 roles/mgrote_fluxcd/handlers/main.yml create mode 100644 roles/mgrote_fluxcd/tasks/main.yml create mode 100644 roles/mgrote_fluxcd/tasks/user.yml rename roles/{mgrote.fluxcd => mgrote_fluxcd}/templates/bootstrap.sh (100%) rename roles/{mgrote.fwupd_settings => mgrote_fwupd_settings}/README.md (100%) create mode 100644 roles/mgrote_fwupd_settings/defaults/main.yml create mode 100644 roles/mgrote_fwupd_settings/handlers/main.yml create mode 100644 roles/mgrote_fwupd_settings/tasks/main.yml rename roles/{mgrote.k8s_autocompletion => mgrote_k8s_autocompletion}/README.md (100%) create mode 100644 roles/mgrote_k8s_autocompletion/tasks/main.yml rename roles/{mgrote.k8s_misc => mgrote_k8s_misc}/README.md (100%) create mode 100644 roles/mgrote_k8s_misc/tasks/main.yml rename roles/{mgrote.mount_cifs => mgrote_mount_cifs}/README.md (100%) create mode 100644 roles/mgrote_mount_cifs/defaults/main.yml create mode 100644 roles/mgrote_mount_cifs/handlers/main.yml create mode 100644 roles/mgrote_mount_cifs/meta/main.yml create mode 100644 roles/mgrote_mount_cifs/tasks/main.yml rename roles/{mgrote.mount_cifs => mgrote_mount_cifs}/templates/smb_passwords (100%) rename roles/{mgrote.ntp_chrony_client => mgrote_ntp_chrony_client}/README.md (100%) create mode 100644 roles/mgrote_ntp_chrony_client/defaults/main.yml create mode 100644 roles/mgrote_ntp_chrony_client/handlers/main.yml create mode 100644 roles/mgrote_ntp_chrony_client/tasks/main.yml rename roles/{mgrote.ntp_chrony_client => mgrote_ntp_chrony_client}/templates/chrony.conf.j2 (100%) create mode 100644 roles/mgrote_ntp_chrony_client/templates/logrotate_chrony rename roles/{mgrote.pbs_datastores => mgrote_pbs_datastores}/defaults/main.yml (100%) create mode 100644 roles/mgrote_pbs_datastores/tasks/main.yml rename roles/{mgrote.pbs_datastores => mgrote_pbs_datastores}/templates/datastores.j2 (100%) rename roles/{mgrote.pbs_datastores => mgrote_pbs_datastores}/templates/permissions.j2 (100%) rename roles/{mgrote.pbs_datastores => mgrote_pbs_datastores}/templates/prune-jobs.j2 (100%) rename roles/{mgrote.pbs_pve_integration => mgrote_pbs_pve_integration}/defaults/main.yml (100%) create mode 100644 roles/mgrote_pbs_pve_integration/tasks/main.yml rename roles/{mgrote.pbs_users => mgrote_pbs_users}/defaults/main.yml (100%) create mode 100644 roles/mgrote_pbs_users/tasks/main.yml rename roles/{mgrote.postfix => mgrote_postfix}/README.md (100%) create mode 100644 roles/mgrote_postfix/defaults/main.yml create mode 100644 roles/mgrote_postfix/handlers/main.yml create mode 100644 roles/mgrote_postfix/tasks/main.yml rename roles/{mgrote.postfix => mgrote_postfix}/templates/main.cf (100%) rename roles/{mgrote.postfix => mgrote_postfix}/templates/sasl_passwd (100%) rename roles/{mgrote.postfix => mgrote_postfix}/templates/sender_canonical (100%) rename roles/{mgrote.proxmox_bind_mounts => mgrote_proxmox_bind_mounts}/README.md (93%) create mode 100644 roles/mgrote_proxmox_bind_mounts/defaults/main.yml create mode 100644 roles/mgrote_proxmox_bind_mounts/handlers/main.yml create mode 100644 roles/mgrote_proxmox_bind_mounts/tasks/bm.yml create mode 100644 roles/mgrote_proxmox_bind_mounts/tasks/main.yml rename roles/{mgrote.proxmox_lxc_profiles => mgrote_proxmox_lxc_profiles}/README.md (93%) create mode 100644 roles/mgrote_proxmox_lxc_profiles/defaults/main.yml create mode 100644 roles/mgrote_proxmox_lxc_profiles/handlers/main.yml create mode 100644 roles/mgrote_proxmox_lxc_profiles/tasks/main.yml create mode 100644 roles/mgrote_proxmox_lxc_profiles/tasks/profile.yml rename roles/{mgrote.qemu_guest_agent => mgrote_qemu_guest_agent}/README.md (100%) create mode 100644 roles/mgrote_qemu_guest_agent/handlers/main.yml create mode 100644 roles/mgrote_qemu_guest_agent/tasks/main.yml rename roles/{mgrote.remove_snapd => mgrote_remove_snapd}/README.md (100%) create mode 100644 roles/mgrote_remove_snapd/tasks/main.yml rename roles/{mgrote.restic => mgrote_restic}/README.md (100%) create mode 100644 roles/mgrote_restic/defaults/main.yml create mode 100644 roles/mgrote_restic/handlers/main.yml create mode 100644 roles/mgrote_restic/tasks/main.yml rename roles/{mgrote.restic => mgrote_restic}/templates/media-restic.automount.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/media-restic.mount.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/restic.env.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/restic.service.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/restic.timer.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/restic_mail.service.j2 (100%) rename roles/{mgrote.restic => mgrote_restic}/templates/smb.cred.j2 (100%) rename roles/{mgrote.sealed-secrets => mgrote_sealed_secrets}/README.md (100%) create mode 100644 roles/mgrote_sealed_secrets/defaults/main.yml create mode 100644 roles/mgrote_sealed_secrets/tasks/import.yml create mode 100644 roles/mgrote_sealed_secrets/tasks/main.yml create mode 100644 roles/mgrote_sealed_secrets/tasks/user.yml rename roles/{mgrote.sealed-secrets => mgrote_sealed_secrets}/templates/private.key.j2 (100%) rename roles/{mgrote.set_permissions => mgrote_set_permissions}/README.md (100%) rename roles/{mgrote.set_permissions => mgrote_set_permissions}/tasks/main.yml (100%) rename roles/{mgrote.smart => mgrote_smart}/README.md (100%) create mode 100644 roles/mgrote_smart/defaults/main.yml create mode 100644 roles/mgrote_smart/handlers/main.yml create mode 100644 roles/mgrote_smart/tasks/main.yml create mode 100644 roles/mgrote_smart/tasks/user.yml rename roles/{mgrote.smart => mgrote_smart}/templates/smartd.conf (100%) rename roles/{mgrote.smart => mgrote_smart}/templates/smartmontools (100%) rename roles/{mgrote.ssh => mgrote_ssh}/README.md (100%) create mode 100644 roles/mgrote_ssh/handlers/main.yml create mode 100644 roles/mgrote_ssh/tasks/main.yml create mode 100644 roles/mgrote_ssh/tasks/pve.yml create mode 100644 roles/mgrote_ssh/tasks/ubuntu.yml rename roles/{mgrote.ssh => mgrote_ssh}/templates/pve.j2 (100%) rename roles/{mgrote.ssh => mgrote_ssh}/templates/ubuntu.j2 (100%) create mode 100644 roles/mgrote_ssh/vars/pve.yml create mode 100644 roles/mgrote_ssh/vars/ubuntu.yml rename roles/{mgrote.systemd-resolved => mgrote_systemd_resolved}/README.md (100%) rename roles/{mgrote.systemd-resolved => mgrote_systemd_resolved}/defaults/main.yml (85%) create mode 100644 roles/mgrote_systemd_resolved/handlers/main.yml create mode 100644 roles/mgrote_systemd_resolved/tasks/main.yml rename roles/{mgrote.systemd-resolved => mgrote_systemd_resolved}/templates/resolv.conf.j2 (100%) rename roles/{mgrote.systemd-resolved => mgrote_systemd_resolved}/templates/resolved.conf.j2 (100%) rename roles/{mgrote.users => mgrote_users}/README.md (100%) create mode 100644 roles/mgrote_users/tasks/main.yml create mode 100644 roles/mgrote_vim/defaults/main.yml create mode 100644 roles/mgrote_vim/handlers/main.yml rename roles/{mgrote.vim => mgrote_vim}/readme.md (100%) create mode 100644 roles/mgrote_vim/tasks/main.yml rename roles/{mgrote.youtubedl => mgrote_youtubedl}/README.md (100%) rename roles/{mgrote.youtubedl => mgrote_youtubedl}/defaults/main.yml (100%) create mode 100644 roles/mgrote_youtubedl/handlers/main.yml create mode 100644 roles/mgrote_youtubedl/tasks/main.yml rename roles/{mgrote.youtubedl => mgrote_youtubedl}/templates/podcast.txt (100%) rename roles/{mgrote.youtubedl => mgrote_youtubedl}/templates/youtube.txt (100%) rename roles/{mgrote.youtubedl => mgrote_youtubedl}/templates/youtubedl.service.j2 (100%) rename roles/{mgrote.youtubedl => mgrote_youtubedl}/templates/youtubedl.timer.j2 (100%) rename roles/{mgrote.youtubedl => mgrote_youtubedl}/templates/youtubedl_mail.service.j2 (100%) rename roles/{mgrote.zfs_arc_mem => mgrote_zfs_arc_mem}/README.md (100%) create mode 100644 roles/mgrote_zfs_arc_mem/defaults/main.yml create mode 100644 roles/mgrote_zfs_arc_mem/tasks/main.yml rename roles/{mgrote.zfs_health => mgrote_zfs_health}/README.md (100%) create mode 100644 roles/mgrote_zfs_health/defaults/main.yml create mode 100644 roles/mgrote_zfs_health/tasks/main.yml create mode 100644 roles/mgrote_zfs_health/tasks/user.yml rename roles/{mgrote.zfs_health => mgrote_zfs_health}/templates/zfs-health.sh (100%) rename roles/{mgrote.zfs_manage_datasets => mgrote_zfs_manage_datasets}/README.md (100%) create mode 100644 roles/mgrote_zfs_manage_datasets/tasks/main.yml rename roles/{mgrote.zfs_packages => mgrote_zfs_packages}/README.md (100%) create mode 100644 roles/mgrote_zfs_packages/tasks/main.yml rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/README.md (98%) rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/defaults/main.yml (50%) create mode 100644 roles/mgrote_zfs_sanoid/handlers/main.yml create mode 100644 roles/mgrote_zfs_sanoid/tasks/destination.yml create mode 100644 roles/mgrote_zfs_sanoid/tasks/main.yml create mode 100644 roles/mgrote_zfs_sanoid/tasks/snaps.yml create mode 100644 roles/mgrote_zfs_sanoid/tasks/source.yml create mode 100644 roles/mgrote_zfs_sanoid/tasks/user.yml rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/templates/sanoid.conf.j2 (100%) rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/templates/sanoid_mail.service.j2 (100%) rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/templates/syncoid.service.j2 (100%) rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/templates/syncoid.timer.j2 (100%) rename roles/{mgrote.zfs_sanoid => mgrote_zfs_sanoid}/templates/syncoid_mail.service.j2 (100%) rename roles/{mgrote.zfs_scrub => mgrote_zfs_scrub}/README.md (100%) create mode 100644 roles/mgrote_zfs_scrub/defaults/main.yml create mode 100644 roles/mgrote_zfs_scrub/tasks/main.yml rename roles/{mgrote.zfs_scrub => mgrote_zfs_scrub}/templates/zpool-scrub-mail.service.j2 (100%) rename roles/{mgrote.zfs_scrub => mgrote_zfs_scrub}/templates/zpool-scrub@.service.j2 (100%) rename roles/{mgrote.zfs_scrub => mgrote_zfs_scrub}/templates/zpool-scrub@.timer.j2 (100%) rename roles/{mgrote.zfs_zed => mgrote_zfs_zed}/README.md (100%) create mode 100644 roles/mgrote_zfs_zed/handlers/main.yml create mode 100644 roles/mgrote_zfs_zed/tasks/main.yml rename roles/{mgrote.zfs_zed => mgrote_zfs_zed}/templates/zed.rc (100%) diff --git a/.ansible-lint b/.ansible-lint index 101357cb..41f5fdfe 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -3,6 +3,8 @@ skip_list: - yaml[line-length] - name[casing] - yaml[comments] + - name[play] + - var-naming[no-role-prefix] quiet: true exclude_paths: - .cache/ # implicit unless exclude_paths is defined in config @@ -22,3 +24,5 @@ exclude_paths: - roles/robertdebock.bootstrap - roles/PyratLabs.k3s - .gitlab-ci.yml + - friedhof/ + - playbooks/on-off diff --git a/.ansible-lint-ignore b/.ansible-lint-ignore deleted file mode 100644 index 2b18e9e6..00000000 --- a/.ansible-lint-ignore +++ /dev/null @@ -1,3 +0,0 @@ -# This file contains ignores rule violations for ansible-lint -playbooks/on-off/remove_old_ssh_key.yml name[play] -playbooks/on-off/remove_old_ssh_key.yml yaml[truthy] diff --git a/.drone.yml b/.drone.yml index dab97558..1f0140ce 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,7 +23,7 @@ steps: commands: - ansible-lint --version - echo $ANSIBLE_VAULT_PASSWORD > ./vault-pass.yml - - ansible-lint + - ansible-lint --force-color --format pep8 when: event: exclude: @@ -31,17 +31,3 @@ steps: environment: ANSIBLE_VAULT_PASSWORD: from_secret: vault-pass - ---- -kind: pipeline -type: docker -name: yaml-lint -steps: - - name: yamllint - image: cytopia/yamllint:1 - commands: - - /usr/bin/yamllint -f colored . - when: - event: - exclude: - - tag diff --git a/.yamllint b/.yamllint deleted file mode 100644 index 30d8fe83..00000000 --- a/.yamllint +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - ./roles/pandemonium1986.ansible-role-k9s - - ./roles/robertdebock.bootstrap diff --git a/README.md b/README.md index b630fb59..195fa744 100644 --- a/README.md +++ b/README.md @@ -1,4 +1 @@ # ansible_heimserver - -## example-cli -`ansible-playbook playbooks/base/0_master.yml -i inventory --key-file id_rsa_ansible_user --vault-password-file vault-pass.yml --limit jenkins-test.grote.lan` diff --git a/collections/community/general/plugins/modules/btrfs_info.py b/collections/community/general/plugins/modules/btrfs_info.py index c367b9ed..ef4be555 100644 --- a/collections/community/general/plugins/modules/btrfs_info.py +++ b/collections/community/general/plugins/modules/btrfs_info.py @@ -50,8 +50,8 @@ filesystems: description: A list of devices assigned to the filesystem. type: list sample: - - /dev/sda1 - - /dev/sdb1 + - /dev/sda1 + - /dev/sdb1 default_subvolume: description: The id of the filesystem's default subvolume. type: int diff --git a/collections/community/general/plugins/modules/btrfs_subvolume.py b/collections/community/general/plugins/modules/btrfs_subvolume.py index 864bb65a..5bfcab5c 100644 --- a/collections/community/general/plugins/modules/btrfs_subvolume.py +++ b/collections/community/general/plugins/modules/btrfs_subvolume.py @@ -162,8 +162,8 @@ filesystem: returned: success type: list sample: - - /dev/sda1 - - /dev/sdb1 + - /dev/sda1 + - /dev/sdb1 default_subvolume: description: The ID of the filesystem's default subvolume. returned: success and if filesystem is mounted diff --git a/docker-compose/homer/assets/config.yml b/docker-compose/homer/assets/config.yml index c2d04007..99200dbd 100644 --- a/docker-compose/homer/assets/config.yml +++ b/docker-compose/homer/assets/config.yml @@ -15,11 +15,6 @@ defaults: stylesheet: - 'assets/catppuccin-frappe.css' - - - - - links: - name: "Homepage" icon: "fas fa-heartbeat" diff --git a/docker-compose/httpd/docker-compose.yml.j2 b/docker-compose/httpd/docker-compose.yml.j2 index 43c09208..63bfc9d4 100644 --- a/docker-compose/httpd/docker-compose.yml.j2 +++ b/docker-compose/httpd/docker-compose.yml.j2 @@ -6,7 +6,7 @@ services: restart: always volumes: - uploads:/usr/local/apache2/htdocs/ - - "${PWD}/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" + - "/docker/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" ports: - 3344:80 labels: diff --git a/docker-compose/traefik/file-provider.yml b/docker-compose/traefik/file-provider.yml index 760f4525..7defcfb3 100644 --- a/docker-compose/traefik/file-provider.yml +++ b/docker-compose/traefik/file-provider.yml @@ -21,8 +21,8 @@ http: service_dokuwiki: loadBalancer: servers: - - url: "http://dokuwiki2.grote.lan/" + - url: "http://dokuwiki2.grote.lan/" service_gitea: loadBalancer: servers: - - url: "http://gitea.grote.lan:3000/" + - url: "http://gitea.grote.lan:3000/" diff --git a/roles/_mgrote.musterrolle/LICENSE b/friedhof/mgrote_acng/LICENSE similarity index 100% rename from roles/_mgrote.musterrolle/LICENSE rename to friedhof/mgrote_acng/LICENSE diff --git a/roles/_mgrote.musterrolle/README.md b/friedhof/mgrote_acng/README.md similarity index 100% rename from roles/_mgrote.musterrolle/README.md rename to friedhof/mgrote_acng/README.md diff --git a/friedhof/mgrote_acng/defaults/main.yml b/friedhof/mgrote_acng/defaults/main.yml new file mode 100644 index 00000000..34709099 --- /dev/null +++ b/friedhof/mgrote_acng/defaults/main.yml @@ -0,0 +1,6 @@ +--- +acng_exthreshold: "60" +acng_server_port: "9999" +acng_security_conf_path: "/etc/apt-cacher-ng/security.conf" +acng_server_auth_user: acngadmin +acng_server_auth_pass: klauspeter diff --git a/friedhof/mgrote_acng/handlers/main.yml b/friedhof/mgrote_acng/handlers/main.yml new file mode 100644 index 00000000..cec11168 --- /dev/null +++ b/friedhof/mgrote_acng/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: acng_starten_aktivieren + become: true + ansible.builtin.systemd: + name: apt-cacher-ng + enabled: true + state: restarted diff --git a/roles/_mgrote.musterrolle_systemd/LICENSE b/friedhof/mgrote_acng/mgrote.acng/LICENSE similarity index 100% rename from roles/_mgrote.musterrolle_systemd/LICENSE rename to friedhof/mgrote_acng/mgrote.acng/LICENSE diff --git a/roles/mgrote.acng/README.md b/friedhof/mgrote_acng/mgrote.acng/README.md similarity index 100% rename from roles/mgrote.acng/README.md rename to friedhof/mgrote_acng/mgrote.acng/README.md diff --git a/friedhof/mgrote_acng/mgrote.acng/defaults/main.yml b/friedhof/mgrote_acng/mgrote.acng/defaults/main.yml new file mode 100644 index 00000000..34709099 --- /dev/null +++ b/friedhof/mgrote_acng/mgrote.acng/defaults/main.yml @@ -0,0 +1,6 @@ +--- +acng_exthreshold: "60" +acng_server_port: "9999" +acng_security_conf_path: "/etc/apt-cacher-ng/security.conf" +acng_server_auth_user: acngadmin +acng_server_auth_pass: klauspeter diff --git a/friedhof/mgrote_acng/mgrote.acng/handlers/main.yml b/friedhof/mgrote_acng/mgrote.acng/handlers/main.yml new file mode 100644 index 00000000..cec11168 --- /dev/null +++ b/friedhof/mgrote_acng/mgrote.acng/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: acng_starten_aktivieren + become: true + ansible.builtin.systemd: + name: apt-cacher-ng + enabled: true + state: restarted diff --git a/friedhof/mgrote_acng/mgrote.acng/tasks/main.yml b/friedhof/mgrote_acng/mgrote.acng/tasks/main.yml new file mode 100644 index 00000000..89a4cbb6 --- /dev/null +++ b/friedhof/mgrote_acng/mgrote.acng/tasks/main.yml @@ -0,0 +1,42 @@ +--- +- name: ensure directories exists + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - /etc/apt-cacher-ng + - /var/cache/apt-cacher-ng + +- name: ensure directories have the right permissions + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: apt-cacher-ng + group: apt-cacher-ng + loop: + - /var/cache/apt-cacher-ng + +- name: templating acng.conf + become: true + ansible.builtin.template: + src: "acng.conf" + dest: "/etc/apt-cacher-ng/acng.conf" + mode: "0664" + notify: acng_starten_aktivieren + +- name: install apt-cacher-ng packages + become: true + ansible.builtin.package: + name: apt-cacher-ng + state: present + +- name: templating security.conf + become: true + ansible.builtin.template: + src: "security.conf" + dest: "{{ acng_security_conf_path }}" + mode: "0640" + notify: acng_starten_aktivieren + no_log: true diff --git a/roles/_mgrote.musterrolle/templates/acng.conf b/friedhof/mgrote_acng/mgrote.acng/templates/acng.conf similarity index 100% rename from roles/_mgrote.musterrolle/templates/acng.conf rename to friedhof/mgrote_acng/mgrote.acng/templates/acng.conf diff --git a/roles/_mgrote.musterrolle/templates/security.conf b/friedhof/mgrote_acng/mgrote.acng/templates/security.conf similarity index 100% rename from roles/_mgrote.musterrolle/templates/security.conf rename to friedhof/mgrote_acng/mgrote.acng/templates/security.conf diff --git a/friedhof/mgrote_acng/tasks/main.yml b/friedhof/mgrote_acng/tasks/main.yml new file mode 100644 index 00000000..f85a6a67 --- /dev/null +++ b/friedhof/mgrote_acng/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: ensure directories exists + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: apt-cacher-ng + group: apt-cacher-ng + mode: "0644" + loop: + - /etc/apt-cacher-ng + - /var/cache/apt-cacher-ng + +- name: templating acng.conf + become: true + ansible.builtin.template: + src: "acng.conf" + dest: "/etc/apt-cacher-ng/acng.conf" + mode: "0644" + notify: acng_starten_aktivieren + +- name: install apt-cacher-ng packages + become: true + ansible.builtin.package: + name: apt-cacher-ng + state: present + +- name: templating security.conf + become: true + ansible.builtin.template: + src: "security.conf" + dest: "{{ acng_security_conf_path }}" + mode: "0640" + notify: acng_starten_aktivieren + no_log: true diff --git a/roles/mgrote.acng/templates/acng.conf b/friedhof/mgrote_acng/templates/acng.conf similarity index 100% rename from roles/mgrote.acng/templates/acng.conf rename to friedhof/mgrote_acng/templates/acng.conf diff --git a/roles/mgrote.acng/templates/security.conf b/friedhof/mgrote_acng/templates/security.conf similarity index 100% rename from roles/mgrote.acng/templates/security.conf rename to friedhof/mgrote_acng/templates/security.conf diff --git a/roles/mgrote.acng/LICENSE b/friedhof/mgrote_alacritty/LICENSE similarity index 100% rename from roles/mgrote.acng/LICENSE rename to friedhof/mgrote_alacritty/LICENSE diff --git a/roles/mgrote.alacritty/README.md b/friedhof/mgrote_alacritty/README.md similarity index 100% rename from roles/mgrote.alacritty/README.md rename to friedhof/mgrote_alacritty/README.md diff --git a/friedhof/mgrote_alacritty/defaults/main.yml b/friedhof/mgrote_alacritty/defaults/main.yml new file mode 100644 index 00000000..ca4228b2 --- /dev/null +++ b/friedhof/mgrote_alacritty/defaults/main.yml @@ -0,0 +1,2 @@ +--- +alacritty_url: http://docker10.grote.lan:3344/alacritty-latest.tar.gz diff --git a/roles/mgrote.alacritty/LICENSE b/friedhof/mgrote_alacritty/mgrote.alacritty/LICENSE similarity index 100% rename from roles/mgrote.alacritty/LICENSE rename to friedhof/mgrote_alacritty/mgrote.alacritty/LICENSE diff --git a/friedhof/mgrote_alacritty/mgrote.alacritty/README.md b/friedhof/mgrote_alacritty/mgrote.alacritty/README.md new file mode 100644 index 00000000..b2842322 --- /dev/null +++ b/friedhof/mgrote_alacritty/mgrote.alacritty/README.md @@ -0,0 +1,8 @@ +## mgrote.alacritty +### Beschreibung +Installiert alacritty. + + +### getestet auf +- [x] Ubuntu (>=18.04) +- [x] Linux Mint diff --git a/friedhof/mgrote_alacritty/mgrote.alacritty/defaults/main.yml b/friedhof/mgrote_alacritty/mgrote.alacritty/defaults/main.yml new file mode 100644 index 00000000..ca4228b2 --- /dev/null +++ b/friedhof/mgrote_alacritty/mgrote.alacritty/defaults/main.yml @@ -0,0 +1,2 @@ +--- +alacritty_url: http://docker10.grote.lan:3344/alacritty-latest.tar.gz diff --git a/friedhof/mgrote_alacritty/mgrote.alacritty/tasks/main.yml b/friedhof/mgrote_alacritty/mgrote.alacritty/tasks/main.yml new file mode 100644 index 00000000..a4998d7f --- /dev/null +++ b/friedhof/mgrote_alacritty/mgrote.alacritty/tasks/main.yml @@ -0,0 +1,11 @@ +--- +- name: download binary + ansible.builtin.unarchive: + src: "{{ alacritty_url }}" + dest: /usr/local/bin + remote_src: true + +- name: set permissions + ansible.builtin.file: + path: /usr/local/bin/alacritty + mode: '0755' diff --git a/friedhof/mgrote_alacritty/tasks/main.yml b/friedhof/mgrote_alacritty/tasks/main.yml new file mode 100644 index 00000000..a4998d7f --- /dev/null +++ b/friedhof/mgrote_alacritty/tasks/main.yml @@ -0,0 +1,11 @@ +--- +- name: download binary + ansible.builtin.unarchive: + src: "{{ alacritty_url }}" + dest: /usr/local/bin + remote_src: true + +- name: set permissions + ansible.builtin.file: + path: /usr/local/bin/alacritty + mode: '0755' diff --git a/roles/mgrote.apcupsd/LICENSE b/friedhof/mgrote_apcupsd/LICENSE similarity index 100% rename from roles/mgrote.apcupsd/LICENSE rename to friedhof/mgrote_apcupsd/LICENSE diff --git a/roles/mgrote.apcupsd/README.md b/friedhof/mgrote_apcupsd/README.md similarity index 100% rename from roles/mgrote.apcupsd/README.md rename to friedhof/mgrote_apcupsd/README.md diff --git a/friedhof/mgrote_apcupsd/defaults/main.yml b/friedhof/mgrote_apcupsd/defaults/main.yml new file mode 100644 index 00000000..a86afff6 --- /dev/null +++ b/friedhof/mgrote_apcupsd/defaults/main.yml @@ -0,0 +1,40 @@ +--- +## Values: http://www.apcupsd.org/manual/manual.html + +## Master +# Wenn "true" ist dieser Host master. +apcupsd_nis_master: true + +# Interface auf dem der "Master" erreichbar ist. +apcupsd_nis_master_listen_ip: 0.0.0.0 + +# Post auf dem der "Master" erreichbar ist. +apcupsd_nis_master_listen_port: 3551 + +# Name der USV +apcupsd_ups_name: APC-BX950U-GR + +## Slave +# Zeitspanne zwischen dem pollen +apcupsd_slave_polltime: 10 #in Sekunden + + +## Master & Slave +# FQDN oder IP des "master" +apcupsd_nis_master_hostname: pve2.grote.lan + +# Zeitspanne in Sekunden, ab der der Systemdienst einen Stromausfall annimmt. Nuetzlich, um sehr kurze Ausfaelle ignorieren zu koennen. +apcupsd_master_onbatterydelay: 10 +apcupsd_slave_onbatterydelay: 10 + +# Durch die USV gemeldete Restkapazitaet in Prozent, ab der der Rechner heruntergefahren wird. +apcupsd_master_batterylevel_for_shutdown: 50 +apcupsd_slave_batterylevel_for_shutdown: 60 + +# apcupsd will shutdown the system during a power failure when the remaining runtime on batteries as internally calculated by the UPS falls below the specified minutes. Jeweils Master und Slave. +apcupsd_master_minutes_for_shutdown: 10 +apcupsd_slave_minutes_for_shutdown: 11 + +# Specifies when apcupsd should create the NOLOGON file to prevent users from logging on to the system. Jeweils Master und Slave. +apcupsd_master_nologon_when_active: always +apcupsd_slave_nologon_when_active: always diff --git a/friedhof/mgrote_apcupsd/handlers/main.yml b/friedhof/mgrote_apcupsd/handlers/main.yml new file mode 100644 index 00000000..5e55361d --- /dev/null +++ b/friedhof/mgrote_apcupsd/handlers/main.yml @@ -0,0 +1,12 @@ +--- +- name: restart_apcupsd #wird aufgerufen wenn apcupsd.conf_kopieren nach aenderungen den status "changed hat" + become: true + ansible.builtin.systemd: + name: apcupsd + state: restarted + enabled: true + +- name: apc_access_mail + ansible.builtin.shell: + cmd: set -o pipefail && /usr/sbin/apcaccess | mail -s "{{ ansible_hostname }}" {{ empfaenger_mail }} + executable: /bin/bash diff --git a/friedhof/mgrote_apcupsd/meta/main.yml b/friedhof/mgrote_apcupsd/meta/main.yml new file mode 100644 index 00000000..ba59fed4 --- /dev/null +++ b/friedhof/mgrote_apcupsd/meta/main.yml @@ -0,0 +1,14 @@ +--- +dependencies: + - role: mgrote_postfix +galaxy_info: + author: mgrote + description: installs apcupsd + min_ansible_version: 2.0 + license: GPLv3 + platforms: + - name: Proxmox + versions: + - all + galaxy_tags: + - system diff --git a/roles/mgrote.cv4pve-autosnap/LICENSE b/friedhof/mgrote_apcupsd/mgrote.apcupsd/LICENSE similarity index 100% rename from roles/mgrote.cv4pve-autosnap/LICENSE rename to friedhof/mgrote_apcupsd/mgrote.apcupsd/LICENSE diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/README.md b/friedhof/mgrote_apcupsd/mgrote.apcupsd/README.md new file mode 100644 index 00000000..04fa1101 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/README.md @@ -0,0 +1,20 @@ +## mgrote.apcupsd + +### Beschreibung +* Installiert apcupsd. +* Auf einem PC als "Master", hier ist die USV per USB angeschlossen. +* Auf allen anderen PCs als "Slave", diese OCs pollen alle Sekunden den Master. +* Benoetigt mgrote.postfix. +* Getestet mit: APC-BX950U-GR + +### Links + * http://www.apcupsd.org/manual/#checking-your-configuration-file + * https://linux.die.net/man/5/apcupsd.conf + + +### getestet auf +- [x] ProxMox 6.1 +- [x] ProxMox 7 + +### Variablen + Defaults +- siehe [defaults/main.yml](./defaults/main.yml) diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/defaults/main.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/defaults/main.yml new file mode 100644 index 00000000..a86afff6 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/defaults/main.yml @@ -0,0 +1,40 @@ +--- +## Values: http://www.apcupsd.org/manual/manual.html + +## Master +# Wenn "true" ist dieser Host master. +apcupsd_nis_master: true + +# Interface auf dem der "Master" erreichbar ist. +apcupsd_nis_master_listen_ip: 0.0.0.0 + +# Post auf dem der "Master" erreichbar ist. +apcupsd_nis_master_listen_port: 3551 + +# Name der USV +apcupsd_ups_name: APC-BX950U-GR + +## Slave +# Zeitspanne zwischen dem pollen +apcupsd_slave_polltime: 10 #in Sekunden + + +## Master & Slave +# FQDN oder IP des "master" +apcupsd_nis_master_hostname: pve2.grote.lan + +# Zeitspanne in Sekunden, ab der der Systemdienst einen Stromausfall annimmt. Nuetzlich, um sehr kurze Ausfaelle ignorieren zu koennen. +apcupsd_master_onbatterydelay: 10 +apcupsd_slave_onbatterydelay: 10 + +# Durch die USV gemeldete Restkapazitaet in Prozent, ab der der Rechner heruntergefahren wird. +apcupsd_master_batterylevel_for_shutdown: 50 +apcupsd_slave_batterylevel_for_shutdown: 60 + +# apcupsd will shutdown the system during a power failure when the remaining runtime on batteries as internally calculated by the UPS falls below the specified minutes. Jeweils Master und Slave. +apcupsd_master_minutes_for_shutdown: 10 +apcupsd_slave_minutes_for_shutdown: 11 + +# Specifies when apcupsd should create the NOLOGON file to prevent users from logging on to the system. Jeweils Master und Slave. +apcupsd_master_nologon_when_active: always +apcupsd_slave_nologon_when_active: always diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/handlers/main.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/handlers/main.yml new file mode 100644 index 00000000..da610592 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/handlers/main.yml @@ -0,0 +1,10 @@ +--- +- name: restart_apcupsd #wird aufgerufen wenn apcupsd.conf_kopieren nach aenderungen den status "changed hat" + become: true + ansible.builtin.systemd: + name: apcupsd + state: restarted + enabled: true + +- name: apc_access_mail + ansible.builtin.shell: /usr/sbin/apcaccess | mail -s "{{ ansible_hostname }}" {{ empfaenger_mail }} diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/meta/main.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/meta/main.yml new file mode 100644 index 00000000..ba59fed4 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/meta/main.yml @@ -0,0 +1,14 @@ +--- +dependencies: + - role: mgrote_postfix +galaxy_info: + author: mgrote + description: installs apcupsd + min_ansible_version: 2.0 + license: GPLv3 + platforms: + - name: Proxmox + versions: + - all + galaxy_tags: + - system diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/main.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/main.yml new file mode 100644 index 00000000..bee19411 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/main.yml @@ -0,0 +1,42 @@ +--- +- name: install apcupsd packages + ansible.builtin.package: + name: + - apcupsd + - apcupsd-cgi + - apcupsd-doc + state: present + become: true + notify: apc_access_mail + +- name: create master config + ansible.builtin.include_tasks: master.yml + when: + - apcupsd_nis_master + - apcupsd_nis_master is defined + +- name: create slave config + ansible.builtin.include_tasks: slave.yml + when: + - not apcupsd_nis_master + - apcupsd_nis_master is defined + +- name: copy apcupsd file + become: true + ansible.builtin.template: + src: "apcupsd" + dest: "/etc/default/apcupsd" + +- name: set mail recipient + become: true + ansible.builtin.lineinfile: + path: /etc/apcupsd/apccontrol #wo + regexp: export SYSADMIN=root #suche nach + line: export SYSADMIN={{ empfaenger_mail }} #ersetze durch... + backrefs: true #verhindert das die zeile bei "nicht zutreffen" am ende der datei angefuegt wird: https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html#parameters + +- name: copy test script + become: true + ansible.builtin.template: + src: "apccontrol.save" + dest: "/etc/apcupsd/apccontrol.save" diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/master.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/master.yml new file mode 100644 index 00000000..8cf17684 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/master.yml @@ -0,0 +1,7 @@ +--- +- name: templating master_apcupsd.conf + become: true + ansible.builtin.template: + src: "master_apcupsd.conf" + dest: "/etc/apcupsd/apcupsd.conf" + notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/slave.yml b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/slave.yml new file mode 100644 index 00000000..5f1f0d03 --- /dev/null +++ b/friedhof/mgrote_apcupsd/mgrote.apcupsd/tasks/slave.yml @@ -0,0 +1,7 @@ +--- +- name: templating slave_apcupsd.conf + become: true + ansible.builtin.template: + src: "slave_apcupsd.conf" + dest: "/etc/apcupsd/apcupsd.conf" + notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/roles/mgrote.apcupsd/templates/apccontrol.save b/friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/apccontrol.save similarity index 100% rename from roles/mgrote.apcupsd/templates/apccontrol.save rename to friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/apccontrol.save diff --git a/roles/mgrote.apcupsd/templates/apcupsd b/friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/apcupsd similarity index 100% rename from roles/mgrote.apcupsd/templates/apcupsd rename to friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/apcupsd diff --git a/roles/mgrote.apcupsd/templates/master_apcupsd.conf b/friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/master_apcupsd.conf similarity index 100% rename from roles/mgrote.apcupsd/templates/master_apcupsd.conf rename to friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/master_apcupsd.conf diff --git a/roles/mgrote.apcupsd/templates/slave_apcupsd.conf b/friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/slave_apcupsd.conf similarity index 100% rename from roles/mgrote.apcupsd/templates/slave_apcupsd.conf rename to friedhof/mgrote_apcupsd/mgrote.apcupsd/templates/slave_apcupsd.conf diff --git a/friedhof/mgrote_apcupsd/tasks/main.yml b/friedhof/mgrote_apcupsd/tasks/main.yml new file mode 100644 index 00000000..bee19411 --- /dev/null +++ b/friedhof/mgrote_apcupsd/tasks/main.yml @@ -0,0 +1,42 @@ +--- +- name: install apcupsd packages + ansible.builtin.package: + name: + - apcupsd + - apcupsd-cgi + - apcupsd-doc + state: present + become: true + notify: apc_access_mail + +- name: create master config + ansible.builtin.include_tasks: master.yml + when: + - apcupsd_nis_master + - apcupsd_nis_master is defined + +- name: create slave config + ansible.builtin.include_tasks: slave.yml + when: + - not apcupsd_nis_master + - apcupsd_nis_master is defined + +- name: copy apcupsd file + become: true + ansible.builtin.template: + src: "apcupsd" + dest: "/etc/default/apcupsd" + +- name: set mail recipient + become: true + ansible.builtin.lineinfile: + path: /etc/apcupsd/apccontrol #wo + regexp: export SYSADMIN=root #suche nach + line: export SYSADMIN={{ empfaenger_mail }} #ersetze durch... + backrefs: true #verhindert das die zeile bei "nicht zutreffen" am ende der datei angefuegt wird: https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html#parameters + +- name: copy test script + become: true + ansible.builtin.template: + src: "apccontrol.save" + dest: "/etc/apcupsd/apccontrol.save" diff --git a/friedhof/mgrote_apcupsd/tasks/master.yml b/friedhof/mgrote_apcupsd/tasks/master.yml new file mode 100644 index 00000000..8cf17684 --- /dev/null +++ b/friedhof/mgrote_apcupsd/tasks/master.yml @@ -0,0 +1,7 @@ +--- +- name: templating master_apcupsd.conf + become: true + ansible.builtin.template: + src: "master_apcupsd.conf" + dest: "/etc/apcupsd/apcupsd.conf" + notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/friedhof/mgrote_apcupsd/tasks/slave.yml b/friedhof/mgrote_apcupsd/tasks/slave.yml new file mode 100644 index 00000000..5f1f0d03 --- /dev/null +++ b/friedhof/mgrote_apcupsd/tasks/slave.yml @@ -0,0 +1,7 @@ +--- +- name: templating slave_apcupsd.conf + become: true + ansible.builtin.template: + src: "slave_apcupsd.conf" + dest: "/etc/apcupsd/apcupsd.conf" + notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/friedhof/mgrote_apcupsd/templates/apccontrol.save b/friedhof/mgrote_apcupsd/templates/apccontrol.save new file mode 100644 index 00000000..f8d74750 --- /dev/null +++ b/friedhof/mgrote_apcupsd/templates/apccontrol.save @@ -0,0 +1,138 @@ +{{ file_header | default () }} +#!@SCRIPTSHELL@ +# +# Safe apccontrol for testing. +# +# This apccontrol can be used for testing without fear +# that it will bring your system down +# @configure_input@ +# +prefix=@prefix@ +exec_prefix=@exec_prefix@ +APCUPSD=@sbindir@/apcupsd +SHUTDOWN=@SHUTDOWN@ +SCRIPTDIR=@sysconfdir@ + +# +case "$1" in + killpower) + wall <=20.04) + + +### Variablen + Defaults +see [defaults](./defaults/main.yml) + +### Abgekupfert bei +* https://alexellisuk.medium.com/lightweight-ad-blocking-with-dnsmasq-and-raspberry-pi-665dbb3242e3 +* https://www.atemlire.io/how-to-easily-create-your-own-adblock-using-dnsmasq +* https://pi-hole.net diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/defaults/main.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/defaults/main.yml new file mode 100644 index 00000000..69f398be --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/defaults/main.yml @@ -0,0 +1,41 @@ +--- +# Welche DNS-Server soll dnsmasq anfragen? +dnsmasq_resolver: + - 9.9.9.9 + - 1.1.1.1 +# Soll dnsmasq alle Anfragen loggen? +dnsmasq_log_queries: false +# Wohin soll das Log geschrieben werden? +dnsmasq_logfile: /var/log/dnsmasq.log +# Welche BLocklisten sollen verwendet werden? +dnsmasq_blocklists: + - name: sysctl.org + state: present + url: http://sysctl.org/cameleon/hosts + - name: StevenBlack.1 + state: present + url: https://raw.githubusercontent.com/StevenBlack/hosts/master/data/KADhosts/hosts + - name: StevenBlack.2 + state: present + url: https://raw.githubusercontent.com/StevenBlack/hosts/master/data/add.Spam/hosts + - name: adaway.org + state: present + url: https://adaway.org/hosts.txt + - name: StevenBlack.3 + state: present + url: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts + - name: developerdan.1 + state: present + url: https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt + - name: developerdan.2 + state: present + url: https://www.github.developerdan.com/hosts/lists/amp-hosts-extended.txt +# Wie groß soll der Cache sein? +dnsmasq_cache_size: 10000 +# Auf welchem Port soll dnsmasq laufen? +dnsmasq_port: 53 +# User und Gruppe für dnsmasq +dnsmasq_user_group: dnsmasq +dnsmasq_user: dnsmasq +# Which domain should never be forwarded tor the "dnsmasq_resolvers" +dnsmasq_never_forward_domain: local.lan diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/handlers/main.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/handlers/main.yml new file mode 100644 index 00000000..43e4e9e8 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: restart dnsmasq + become: true + ansible.builtin.systemd: + name: dnsmasq + state: restarted diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/blocklist.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/blocklist.yml new file mode 100644 index 00000000..64c363bd --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/blocklist.yml @@ -0,0 +1,19 @@ +--- +- name: download blocklist(s) + ansible.builtin.get_url: + url: "{{ item.url }}" + dest: "/etc/dnsmasq.d/blocklists/{{ item.name }}" + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + loop: "{{ dnsmasq_blocklists }}" + when: item.state == "present" + notify: restart dnsmasq + register: download + +- name: remove blocklist(s) + ansible.builtin.file: + path: "/etc/dnsmasq.d/blocklists/{{ item.name }}" + state: absent + loop: "{{ dnsmasq_blocklists }}" + when: item.state == "absent" + notify: restart dnsmasq diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/config.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/config.yml new file mode 100644 index 00000000..ec973e92 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/config.yml @@ -0,0 +1,9 @@ +--- +- name: template /etc/dnsmasq.conf + become: true + ansible.builtin.template: + src: dnsmasq.conf.j2 + dest: /etc/dnsmasq.conf + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + notify: restart dnsmasq diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/install.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/install.yml new file mode 100644 index 00000000..f95c0cee --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/install.yml @@ -0,0 +1,62 @@ +--- +- name: ensure packages are installed + become: true + ansible.builtin.package: + name: + - dnsmasq + - wget + state: present + register: install + +- name: stop dnsmasq (to prevent accidental DHCP-Server after installation) + become: true + ansible.builtin.service: + name: dnsmasq + state: stopped + when: install.changed + +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ dnsmasq_user_group }}" + state: present + when: + - dnsmasq_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + ansible.builtin.shell: /usr/sbin/nologin + create_home: false + when: + - dnsmasq_user_group is defined + - dnsmasq_user is defined + +- name: ensure needed directories exists + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + loop: + - /etc/dnsmasq.d + - /etc/dnsmasq.d/blocklists + +- name: clear default directories + become: true + ansible.builtin.file: + path: "{{ item }}" + state: absent + loop: + - /etc/dnsmasq.d/README + +- name: template logrotate config + become: true + ansible.builtin.template: + src: logrotate.j2 + dest: /etc/logrotate.d/dnsmasq + owner: root + group: root diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/main.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/main.yml new file mode 100644 index 00000000..0cfd97c1 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/main.yml @@ -0,0 +1,12 @@ +--- +- name: include install tasks + ansible.builtin.include_tasks: install.yml + +- name: include configuration tasks + ansible.builtin.include_tasks: config.yml + +- name: include systemd tasks + ansible.builtin.include_tasks: services.yml + +- name: include blocklist tasks + ansible.builtin.include_tasks: blocklist.yml diff --git a/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/services.yml b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/services.yml new file mode 100644 index 00000000..f240ce4e --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/tasks/services.yml @@ -0,0 +1,18 @@ +--- +- name: stop systemd-resolved service + ansible.builtin.systemd: + name: systemd-resolved + state: stopped + +- name: mask systemd-resolved service + ansible.builtin.systemd: + name: systemd-resolved + masked: true + state: stopped + +- name: template /etc/resolv.conf + ansible.builtin.template: + src: resolv.conf.j2 + dest: /etc/resolv.conf + backup: true + notify: restart dnsmasq diff --git a/roles/mgrote.dnsmasq_adblocker/templates/dnsmasq.conf.j2 b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/dnsmasq.conf.j2 similarity index 100% rename from roles/mgrote.dnsmasq_adblocker/templates/dnsmasq.conf.j2 rename to friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/dnsmasq.conf.j2 diff --git a/roles/mgrote.dnsmasq_adblocker/templates/logrotate.j2 b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/logrotate.j2 similarity index 100% rename from roles/mgrote.dnsmasq_adblocker/templates/logrotate.j2 rename to friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/logrotate.j2 diff --git a/roles/mgrote.dnsmasq_adblocker/templates/resolv.conf.j2 b/friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/resolv.conf.j2 similarity index 100% rename from roles/mgrote.dnsmasq_adblocker/templates/resolv.conf.j2 rename to friedhof/mgrote_dnsmasq_adblocker/mgrote.dnsmasq_adblocker/templates/resolv.conf.j2 diff --git a/friedhof/mgrote_dnsmasq_adblocker/tasks/blocklist.yml b/friedhof/mgrote_dnsmasq_adblocker/tasks/blocklist.yml new file mode 100644 index 00000000..64c363bd --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/tasks/blocklist.yml @@ -0,0 +1,19 @@ +--- +- name: download blocklist(s) + ansible.builtin.get_url: + url: "{{ item.url }}" + dest: "/etc/dnsmasq.d/blocklists/{{ item.name }}" + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + loop: "{{ dnsmasq_blocklists }}" + when: item.state == "present" + notify: restart dnsmasq + register: download + +- name: remove blocklist(s) + ansible.builtin.file: + path: "/etc/dnsmasq.d/blocklists/{{ item.name }}" + state: absent + loop: "{{ dnsmasq_blocklists }}" + when: item.state == "absent" + notify: restart dnsmasq diff --git a/friedhof/mgrote_dnsmasq_adblocker/tasks/config.yml b/friedhof/mgrote_dnsmasq_adblocker/tasks/config.yml new file mode 100644 index 00000000..ec973e92 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/tasks/config.yml @@ -0,0 +1,9 @@ +--- +- name: template /etc/dnsmasq.conf + become: true + ansible.builtin.template: + src: dnsmasq.conf.j2 + dest: /etc/dnsmasq.conf + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + notify: restart dnsmasq diff --git a/friedhof/mgrote_dnsmasq_adblocker/tasks/install.yml b/friedhof/mgrote_dnsmasq_adblocker/tasks/install.yml new file mode 100644 index 00000000..f95c0cee --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/tasks/install.yml @@ -0,0 +1,62 @@ +--- +- name: ensure packages are installed + become: true + ansible.builtin.package: + name: + - dnsmasq + - wget + state: present + register: install + +- name: stop dnsmasq (to prevent accidental DHCP-Server after installation) + become: true + ansible.builtin.service: + name: dnsmasq + state: stopped + when: install.changed + +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ dnsmasq_user_group }}" + state: present + when: + - dnsmasq_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + ansible.builtin.shell: /usr/sbin/nologin + create_home: false + when: + - dnsmasq_user_group is defined + - dnsmasq_user is defined + +- name: ensure needed directories exists + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ dnsmasq_user }}" + group: "{{ dnsmasq_user_group }}" + loop: + - /etc/dnsmasq.d + - /etc/dnsmasq.d/blocklists + +- name: clear default directories + become: true + ansible.builtin.file: + path: "{{ item }}" + state: absent + loop: + - /etc/dnsmasq.d/README + +- name: template logrotate config + become: true + ansible.builtin.template: + src: logrotate.j2 + dest: /etc/logrotate.d/dnsmasq + owner: root + group: root diff --git a/friedhof/mgrote_dnsmasq_adblocker/tasks/main.yml b/friedhof/mgrote_dnsmasq_adblocker/tasks/main.yml new file mode 100644 index 00000000..0cfd97c1 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/tasks/main.yml @@ -0,0 +1,12 @@ +--- +- name: include install tasks + ansible.builtin.include_tasks: install.yml + +- name: include configuration tasks + ansible.builtin.include_tasks: config.yml + +- name: include systemd tasks + ansible.builtin.include_tasks: services.yml + +- name: include blocklist tasks + ansible.builtin.include_tasks: blocklist.yml diff --git a/friedhof/mgrote_dnsmasq_adblocker/tasks/services.yml b/friedhof/mgrote_dnsmasq_adblocker/tasks/services.yml new file mode 100644 index 00000000..f240ce4e --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/tasks/services.yml @@ -0,0 +1,18 @@ +--- +- name: stop systemd-resolved service + ansible.builtin.systemd: + name: systemd-resolved + state: stopped + +- name: mask systemd-resolved service + ansible.builtin.systemd: + name: systemd-resolved + masked: true + state: stopped + +- name: template /etc/resolv.conf + ansible.builtin.template: + src: resolv.conf.j2 + dest: /etc/resolv.conf + backup: true + notify: restart dnsmasq diff --git a/friedhof/mgrote_dnsmasq_adblocker/templates/dnsmasq.conf.j2 b/friedhof/mgrote_dnsmasq_adblocker/templates/dnsmasq.conf.j2 new file mode 100644 index 00000000..382b3214 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/templates/dnsmasq.conf.j2 @@ -0,0 +1,63 @@ +{{ file_header | default () }} +# Listen on this specific port instead of the standard DNS port +# (53). Setting this to zero completely disables DNS function, +# leaving only DHCP and/or TFTP. +port={{ dnsmasq_port }} + +# If you want dnsmasq to listen for DHCP and DNS requests only on +# specified interfaces (and the loopback) give the name of the +# interface (eg eth0) here. +# Repeat the line for more than one interface. +interface={{ ansible_default_ipv4.interface }} + +# If you want dnsmasq to provide only DNS service on an interface, +# configure it as shown above, and then use the following line to +# disable DHCP and TFTP on it. +no-dhcp-interface={{ ansible_default_ipv4.interface }} + +# Set the cachesize here. +cache-size={{ dnsmasq_cache_size }} + +log-facility={{ dnsmasq_logfile }} + +# Never forward plain names (without a dot or domain part) +domain-needed + +# Never forward addresses in the non-routed address spaces. +bogus-priv + +# If you don't want dnsmasq to read /etc/hosts, uncomment the +# following line. +no-hosts + +# Add local-only domains here, queries in these domains are answered +# from /etc/hosts or DHCP only. +local=/{{ dnsmasq_never_forward_domain }}/ + +# RFC 6761: Caching DNS servers SHOULD recognize +# test, localhost, invalid +# names as special and SHOULD NOT attempt to look up NS records for them, or +# otherwise query authoritative DNS servers in an attempt to resolve these +# names. +server=/test/ +server=/localhost/ +server=/invalid/ + +# OpenWRT furthermore blocks bind, local, onion domains +# see https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob_plain;f=package/network/services/dnsmasq/files/rfc6761.conf;hb=HEAD +# and https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml +server=/bind/ +server=/onion/ + +# If you don't want dnsmasq to read /etc/hosts, uncomment the +# following line. +#no-hosts +# or if you want it to read another file, as well as /etc/hosts, use +# this. +addn-hosts=/etc/dnsmasq.d/blocklists + +{% if dnsmasq_log_queries is sameas true %} +# For debugging purposes, log each DNS query as it passes through +# dnsmasq. +log-queries +{% endif %} diff --git a/roles/_mgrote.musterrolle/templates/logrotate_restic b/friedhof/mgrote_dnsmasq_adblocker/templates/logrotate.j2 similarity index 62% rename from roles/_mgrote.musterrolle/templates/logrotate_restic rename to friedhof/mgrote_dnsmasq_adblocker/templates/logrotate.j2 index 5fbaaf66..bb72c21d 100644 --- a/roles/_mgrote.musterrolle/templates/logrotate_restic +++ b/friedhof/mgrote_dnsmasq_adblocker/templates/logrotate.j2 @@ -1,12 +1,15 @@ {{ file_header | default () }} -/var/log/restic.log { +{{ dnsmasq_logfile }} { su root root create 0640 root root rotate 4 - weekly + daily compress missingok notifempty dateext dateyesterday + postrotate + systemctl restart dnsmasq + endscript } diff --git a/friedhof/mgrote_dnsmasq_adblocker/templates/resolv.conf.j2 b/friedhof/mgrote_dnsmasq_adblocker/templates/resolv.conf.j2 new file mode 100644 index 00000000..24cc4d58 --- /dev/null +++ b/friedhof/mgrote_dnsmasq_adblocker/templates/resolv.conf.j2 @@ -0,0 +1,4 @@ +{{ file_header | default () }} +{% for item in dnsmasq_resolver %} +nameserver {{ item }} +{% endfor %} diff --git a/roles/mgrote.docker-compose-deploy/LICENSE b/friedhof/mgrote_docker_compose_deploy/LICENSE similarity index 100% rename from roles/mgrote.docker-compose-deploy/LICENSE rename to friedhof/mgrote_docker_compose_deploy/LICENSE diff --git a/roles/mgrote.docker-compose-deploy/README.md b/friedhof/mgrote_docker_compose_deploy/README.md similarity index 100% rename from roles/mgrote.docker-compose-deploy/README.md rename to friedhof/mgrote_docker_compose_deploy/README.md diff --git a/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-down.yml b/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-down.yml new file mode 100644 index 00000000..e1ea2e39 --- /dev/null +++ b/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-down.yml @@ -0,0 +1,24 @@ +--- +- name: set dir - "{{ item.name }}" + ansible.builtin.set_fact: + project_dir: "{{ docker_compose_base_dir }}/{{ item.dir_name | default (item.name) }}" + when: + - docker_compose_base_dir is defined + - docker_compose_projects is defined + +- name: check if dir exists + ansible.builtin.stat: + path: "{{ project_dir }}" + register: dir + +- name: stop container - "{{ item.name }}" + ansible.builtin.shell: docker-compose down + args: + chdir: "{{ project_dir }}" + when: dir.stat.exists + +- name: remove repository - "{{ item.name }}" + ansible.builtin.file: + state: absent + dest: "{{ project_dir }}" + when: dir.stat.exists diff --git a/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-up.yml b/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-up.yml new file mode 100644 index 00000000..2ea5937c --- /dev/null +++ b/friedhof/mgrote_docker_compose_deploy/tasks/dockercompose-up.yml @@ -0,0 +1,64 @@ +--- +- name: set username and passwort - "{{ item.name }}" + ansible.builtin.set_fact: + login: "{{ item.repository_user }}:{{ item.repository_user_password }}@" + when: + - item.repository_user is defined + - item.repository_user_password is defined + +- name: set dir - "{{ item.name }}" + ansible.builtin.set_fact: + project_dir: "{{ docker_compose_base_dir }}/{{ item.dir_name | default (item.name) }}" + when: + - docker_compose_base_dir is defined + - docker_compose_projects is defined + +- name: check if repo exists - "{{ item.name }}" (wenn der Task >30s dauert sind die Login-Daten falsch) + ansible.builtin.stat: + path: "{{ project_dir }}" + register: repo_exists + +- name: set safe directory + become: true + ansible.builtin.shell: + cmd: git config --global --add safe.directory "{{ project_dir }}" + changed_when: false + +- name: stash changes - "{{ item.name }}" + ansible.builtin.shell: git stash + args: + chdir: "{{ project_dir }}" + changed_when: false + when: repo_exists.stat.exists + +- name: clone repository - "{{ item.name }}" + ansible.builtin.git: + repo: "https://{{ login | default () }}{{ item.repository_url }}" + dest: "{{ project_dir }}" + version: "{{ item.git_branch | default ('master') }}" + register: repo + +- name: set owner recursive for repo + ansible.builtin.file: + path: "{{ project_dir }}" + owner: "{{ item.os_username }}" + group: "{{ item.os_username }}" + recurse: true + when: repo is changed + +- name: create networks - "{{ item.name }}" + ansible.builtin.shell: "docker network create {{ item.network_name }}" # erstelle network + when: "item.network_name is defined" # wenn network_name definiert ist + register: network_result # speichere ergebnis in var + changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 + ignore_errors: true # ignoriere fehler + +- name: (re)start container - "{{ item.name }}" + ansible.builtin.shell: docker-compose down && docker-compose up -d + args: + chdir: "{{ project_dir }}" + when: repo.changed + +- name: unset username and passwort - "{{ item.name }}" + ansible.builtin.set_fact: + login: "" diff --git a/friedhof/mgrote_docker_compose_deploy/tasks/main.yml b/friedhof/mgrote_docker_compose_deploy/tasks/main.yml new file mode 100644 index 00000000..2dd5d728 --- /dev/null +++ b/friedhof/mgrote_docker_compose_deploy/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: loop docker tasks - up + ansible.builtin.include_tasks: dockercompose-up.yml + loop: "{{ docker_compose_projects }}" + when: + - item.state == "present" + - docker_compose_projects is defined + no_log: true + +- name: loop docker tasks - down + ansible.builtin.include_tasks: dockercompose-down.yml + loop: "{{ docker_compose_projects }}" + when: + - item.state == "absent" + - docker_compose_projects is defined + no_log: true diff --git a/roles/mgrote.docker-compose-inline/LICENSE b/friedhof/mgrote_i3/LICENSE similarity index 100% rename from roles/mgrote.docker-compose-inline/LICENSE rename to friedhof/mgrote_i3/LICENSE diff --git a/roles/mgrote.dokuwiki/LICENSE b/friedhof/mgrote_i3/mgrote.i3/LICENSE similarity index 100% rename from roles/mgrote.dokuwiki/LICENSE rename to friedhof/mgrote_i3/mgrote.i3/LICENSE diff --git a/roles/mgrote.i3/readme.md b/friedhof/mgrote_i3/mgrote.i3/readme.md similarity index 100% rename from roles/mgrote.i3/readme.md rename to friedhof/mgrote_i3/mgrote.i3/readme.md diff --git a/friedhof/mgrote_i3/mgrote.i3/tasks/main.yml b/friedhof/mgrote_i3/mgrote.i3/tasks/main.yml new file mode 100644 index 00000000..f39bedee --- /dev/null +++ b/friedhof/mgrote_i3/mgrote.i3/tasks/main.yml @@ -0,0 +1,15 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - i3 + - i3lock + - arandr + - x11-xserver-utils # xrandr + - feh # wallpaper + - rofi + - xautolock #bildschirmsperre nach x min + - flameshot #screenshots + - dunst #notification daemon + state: present diff --git a/friedhof/mgrote_i3/readme.md b/friedhof/mgrote_i3/readme.md new file mode 100644 index 00000000..f45cf8a6 --- /dev/null +++ b/friedhof/mgrote_i3/readme.md @@ -0,0 +1,4 @@ +## mgrote.vim + +### Beschreibung +installiert i3 + tools. diff --git a/friedhof/mgrote_i3/tasks/main.yml b/friedhof/mgrote_i3/tasks/main.yml new file mode 100644 index 00000000..f39bedee --- /dev/null +++ b/friedhof/mgrote_i3/tasks/main.yml @@ -0,0 +1,15 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - i3 + - i3lock + - arandr + - x11-xserver-utils # xrandr + - feh # wallpaper + - rofi + - xautolock #bildschirmsperre nach x min + - flameshot #screenshots + - dunst #notification daemon + state: present diff --git a/roles/mgrote.dotfiles/LICENSE b/friedhof/mgrote_minio/LICENSE similarity index 100% rename from roles/mgrote.dotfiles/LICENSE rename to friedhof/mgrote_minio/LICENSE diff --git a/roles/mgrote.minio/README.md b/friedhof/mgrote_minio/README.md similarity index 100% rename from roles/mgrote.minio/README.md rename to friedhof/mgrote_minio/README.md diff --git a/friedhof/mgrote_minio/defaults/main.yml b/friedhof/mgrote_minio/defaults/main.yml new file mode 100644 index 00000000..72481169 --- /dev/null +++ b/friedhof/mgrote_minio/defaults/main.yml @@ -0,0 +1,20 @@ +--- +minio_download_url: https://dl.min.io/server/minio/release/linux-amd64/minio # downloadlink + +minio_bin_path: /usr/local/bin # where to put the binary +minio_volumes_base_dir: /usr/local/share/minio/ # where to store the buckets +minio_config_dir: /etc/minio # where to store the config + +minio_fqdn: minio-test.grote.lan +minio_port: 9000 # s3 port +minio_console_port: 34081 # mgmt-gui port + +minio_root_user: minio # default web user +minio_root_password: miniostorage # defaut pass + +minio_user: minio-user # linux user +minio_group: minio-user # linux group + +minio_server_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html + +minio_browser_redirect_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html diff --git a/friedhof/mgrote_minio/handlers/main.yml b/friedhof/mgrote_minio/handlers/main.yml new file mode 100644 index 00000000..1f4ae1d4 --- /dev/null +++ b/friedhof/mgrote_minio/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: (re)start service + become: true + ansible.builtin.systemd: + name: minio + state: restarted diff --git a/roles/mgrote.exa/LICENSE b/friedhof/mgrote_minio/mgrote.minio/LICENSE similarity index 100% rename from roles/mgrote.exa/LICENSE rename to friedhof/mgrote_minio/mgrote.minio/LICENSE diff --git a/friedhof/mgrote_minio/mgrote.minio/README.md b/friedhof/mgrote_minio/mgrote.minio/README.md new file mode 100644 index 00000000..198a277e --- /dev/null +++ b/friedhof/mgrote_minio/mgrote.minio/README.md @@ -0,0 +1,12 @@ +## mgrote.minio + +### Beschreibung +Installiert einen Single-Minio-Server. + +### getestet auf +- [X] Ubuntu (>=20.04) +- [ ] Debian +- [ ] ProxMox 6.1 + +### Variablen + Defaults +see [defaults](./defaults/main.yml) diff --git a/friedhof/mgrote_minio/mgrote.minio/defaults/main.yml b/friedhof/mgrote_minio/mgrote.minio/defaults/main.yml new file mode 100644 index 00000000..72481169 --- /dev/null +++ b/friedhof/mgrote_minio/mgrote.minio/defaults/main.yml @@ -0,0 +1,20 @@ +--- +minio_download_url: https://dl.min.io/server/minio/release/linux-amd64/minio # downloadlink + +minio_bin_path: /usr/local/bin # where to put the binary +minio_volumes_base_dir: /usr/local/share/minio/ # where to store the buckets +minio_config_dir: /etc/minio # where to store the config + +minio_fqdn: minio-test.grote.lan +minio_port: 9000 # s3 port +minio_console_port: 34081 # mgmt-gui port + +minio_root_user: minio # default web user +minio_root_password: miniostorage # defaut pass + +minio_user: minio-user # linux user +minio_group: minio-user # linux group + +minio_server_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html + +minio_browser_redirect_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html diff --git a/friedhof/mgrote_minio/mgrote.minio/handlers/main.yml b/friedhof/mgrote_minio/mgrote.minio/handlers/main.yml new file mode 100644 index 00000000..1f4ae1d4 --- /dev/null +++ b/friedhof/mgrote_minio/mgrote.minio/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: (re)start service + become: true + ansible.builtin.systemd: + name: minio + state: restarted diff --git a/friedhof/mgrote_minio/mgrote.minio/tasks/main.yml b/friedhof/mgrote_minio/mgrote.minio/tasks/main.yml new file mode 100644 index 00000000..05a5a677 --- /dev/null +++ b/friedhof/mgrote_minio/mgrote.minio/tasks/main.yml @@ -0,0 +1,62 @@ +--- +- name: ensure group exists + ansible.builtin.group: + name: "{{ minio_group }}" + state: present + +- name: ensure user exists + ansible.builtin.user: + name: "{{ minio_user }}" + group: "{{ minio_group }}" + ansible.builtin.shell: /sbin/nologin + state: present + create_home: false + +- name: ensure needed directories are present + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + with_items: + - "{{ minio_volumes_base_dir }}" + - "{{ minio_config_dir }}" + +- name: download binary + ansible.builtin.get_url: + url: "{{ minio_download_url }}" + dest: "{{ minio_bin_path }}/minio" + mode: "0744" + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + +- name: template default config + become: true + ansible.builtin.template: + src: "default.j2" + dest: "/etc/default/minio" + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + notify: (re)start service + no_log: true + +- name: template systemd-unit + become: true + ansible.builtin.template: + src: "minio.service.j2" + dest: "/etc/systemd/system/minio.service" + mode: a+x + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + notify: (re)start service + +- name: systemd daemon reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: enable systemd service + become: true + ansible.builtin.systemd: + name: minio + enabled: true diff --git a/roles/mgrote.minio/templates/default.j2 b/friedhof/mgrote_minio/mgrote.minio/templates/default.j2 similarity index 100% rename from roles/mgrote.minio/templates/default.j2 rename to friedhof/mgrote_minio/mgrote.minio/templates/default.j2 diff --git a/roles/mgrote.minio/templates/minio.service.j2 b/friedhof/mgrote_minio/mgrote.minio/templates/minio.service.j2 similarity index 100% rename from roles/mgrote.minio/templates/minio.service.j2 rename to friedhof/mgrote_minio/mgrote.minio/templates/minio.service.j2 diff --git a/friedhof/mgrote_minio/tasks/main.yml b/friedhof/mgrote_minio/tasks/main.yml new file mode 100644 index 00000000..05a5a677 --- /dev/null +++ b/friedhof/mgrote_minio/tasks/main.yml @@ -0,0 +1,62 @@ +--- +- name: ensure group exists + ansible.builtin.group: + name: "{{ minio_group }}" + state: present + +- name: ensure user exists + ansible.builtin.user: + name: "{{ minio_user }}" + group: "{{ minio_group }}" + ansible.builtin.shell: /sbin/nologin + state: present + create_home: false + +- name: ensure needed directories are present + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + with_items: + - "{{ minio_volumes_base_dir }}" + - "{{ minio_config_dir }}" + +- name: download binary + ansible.builtin.get_url: + url: "{{ minio_download_url }}" + dest: "{{ minio_bin_path }}/minio" + mode: "0744" + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + +- name: template default config + become: true + ansible.builtin.template: + src: "default.j2" + dest: "/etc/default/minio" + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + notify: (re)start service + no_log: true + +- name: template systemd-unit + become: true + ansible.builtin.template: + src: "minio.service.j2" + dest: "/etc/systemd/system/minio.service" + mode: a+x + owner: "{{ minio_user }}" + group: "{{ minio_user }}" + notify: (re)start service + +- name: systemd daemon reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: enable systemd service + become: true + ansible.builtin.systemd: + name: minio + enabled: true diff --git a/friedhof/mgrote_minio/templates/default.j2 b/friedhof/mgrote_minio/templates/default.j2 new file mode 100644 index 00000000..fc15b740 --- /dev/null +++ b/friedhof/mgrote_minio/templates/default.j2 @@ -0,0 +1,7 @@ +MINIO_ROOT_USER="{{ minio_root_user }}" +MINIO_VOLUMES="{{ minio_volumes_base_dir }}" +MINIO_OPTS="-C {{ minio_config_dir }} --address {{ minio_fqdn }}:{{ minio_port }} --console-address :{{ minio_console_port }}" +MINIO_ROOT_PASSWORD="{{ minio_root_password }}" + +MINIO_SERVER_URL="{{ minio_server_url }}" +MINIO_BROWSER_REDIRECT_URL="{{ minio_browser_redirect_url}}" diff --git a/friedhof/mgrote_minio/templates/minio.service.j2 b/friedhof/mgrote_minio/templates/minio.service.j2 new file mode 100644 index 00000000..29486dab --- /dev/null +++ b/friedhof/mgrote_minio/templates/minio.service.j2 @@ -0,0 +1,36 @@ +[Unit] +Description=MinIO +Documentation=https://docs.min.io +Wants=network-online.target +After=network-online.target +AssertFileIsExecutable=/usr/local/bin/minio + +[Service] +WorkingDirectory=/usr/local/ + +User={{ minio_user }} +Group={{ minio_group }} +ProtectProc=invisible + +EnvironmentFile=/etc/default/minio +ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" + +ExecStart={{ minio_bin_path }}/minio server $MINIO_OPTS $MINIO_VOLUMES + +# Let systemd restart this service always +Restart=always + +# Specifies the maximum file descriptor number that can be opened by this process +LimitNOFILE=65536 + +# Specifies the maximum number of threads this process can create +TasksMax=infinity + +# Disable timeout logic and wait until process is stopped +TimeoutStopSec=infinity +SendSIGKILL=no + +[Install] +WantedBy=multi-user.target + +# Built for ${project.name}-${project.version} (${project.name}) diff --git a/roles/mgrote.motd/README.md b/friedhof/mgrote_motd/README.md similarity index 100% rename from roles/mgrote.motd/README.md rename to friedhof/mgrote_motd/README.md diff --git a/friedhof/mgrote_motd/defaults/main.yml b/friedhof/mgrote_motd/defaults/main.yml new file mode 100644 index 00000000..37927134 --- /dev/null +++ b/friedhof/mgrote_motd/defaults/main.yml @@ -0,0 +1,12 @@ +--- +motd_wetter_ort: "Magdeburg" +motd_wetter_aktiv: false +motd_fortune_aktiv: false + +managed_files: + - 00-ansible + - 05-fortune + - 10-wetter + - 20-facts + - 90-updates + - 91-reboot diff --git a/friedhof/mgrote_motd/handlers/main.yml b/friedhof/mgrote_motd/handlers/main.yml new file mode 100644 index 00000000..7519b0d8 --- /dev/null +++ b/friedhof/mgrote_motd/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: restart_sshd + become: true + ansible.builtin.systemd: + name: sshd + state: restarted diff --git a/friedhof/mgrote_motd/tasks/base.yml b/friedhof/mgrote_motd/tasks/base.yml new file mode 100644 index 00000000..e08740cc --- /dev/null +++ b/friedhof/mgrote_motd/tasks/base.yml @@ -0,0 +1,70 @@ +--- +# - name: install packages +# become: true +# ansible.builtin.package: +# name: +# - update-motd +# state: present +# when: "ansible_facts['distribution'] == 'Ubuntu'" + +- name: remove default packages + become: true + ansible.builtin.package: + name: + - motd-news-config + state: absent + +- name: 'remove unwanted motd messages' + become: true + ansible.builtin.file: + path: '/etc/update-motd.d/{{ item }}' + state: absent + with_items: + - 00-header + - 10-help-text + - 10-uname + - 50-motd-news + - 80-livepatch + - 50-landscape-sysinfo + - 51-cloudguest + - 99-esm + - 00-ansible + - 20-facts + - 90-updates + - 91-reboot + - 90-updates-available + - 91-release-upgrade + +- name: delete "no warranty" - Message + become: true + ansible.builtin.file: + path: /etc/motd + state: absent + +- name: setup new motd + become: true + ansible.builtin.template: + src: '{{ item }}' + dest: '/etc/update-motd.d/{{ item }}' + owner: root + group: root + mode: "0755" + with_items: + - 00-ansible-mgrote + - 20-facts-mgrote + - 90-updates-mgrote + - 91-reboot-mgrote + +- name: delete fortune + become: true + ansible.builtin.file: + path: /etc/update-motd.d/05-fortune-mgrote + state: absent + when: falset motd_fortune_aktiv + +- name: delete Wetter + become: true + ansible.builtin.file: + path: '/etc/update-motd.d/10-wetter-mgrote' + state: absent + when: falset motd_wetter_aktiv diff --git a/friedhof/mgrote_motd/tasks/fortune.yml b/friedhof/mgrote_motd/tasks/fortune.yml new file mode 100644 index 00000000..d8678db9 --- /dev/null +++ b/friedhof/mgrote_motd/tasks/fortune.yml @@ -0,0 +1,16 @@ +--- +- name: install fortune + become: true + ansible.builtin.package: + name: + - fortune + state: present + +- name: setup new motd - fortune + become: true + ansible.builtin.template: + src: '05-fortune-mgrote' + dest: '/etc/update-motd.d/05-fortune-mgrote' + owner: root + group: root + mode: "0755" diff --git a/friedhof/mgrote_motd/tasks/main.yml b/friedhof/mgrote_motd/tasks/main.yml new file mode 100644 index 00000000..08a3b68b --- /dev/null +++ b/friedhof/mgrote_motd/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: include systemctl tasks + ansible.builtin.include_tasks: systemctl.yml + +- name: include base tasks + ansible.builtin.include_tasks: base.yml + +- name: include fortune tasks + ansible.builtin.include_tasks: fortune.yml + when: + - motd_wetter_aktiv + +- name: include weather tasks + ansible.builtin.include_tasks: weather.yml + when: + - motd_wetter_aktiv diff --git a/friedhof/mgrote_motd/tasks/systemctl.yml b/friedhof/mgrote_motd/tasks/systemctl.yml new file mode 100644 index 00000000..441612d3 --- /dev/null +++ b/friedhof/mgrote_motd/tasks/systemctl.yml @@ -0,0 +1,10 @@ +--- +- name: stop units + become: true + ansible.builtin.systemd: + name: motd-news + masked: true + state: stopped + enabled: false + daemon_reload: true + ignore_errors: true diff --git a/friedhof/mgrote_motd/tasks/weather.yml b/friedhof/mgrote_motd/tasks/weather.yml new file mode 100644 index 00000000..93337563 --- /dev/null +++ b/friedhof/mgrote_motd/tasks/weather.yml @@ -0,0 +1,9 @@ +--- +- name: setup new motd - wetter + become: true + ansible.builtin.template: + src: '10-wetter-mgrote' + dest: '/etc/update-motd.d/10-wetter-mgrote' + owner: root + group: root + mode: "0755" diff --git a/roles/mgrote.motd/templates/00-ansible-mgrote b/friedhof/mgrote_motd/templates/00-ansible-mgrote similarity index 100% rename from roles/mgrote.motd/templates/00-ansible-mgrote rename to friedhof/mgrote_motd/templates/00-ansible-mgrote diff --git a/roles/mgrote.motd/templates/05-fortune-mgrote b/friedhof/mgrote_motd/templates/05-fortune-mgrote similarity index 100% rename from roles/mgrote.motd/templates/05-fortune-mgrote rename to friedhof/mgrote_motd/templates/05-fortune-mgrote diff --git a/roles/mgrote.motd/templates/10-wetter-mgrote b/friedhof/mgrote_motd/templates/10-wetter-mgrote similarity index 100% rename from roles/mgrote.motd/templates/10-wetter-mgrote rename to friedhof/mgrote_motd/templates/10-wetter-mgrote diff --git a/roles/mgrote.motd/templates/20-facts-mgrote b/friedhof/mgrote_motd/templates/20-facts-mgrote similarity index 100% rename from roles/mgrote.motd/templates/20-facts-mgrote rename to friedhof/mgrote_motd/templates/20-facts-mgrote diff --git a/roles/mgrote.motd/templates/90-updates-mgrote b/friedhof/mgrote_motd/templates/90-updates-mgrote similarity index 100% rename from roles/mgrote.motd/templates/90-updates-mgrote rename to friedhof/mgrote_motd/templates/90-updates-mgrote diff --git a/roles/mgrote.motd/templates/91-reboot-mgrote b/friedhof/mgrote_motd/templates/91-reboot-mgrote similarity index 100% rename from roles/mgrote.motd/templates/91-reboot-mgrote rename to friedhof/mgrote_motd/templates/91-reboot-mgrote diff --git a/friedhof/mgrote_munin_node/defaults/main.yml b/friedhof/mgrote_munin_node/defaults/main.yml new file mode 100644 index 00000000..fafaf701 --- /dev/null +++ b/friedhof/mgrote_munin_node/defaults/main.yml @@ -0,0 +1,33 @@ +--- +munin_user_group: root # group to which the user belongs +munin_node_log: /var/log/munin/munin-node.log +munin_node_pid: /var/run/munin/munin-node.pid +munin_node_plugin_timeout: 60 # in sec +munin_node_global_timeout: 900 # in sec +munin_node_host_name: '' # Set this if the client doesn't report the correct hostname +munin_node_allowed_ips: # A list of addresses that are allowed to connect Munin requires IPs be added as regular expressions. + - '^127\.0\.0\.1$' + - '^::1$' +munin_node_allowed_cidrs: [192.168.2.0/24] # A list of addresses that are allowed to connect +munin_node_denied_cidrs: [] # a list of addresses that are not allowed to connect +munin_node_bind_host: "0.0.0.0" # bind to interface +munin_node_bind_port: "4949" # bind to port +munin_node_log_level: 4 # Loglevel + +# Plugin configuration options (the key is the plugin heading, items within will +# be options for the plugin). +# Source and destination of munin plugins. +munin_plugin_src_path: /usr/share/munin/plugins/ +munin_plugin_dest_path: /etc/munin/plugins/ +munin_plugin_conf_dest_path: /etc/munin/plugin-conf.d/ +# munin_node_plugins: #plugins to install +# - name: docker_volumes # name +# src: https://git.mgrote.net/mg/mirror-munin-contrib/raw/branch/master/plugins/docker/docker_ #src +# config_file_name: /etc/munin/plugin-conf.d/docker # where to put plugin config + # content of config +# config: | +# user root +# env.DOCKER_HOST unix://run/docker.sock + +# munin_node_disabled_plugins: # remove plugins from running config +# - name: meminfo diff --git a/friedhof/mgrote_munin_node/handlers/main.yml b/friedhof/mgrote_munin_node/handlers/main.yml new file mode 100644 index 00000000..1305c543 --- /dev/null +++ b/friedhof/mgrote_munin_node/handlers/main.yml @@ -0,0 +1,15 @@ +--- +- name: restart munin-node + ansible.builtin.service: + name: munin-node + state: restarted + +- name: munin-node-configure --shell # noqa ignore-errors + ansible.builtin.command: munin-node-configure --shell + register: output_conf + changed_when: "output_conf.rc != 0" + ignore_errors: true # ignoriere fehler + +- name: munin-node-configure --shell - 2 # noqa ignore-errors + ansible.builtin.command: munin-node-configure --shell --families=contrib,auto | sh -x + ignore_errors: true # ignoriere fehler diff --git a/roles/mgrote.munin-node/readme.md b/friedhof/mgrote_munin_node/readme.md similarity index 100% rename from roles/mgrote.munin-node/readme.md rename to friedhof/mgrote_munin_node/readme.md diff --git a/friedhof/mgrote_munin_node/tasks/additional.yml b/friedhof/mgrote_munin_node/tasks/additional.yml new file mode 100644 index 00000000..6061c696 --- /dev/null +++ b/friedhof/mgrote_munin_node/tasks/additional.yml @@ -0,0 +1,37 @@ +--- +- name: download additional plugins + ansible.builtin.get_url: + url: "{{ item.src }}" + dest: "{{ munin_plugin_src_path }}{{ item.name }}" + mode: '0755' + loop: "{{ munin_node_plugins }}" + notify: restart munin-node + no_log: true + check_mode: false # damit werden auch im check-mode die Plugins heruntergeladen, sonst schlägt der nächste Task fehl + +- name: enable additional plugins + ansible.builtin.file: + src: "{{ munin_plugin_src_path }}{{ item.name }}" + dest: "{{ munin_plugin_dest_path }}{{ item.name }}" + state: link + notify: restart munin-node + loop: "{{ munin_node_plugins }}" + no_log: true + +- name: copy additional plugin-config + ansible.builtin.copy: + content: "{{ item.config }}" + dest: "{{ munin_plugin_conf_dest_path }}{{ item.name }}" + owner: root + group: root + mode: "0644" + notify: restart munin-node + loop: "{{ munin_node_plugins }}" + when: item.config is defined + no_log: true + +- name: Ensure munin-node is running. + ansible.builtin.service: + name: munin-node + state: started + enabled: true diff --git a/friedhof/mgrote_munin_node/tasks/install.yml b/friedhof/mgrote_munin_node/tasks/install.yml new file mode 100644 index 00000000..ed52e48e --- /dev/null +++ b/friedhof/mgrote_munin_node/tasks/install.yml @@ -0,0 +1,29 @@ +--- +- name: install packages + ansible.builtin.apt: + name: munin-node + state: present + notify: + - munin-node-configure --shell + - munin-node-configure --shell - 2 + +- name: create directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: root + group: root + mode: "0644" + loop: + - /etc/munin + - /etc/munin/plugin-conf.d + - /etc/munin/plugins + +- name: Copy munin-node configuration. + ansible.builtin.template: + src: munin-node.conf.j2 + dest: /etc/munin/munin-node.conf + owner: root + group: root + mode: "0644" + notify: restart munin-node diff --git a/friedhof/mgrote_munin_node/tasks/main.yml b/friedhof/mgrote_munin_node/tasks/main.yml new file mode 100644 index 00000000..688818dc --- /dev/null +++ b/friedhof/mgrote_munin_node/tasks/main.yml @@ -0,0 +1,11 @@ +--- +- name: include install-tasks + ansible.builtin.include_tasks: install.yml +- name: include user tasks + ansible.builtin.include_tasks: user.yml +- name: include plugin-tasks + ansible.builtin.include_tasks: additional.yml + when: munin_node_plugins is defined +- name: include remove-tasks + ansible.builtin.include_tasks: remove.yml + when: munin_node_disabled_plugins is defined diff --git a/friedhof/mgrote_munin_node/tasks/remove.yml b/friedhof/mgrote_munin_node/tasks/remove.yml new file mode 100644 index 00000000..18acd07e --- /dev/null +++ b/friedhof/mgrote_munin_node/tasks/remove.yml @@ -0,0 +1,16 @@ +--- +- name: remove unwanted plugins + ansible.builtin.file: + path: "{{ munin_plugin_dest_path }}{{ item.name }}" + state: absent + loop: "{{ munin_node_disabled_plugins }}" + notify: restart munin-node + when: munin_node_disabled_plugins is defined + +- name: remove additional plugin-config + ansible.builtin.file: + state: absent + dest: "{{ munin_plugin_conf_dest_path }}{{ item.name }}" + notify: restart munin-node + loop: "{{ munin_node_disabled_plugins }}" + when: munin_node_disabled_plugins is defined diff --git a/friedhof/mgrote_munin_node/tasks/user.yml b/friedhof/mgrote_munin_node/tasks/user.yml new file mode 100644 index 00000000..be0e785c --- /dev/null +++ b/friedhof/mgrote_munin_node/tasks/user.yml @@ -0,0 +1,26 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ munin_user_group }}" + state: present + +- name: ensure user exists + become: true + ansible.builtin.user: + name: munin + group: "{{ munin_user_group }}" + shell: /usr/sbin/nologin + create_home: false + +- name: add user to sudoers + become: true + ansible.builtin.blockinfile: + path: /etc/sudoers + state: present + block: | + munin ALL=(ALL) NOPASSWD:ALL + validate: '/usr/sbin/visudo -cf %s' + backup: true + marker_begin: munin-sudoers BEGIN + marker_end: munin-sudoers END diff --git a/roles/mgrote.munin-node/templates/munin-node.conf.j2 b/friedhof/mgrote_munin_node/templates/munin-node.conf.j2 similarity index 100% rename from roles/mgrote.munin-node/templates/munin-node.conf.j2 rename to friedhof/mgrote_munin_node/templates/munin-node.conf.j2 diff --git a/roles/mgrote.fail2ban/LICENSE b/friedhof/mgrote_ntp_chrony_server/LICENSE similarity index 100% rename from roles/mgrote.fail2ban/LICENSE rename to friedhof/mgrote_ntp_chrony_server/LICENSE diff --git a/roles/mgrote.ntp_chrony_server/README.md b/friedhof/mgrote_ntp_chrony_server/README.md similarity index 100% rename from roles/mgrote.ntp_chrony_server/README.md rename to friedhof/mgrote_ntp_chrony_server/README.md diff --git a/friedhof/mgrote_ntp_chrony_server/defaults/main.yml b/friedhof/mgrote_ntp_chrony_server/defaults/main.yml new file mode 100644 index 00000000..a37aa279 --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/defaults/main.yml @@ -0,0 +1,18 @@ +--- +ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet +ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile +ntp_chrony_servers: # welche Server sollen befragt werden + - address: ptbtime1.ptb.de + options: iburst #optionaler parameter + - address: ptbtime2.ptb.de + options: iburst + - address: ptbtime3.ptb.de + options: iburst + - address: time3.google.com + options: iburst + - address: ntp0.fau.de + options: iburst +ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_logging: false # logging an/aus +ntp_chrony_subnet_allow: 192.168.2.0/24 # welche Netze dürfen den Server befragen diff --git a/friedhof/mgrote_ntp_chrony_server/handlers/main.yml b/friedhof/mgrote_ntp_chrony_server/handlers/main.yml new file mode 100644 index 00000000..fac93e2f --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart_chrony + become: true + ansible.builtin.systemd: + name: chrony + enabled: true + state: restarted diff --git a/roles/mgrote.fluxcd/LICENSE b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/LICENSE similarity index 100% rename from roles/mgrote.fluxcd/LICENSE rename to friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/LICENSE diff --git a/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/README.md b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/README.md new file mode 100644 index 00000000..fe451830 --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/README.md @@ -0,0 +1,13 @@ +## mgrote.ntp_chrony_server + +### Beschreibung +Installiert chrony als ntp-server. + + +### getestet auf +- [x] Ubuntu (>=18.04) +- [ ] Debian +- [ ] ProxMox 6.1 + +### Variablen + Defaults +see [defaults](./defaults/main.yml) diff --git a/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/defaults/main.yml b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/defaults/main.yml new file mode 100644 index 00000000..a37aa279 --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/defaults/main.yml @@ -0,0 +1,18 @@ +--- +ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet +ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile +ntp_chrony_servers: # welche Server sollen befragt werden + - address: ptbtime1.ptb.de + options: iburst #optionaler parameter + - address: ptbtime2.ptb.de + options: iburst + - address: ptbtime3.ptb.de + options: iburst + - address: time3.google.com + options: iburst + - address: ntp0.fau.de + options: iburst +ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_logging: false # logging an/aus +ntp_chrony_subnet_allow: 192.168.2.0/24 # welche Netze dürfen den Server befragen diff --git a/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/handlers/main.yml b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/handlers/main.yml new file mode 100644 index 00000000..fac93e2f --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart_chrony + become: true + ansible.builtin.systemd: + name: chrony + enabled: true + state: restarted diff --git a/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/tasks/main.yml b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/tasks/main.yml new file mode 100644 index 00000000..9f0c2d49 --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/tasks/main.yml @@ -0,0 +1,59 @@ +--- +- name: mask systemd-timesyncd service + become: true + ansible.builtin.systemd: + name: systemd-timesyncd + state: stopped + masked: true + +- name: gather package facts + become: true + ansible.builtin.package_facts: + manager: auto + +- name: stop and mask ntp service + become: true + ansible.builtin.systemd: + name: ntp + masked: true + state: stopped + when: "'ntp' in ansible_facts.packages" + +- name: install chrony packages + become: true + ansible.builtin.package: + name: + - chrony + state: present + notify: restart_chrony + +- name: copy chrony config + become: true + ansible.builtin.template: + src: chrony.conf.j2 + dest: /etc/chrony/chrony.conf + mode: "0755" + notify: restart_chrony + +- name: copy logrotate config + become: true + ansible.builtin.template: + src: logrotate_chrony + dest: /etc/logrotate.d/chrony + owner: root + group: root + mode: "0644" +- name: Create chrony driftfile folder + become: true + ansible.builtin.file: + state: directory + path: "{{ ntp_chrony_driftfile_directory }}" + mode: "0755" + owner: "{{ ntp_chrony_user }}" + group: "{{ ntp_chrony_group }}" + notify: restart_chrony + +- name: set timezone to {{ ntp_chrony_timezone }} + become: true + community.general.timezone: + name: "{{ ntp_chrony_timezone }}" diff --git a/roles/mgrote.ntp_chrony_server/templates/chrony.conf.j2 b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/templates/chrony.conf.j2 similarity index 100% rename from roles/mgrote.ntp_chrony_server/templates/chrony.conf.j2 rename to friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/templates/chrony.conf.j2 diff --git a/roles/mgrote.ntp_chrony_client/templates/logrotate_chrony b/friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/templates/logrotate_chrony similarity index 100% rename from roles/mgrote.ntp_chrony_client/templates/logrotate_chrony rename to friedhof/mgrote_ntp_chrony_server/mgrote.ntp_chrony_server/templates/logrotate_chrony diff --git a/friedhof/mgrote_ntp_chrony_server/tasks/main.yml b/friedhof/mgrote_ntp_chrony_server/tasks/main.yml new file mode 100644 index 00000000..9f0c2d49 --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/tasks/main.yml @@ -0,0 +1,59 @@ +--- +- name: mask systemd-timesyncd service + become: true + ansible.builtin.systemd: + name: systemd-timesyncd + state: stopped + masked: true + +- name: gather package facts + become: true + ansible.builtin.package_facts: + manager: auto + +- name: stop and mask ntp service + become: true + ansible.builtin.systemd: + name: ntp + masked: true + state: stopped + when: "'ntp' in ansible_facts.packages" + +- name: install chrony packages + become: true + ansible.builtin.package: + name: + - chrony + state: present + notify: restart_chrony + +- name: copy chrony config + become: true + ansible.builtin.template: + src: chrony.conf.j2 + dest: /etc/chrony/chrony.conf + mode: "0755" + notify: restart_chrony + +- name: copy logrotate config + become: true + ansible.builtin.template: + src: logrotate_chrony + dest: /etc/logrotate.d/chrony + owner: root + group: root + mode: "0644" +- name: Create chrony driftfile folder + become: true + ansible.builtin.file: + state: directory + path: "{{ ntp_chrony_driftfile_directory }}" + mode: "0755" + owner: "{{ ntp_chrony_user }}" + group: "{{ ntp_chrony_group }}" + notify: restart_chrony + +- name: set timezone to {{ ntp_chrony_timezone }} + become: true + community.general.timezone: + name: "{{ ntp_chrony_timezone }}" diff --git a/friedhof/mgrote_ntp_chrony_server/templates/chrony.conf.j2 b/friedhof/mgrote_ntp_chrony_server/templates/chrony.conf.j2 new file mode 100644 index 00000000..edb61b8f --- /dev/null +++ b/friedhof/mgrote_ntp_chrony_server/templates/chrony.conf.j2 @@ -0,0 +1,32 @@ +{{ file_header | default () }} +# servers +{% for item in ntp_chrony_servers %} +server {{ item.address }} {{ item.options |default() }} +{% endfor %} + +# keys +keyfile /etc/chrony/chrony.keys + +# driftfile +driftfile {{ ntp_chrony_driftfile_directory }}/chrony.drift + + +{% if ntp_chrony_logging is sameas true %} +# Logging +log tracking measurements statistics +logdir /var/log/chrony +{% endif %} + +# Stop bad estimates upsetting machine clock. +maxupdateskew 100.0 + +# This directive enables kernel synchronisation (every 11 minutes) of the +# real-time clock. Note that it can’t be used along with the 'rtcfile' directive. +rtcsync + +# Step the system clock instead of slewing it if the adjustment is larger than +# one second, but only in the first three clock updates. +makestep 1 3 + +# chrony as ntp server +allow {{ ntp_chrony_subnet_allow }} diff --git a/roles/mgrote.ntp_chrony_server/templates/logrotate_chrony b/friedhof/mgrote_ntp_chrony_server/templates/logrotate_chrony similarity index 100% rename from roles/mgrote.ntp_chrony_server/templates/logrotate_chrony rename to friedhof/mgrote_ntp_chrony_server/templates/logrotate_chrony diff --git a/roles/mgrote.fwupd_settings/LICENSE b/friedhof/mgrote_polybar/LICENSE similarity index 100% rename from roles/mgrote.fwupd_settings/LICENSE rename to friedhof/mgrote_polybar/LICENSE diff --git a/friedhof/mgrote_polybar/defaults/main.yml b/friedhof/mgrote_polybar/defaults/main.yml new file mode 100644 index 00000000..086a34c7 --- /dev/null +++ b/friedhof/mgrote_polybar/defaults/main.yml @@ -0,0 +1,4 @@ +--- +polybar_siji_repo: https://github.com/stark/siji +polybar_siji_local: /home/mg/siji +polybar_siji_fonts_dir: /home/mg/.fonts diff --git a/roles/mgrote.i3/LICENSE b/friedhof/mgrote_polybar/mgrote.polybar/LICENSE similarity index 100% rename from roles/mgrote.i3/LICENSE rename to friedhof/mgrote_polybar/mgrote.polybar/LICENSE diff --git a/friedhof/mgrote_polybar/mgrote.polybar/defaults/main.yml b/friedhof/mgrote_polybar/mgrote.polybar/defaults/main.yml new file mode 100644 index 00000000..086a34c7 --- /dev/null +++ b/friedhof/mgrote_polybar/mgrote.polybar/defaults/main.yml @@ -0,0 +1,4 @@ +--- +polybar_siji_repo: https://github.com/stark/siji +polybar_siji_local: /home/mg/siji +polybar_siji_fonts_dir: /home/mg/.fonts diff --git a/roles/mgrote.polybar/readme.md b/friedhof/mgrote_polybar/mgrote.polybar/readme.md similarity index 100% rename from roles/mgrote.polybar/readme.md rename to friedhof/mgrote_polybar/mgrote.polybar/readme.md diff --git a/friedhof/mgrote_polybar/mgrote.polybar/tasks/main.yml b/friedhof/mgrote_polybar/mgrote.polybar/tasks/main.yml new file mode 100644 index 00000000..c8f02843 --- /dev/null +++ b/friedhof/mgrote_polybar/mgrote.polybar/tasks/main.yml @@ -0,0 +1,47 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - polybar + - lm-sensors + - brightnessctl + - inotify-tools + - yad # polybar popup-calendar + - xdotool # polybar popup-calendar + - wmctrl # für polybar windows-list # https://github.com/aroma1994/polybar-windows + state: present + +- name: checkout siji font + become: true + ansible.builtin.git: + repo: "{{ polybar_siji_repo }}" + dest: "{{ polybar_siji_local }}" + register: gitcheckout + +- name: create siji dir + become: true + ansible.builtin.file: + path: + - "{{ polybar_siji_fonts_dir }}" + state: directory + +- name: install siji-font + become: true + ansible.builtin.shell: "{{ polybar_siji_local }}/install.sh -d {{ polybar_siji_fonts_dir }}" + args: + chdir: "{{ polybar_siji_local }}" + creates: /home/mg/.fonts + when: gitcheckout.changed + +- name: remove bitmap-file + become: true + ansible.builtin.file: + path: /etc/fonts/conf.d/70-no-bitmaps.conf + state: absent + when: gitcheckout.changed + +- name: update fc-cache + become: true + ansible.builtin.shell: fc-cache + when: gitcheckout.changed diff --git a/friedhof/mgrote_polybar/readme.md b/friedhof/mgrote_polybar/readme.md new file mode 100644 index 00000000..bd81a8b4 --- /dev/null +++ b/friedhof/mgrote_polybar/readme.md @@ -0,0 +1,7 @@ +## mgrote.polybar + +### Beschreibung +installiert polybar, siji-font und setzt die rechte für das backlight. + +### Variablen + Defaults +- see [defaults](./defaults/main.yml) diff --git a/friedhof/mgrote_polybar/tasks/main.yml b/friedhof/mgrote_polybar/tasks/main.yml new file mode 100644 index 00000000..c8f02843 --- /dev/null +++ b/friedhof/mgrote_polybar/tasks/main.yml @@ -0,0 +1,47 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - polybar + - lm-sensors + - brightnessctl + - inotify-tools + - yad # polybar popup-calendar + - xdotool # polybar popup-calendar + - wmctrl # für polybar windows-list # https://github.com/aroma1994/polybar-windows + state: present + +- name: checkout siji font + become: true + ansible.builtin.git: + repo: "{{ polybar_siji_repo }}" + dest: "{{ polybar_siji_local }}" + register: gitcheckout + +- name: create siji dir + become: true + ansible.builtin.file: + path: + - "{{ polybar_siji_fonts_dir }}" + state: directory + +- name: install siji-font + become: true + ansible.builtin.shell: "{{ polybar_siji_local }}/install.sh -d {{ polybar_siji_fonts_dir }}" + args: + chdir: "{{ polybar_siji_local }}" + creates: /home/mg/.fonts + when: gitcheckout.changed + +- name: remove bitmap-file + become: true + ansible.builtin.file: + path: /etc/fonts/conf.d/70-no-bitmaps.conf + state: absent + when: gitcheckout.changed + +- name: update fc-cache + become: true + ansible.builtin.shell: fc-cache + when: gitcheckout.changed diff --git a/roles/mgrote.k8s_autocompletion/LICENSE b/friedhof/mgrote_r8152_kernel_module/LICENSE similarity index 100% rename from roles/mgrote.k8s_autocompletion/LICENSE rename to friedhof/mgrote_r8152_kernel_module/LICENSE diff --git a/roles/mgrote.r8152_kernel_module/README.md b/friedhof/mgrote_r8152_kernel_module/README.md similarity index 100% rename from roles/mgrote.r8152_kernel_module/README.md rename to friedhof/mgrote_r8152_kernel_module/README.md diff --git a/friedhof/mgrote_r8152_kernel_module/defaults/main.yml b/friedhof/mgrote_r8152_kernel_module/defaults/main.yml new file mode 100644 index 00000000..5c2b1d34 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/defaults/main.yml @@ -0,0 +1,12 @@ +--- +r8152_module_needed: false # standardmäßig falsch +r8152_packages: + - pve-headers + - build-essential + - make + - dkms +r8152_safekeeping_reboot_delay: 12 # nach wieviel minuten wird der pc neugestartet, tasks wird am ende gelöscht wenn alles erfolgreich war +# damit ist sichergestellt das der pc wieder hochfährt falls etwas passiert +r8152_src_dir: /usr/src/r8125-9.004.01 # wo wird das entpackte archiv abgelegt +r8152_filename: r8125-dkms_9.004.01.tar.gz # wie ist der dateiname auf dem ansible controller +r8152_version: 9.004.01 # wie lautet die versuin diff --git a/roles/mgrote.r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz b/friedhof/mgrote_r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz similarity index 100% rename from roles/mgrote.r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz rename to friedhof/mgrote_r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz diff --git a/friedhof/mgrote_r8152_kernel_module/meta/main.yml b/friedhof/mgrote_r8152_kernel_module/meta/main.yml new file mode 100644 index 00000000..8dd51618 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/meta/main.yml @@ -0,0 +1,3 @@ +--- +collections: + - community.general diff --git a/roles/mgrote.k8s_misc/LICENSE b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/LICENSE similarity index 100% rename from roles/mgrote.k8s_misc/LICENSE rename to friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/LICENSE diff --git a/roles/mgrote.r8152_kernel_module_on_off/README.md b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/README.md similarity index 100% rename from roles/mgrote.r8152_kernel_module_on_off/README.md rename to friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/README.md diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/defaults/main.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/defaults/main.yml new file mode 100644 index 00000000..5c2b1d34 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/defaults/main.yml @@ -0,0 +1,12 @@ +--- +r8152_module_needed: false # standardmäßig falsch +r8152_packages: + - pve-headers + - build-essential + - make + - dkms +r8152_safekeeping_reboot_delay: 12 # nach wieviel minuten wird der pc neugestartet, tasks wird am ende gelöscht wenn alles erfolgreich war +# damit ist sichergestellt das der pc wieder hochfährt falls etwas passiert +r8152_src_dir: /usr/src/r8125-9.004.01 # wo wird das entpackte archiv abgelegt +r8152_filename: r8125-dkms_9.004.01.tar.gz # wie ist der dateiname auf dem ansible controller +r8152_version: 9.004.01 # wie lautet die versuin diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/files/r8125-dkms_9.004.01.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f91b8cdbc0fee242bc0b8c85f9c348d925d6e802 GIT binary patch literal 99022 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ÏVP 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 literal 0 HcmV?d00001 diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/meta/main.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/meta/main.yml new file mode 100644 index 00000000..8dd51618 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/meta/main.yml @@ -0,0 +1,3 @@ +--- +collections: + - community.general diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/assert.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/assert.yml new file mode 100644 index 00000000..be45d87f --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/assert.yml @@ -0,0 +1,20 @@ +--- +- name: check if module is installed - folder + become: true + ansible.builtin.stat: + path: "/lib/modules/r8152" + register: folder_exists + +- name: check if module is installed - lsmod + become: true + ansible.builtin.shell: lsmod + register: module_in_lsmod + changed_when: false # sorgt dafür das der Task nie als "changed" angezeigt wird + +- name: include install-tasks + ansible.builtin.include_tasks: doing.yml + when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) + +- name: include dkms-tasks + ansible.builtin.include_tasks: dkms.yml + when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/dkms.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/dkms.yml new file mode 100644 index 00000000..6d1cdce4 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/dkms.yml @@ -0,0 +1,34 @@ +--- +- name: dkms add + become: true + ansible.builtin.shell: dkms add -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: dkms build + become: true + ansible.builtin.shell: dkms build -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: dkms install + become: true + ansible.builtin.shell: dkms install -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: depmod -a + become: true + ansible.builtin.shell: depmod -a + args: + chdir: "{{ r8152_src_dir }}" + +- name: update initramfs + become: true + ansible.builtin.shell: update-initramfs -u + args: + chdir: "{{ r8152_src_dir }}" + +- name: reboot + ansible.builtin.reboot: + reboot_timeout: 120 diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/doing.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/doing.yml new file mode 100644 index 00000000..b7659405 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/doing.yml @@ -0,0 +1,36 @@ +--- +- name: install needed packages + become: true + ansible.builtin.package: + name: "{{ r8152_packages }}" + state: present + +- name: add reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" + +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + +- name: updated installed packages + become: true + ansible.builtin.package: + upgrade: dist + +- name: create dirs + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - "{{ r8152_src_dir }}" + +- name: copy and extract archive + become: true + ansible.builtin.unarchive: + src: "{{ r8152_filename }}" + dest: "{{ r8152_src_dir }}" + mode: a+x + extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives + remote_src: false #datei liegt also auf dem ansible-controller diff --git a/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/main.yml b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/main.yml new file mode 100644 index 00000000..5e7a3780 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/mgrote.r8152_kernel_module/tasks/main.yml @@ -0,0 +1,4 @@ +--- +- name: include assert-tasks + ansible.builtin.include_tasks: assert.yml + when: r8152_module_needed diff --git a/friedhof/mgrote_r8152_kernel_module/tasks/assert.yml b/friedhof/mgrote_r8152_kernel_module/tasks/assert.yml new file mode 100644 index 00000000..be45d87f --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/tasks/assert.yml @@ -0,0 +1,20 @@ +--- +- name: check if module is installed - folder + become: true + ansible.builtin.stat: + path: "/lib/modules/r8152" + register: folder_exists + +- name: check if module is installed - lsmod + become: true + ansible.builtin.shell: lsmod + register: module_in_lsmod + changed_when: false # sorgt dafür das der Task nie als "changed" angezeigt wird + +- name: include install-tasks + ansible.builtin.include_tasks: doing.yml + when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) + +- name: include dkms-tasks + ansible.builtin.include_tasks: dkms.yml + when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) diff --git a/friedhof/mgrote_r8152_kernel_module/tasks/dkms.yml b/friedhof/mgrote_r8152_kernel_module/tasks/dkms.yml new file mode 100644 index 00000000..6d1cdce4 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/tasks/dkms.yml @@ -0,0 +1,34 @@ +--- +- name: dkms add + become: true + ansible.builtin.shell: dkms add -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: dkms build + become: true + ansible.builtin.shell: dkms build -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: dkms install + become: true + ansible.builtin.shell: dkms install -m r8125 -v "{{ r8152_version }}" + args: + chdir: "{{ r8152_src_dir }}" + +- name: depmod -a + become: true + ansible.builtin.shell: depmod -a + args: + chdir: "{{ r8152_src_dir }}" + +- name: update initramfs + become: true + ansible.builtin.shell: update-initramfs -u + args: + chdir: "{{ r8152_src_dir }}" + +- name: reboot + ansible.builtin.reboot: + reboot_timeout: 120 diff --git a/friedhof/mgrote_r8152_kernel_module/tasks/doing.yml b/friedhof/mgrote_r8152_kernel_module/tasks/doing.yml new file mode 100644 index 00000000..b7659405 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/tasks/doing.yml @@ -0,0 +1,36 @@ +--- +- name: install needed packages + become: true + ansible.builtin.package: + name: "{{ r8152_packages }}" + state: present + +- name: add reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" + +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + +- name: updated installed packages + become: true + ansible.builtin.package: + upgrade: dist + +- name: create dirs + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - "{{ r8152_src_dir }}" + +- name: copy and extract archive + become: true + ansible.builtin.unarchive: + src: "{{ r8152_filename }}" + dest: "{{ r8152_src_dir }}" + mode: a+x + extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives + remote_src: false #datei liegt also auf dem ansible-controller diff --git a/friedhof/mgrote_r8152_kernel_module/tasks/main.yml b/friedhof/mgrote_r8152_kernel_module/tasks/main.yml new file mode 100644 index 00000000..5e7a3780 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module/tasks/main.yml @@ -0,0 +1,4 @@ +--- +- name: include assert-tasks + ansible.builtin.include_tasks: assert.yml + when: r8152_module_needed diff --git a/roles/mgrote.minio/LICENSE b/friedhof/mgrote_r8152_kernel_module_on_off/LICENSE similarity index 100% rename from roles/mgrote.minio/LICENSE rename to friedhof/mgrote_r8152_kernel_module_on_off/LICENSE diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/README.md b/friedhof/mgrote_r8152_kernel_module_on_off/README.md new file mode 100644 index 00000000..f3ece44c --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/README.md @@ -0,0 +1,16 @@ +## mgrote.r8152_kernel_module + +### Beschreibung +Installiert das Module r8152 für die 2.5G USB-C Ethernetkarte DN3025 von Digitus. +Startet den PC neu. + +### getestet auf +- [x] ProxMox 6.1 + +### Variablen + Defaults +see [defaults](./defaults/main.yml) + +``r8152_module_needed`` muss pro Host gesetzt werden. + +### Siehe auch + * [Link zum Treiber](https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software) diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/defaults/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/defaults/main.yml new file mode 100644 index 00000000..7a215f7e --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/defaults/main.yml @@ -0,0 +1,11 @@ +--- +r8152_filename: r8152.53.56-2.15.0 +r8152_packages: + - pve-headers + - build-essential + - make +r8152_reboot_timeout: 90 +r8152_pre_reboot_delay: 120 +r8152_post_reboot_delay: 60 +r8152_module_needed: false +r8152_safekeeping_reboot_delay: 12 diff --git a/roles/mgrote.r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 b/friedhof/mgrote_r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 similarity index 100% rename from roles/mgrote.r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 rename to friedhof/mgrote_r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/meta/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/meta/main.yml new file mode 100644 index 00000000..8dd51618 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/meta/main.yml @@ -0,0 +1,3 @@ +--- +collections: + - community.general diff --git a/roles/mgrote.motd/LICENSE b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/LICENSE similarity index 100% rename from roles/mgrote.motd/LICENSE rename to friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/LICENSE diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/README.md b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/README.md new file mode 100644 index 00000000..f3ece44c --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/README.md @@ -0,0 +1,16 @@ +## mgrote.r8152_kernel_module + +### Beschreibung +Installiert das Module r8152 für die 2.5G USB-C Ethernetkarte DN3025 von Digitus. +Startet den PC neu. + +### getestet auf +- [x] ProxMox 6.1 + +### Variablen + Defaults +see [defaults](./defaults/main.yml) + +``r8152_module_needed`` muss pro Host gesetzt werden. + +### Siehe auch + * [Link zum Treiber](https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software) diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/defaults/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/defaults/main.yml new file mode 100644 index 00000000..7a215f7e --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/defaults/main.yml @@ -0,0 +1,11 @@ +--- +r8152_filename: r8152.53.56-2.15.0 +r8152_packages: + - pve-headers + - build-essential + - make +r8152_reboot_timeout: 90 +r8152_pre_reboot_delay: 120 +r8152_post_reboot_delay: 60 +r8152_module_needed: false +r8152_safekeeping_reboot_delay: 12 diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/files/r8152.53.56-2.15.0.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6a85f32a438e758a01c9d4ce0c2010977107d9ce GIT binary patch literal 70602 zcmV)hK%>7xT4*^jL0KkKSqM(NvIHVMe}(@2NQi&`|NsC0|NsC0|NjsP00aOCVUK@( zz45?TeV<9jPYnPMpa5?7a|=)a00000dH@E;cW?)%Kmecxba0171yYqrNg|7|2fTYt zFM(paJ@juKt+%>r*tY;EdiHX)k8YkXwtyVltsi~%&aEI=4FZ#D)dL*??XuF{&qpt8 z9`;ttxksR8?(6TeJ%_e;&vo4m1>XCC-F&5O&<|dj@Hz+AZ=QSr2d=aL0000W13&-) z&<`L0000kEL_i0i0018c*sr(10000Q05kyM@0h;x=<=sWpgURWfCJC~1E2r^9*0dZ zg8BC9(uY85udUxVue?5W!oUZh8c+ZL6a&+6`_m75039Uf&Bw0yY2jXcW9xHXyaKat zpd**LH{I7WWAC|f@2bZ}g0g6zXVUeBI`Q-EJ9hi6rN96H000000000000000 z4}A6a&gHc315Ph$+t)PLO*?I;x!c8i%50mS;L}cTcPe9J-OJB6I^{GvcFo+|x$ifZ zcdMbNA<*_=+uf7VrnSYajR5y`yUR``(*Of!z3%PrZ+f#p0PCuCz4h+^ef5AIho_vr zYHzDzeemdrFY_|J8?I*FIrD+$qVMLN$q-vS&w3 zQQr6k?m6pRd*|JnE4$-odYVV79?!3RaB_T|_8D(j4Ylm)PP?KvRyR@(dS``Uf7%?mSQTB?n=(G1k5-rn0wz0|A2YR946?(WPg zYqw6;pgr4eP$z3kx1J9ivdqSuw$yF15z(~z8s@&{gMmH~&a+(|E4LZNSH8a9rk*x6 zHn#h%)TdhJ-GOzvZUY3S zkPra?KnbCcCMJMDo|;CJ(;*KiX{u<@G%!FCng{|Ei3)mXihilJ3{Oa8GzNeG00000 z00f#uh=K`_B~NLpep6|PdZ_V0Z8U&-Lka3>paVbv00f??NeKc>$~>g=DW;_TQRwwe zHq|uI={ATqqf8?pGGZ`>1Ti!ONQ6m14}~dh zv^hOwAtn+}w_}j@kqcPZsKU9n1`!}lB55l{Y(i=%D=D)v71dI$(Rp=tWlBm@S54KO zw_4>CTJG)9M7K7tK~z~OKtMT)5C5OT`Jt!!Ka==&Puc!Q{QuR3{y05QQ2)e%@qiKl zd}4rqyA+Zj<|F^SQ2(S58+O>H!}df(59Ek{SBZVyeV^vA*%$eU3I%^}5b2?a#d zMMPb{rj-SK4S8CKTtQMnL@@y6|0U|jpY`AL^3LVGnclfGb+~wnt z%srUi^Coex9EyRGC>)}T!uWb%R5|8>O|?j#u>{WYkvrl8s0*$%0_rL{MMT5}K3-oR z!sv$aRC`1N)&PhHj6pe_lmHH(B6mf6VhzMK5>4Q#+Hc@@^oM6=wp0MrRsPQo&khaW zO$MKyYvX(c;ECg<@+z(gmvWGJmV(q&F*5npUVsS%4v%9NzA-!@>Z@y7_+tr!~pWrRk-3omrz5eJ;S!O=#0`Gos zVVR9k29{ZmMp;{bZx8ae+ikYmUNZvR;CcUE$ZdT6yYH$t_Sfwn^cnxa{&oE@WRgM= zlmCy$^8cLwr~L0n{Jb|d9LHhGX9ZSdEy--5`Taeer-#=&nDQz=2}{G(PgcE5l!B!-`g@_W z(!B0tQMy{`SxcICU`DekOlb*dw2+$Gh|*fj)=Jh=SZ%fhvqNM=P?RcAkr63PW@4Ee zRcrT~Yoap>ZD^>;B5E>i4NFLoXxq!W)Jb7X#Wq<_-4Jbym6+r_uriqs6qNXWu4|hzMqM#XiV@hu;(j z;6YV(fKT0&E2I$ypsDkKB5?pz11Rq;5fw2MULt+)1P6J%MI=Ey=jZ3I-*Db22CzYd z4zcSb>lNcGWqi9*qqGoo#T6~L&*g9g+9;k-PzeN*qH#S5{`ehGJNqd8f3;t!l>-0h zRYCg11JX8p=rIjnzNp1aqgU4Zn{TQ3*1Q(4%l_@!CuDOF`NPT^!0_j*{;WtPK_Li` zWu}d4G#REZ!gGEuhvOKuBIwAHg2=WCXxMp-nGOw!tAZ9*xuOb}=?7L?Lk zO*DjzvWx)Al_sX5Y)uwcWwIF=B*>;rYbI!*G-E=kH7unjmYTGbP=zFlX(J(vW^Jgo z&34Q%#zsa>tVwA$QZ$UPCZx$D8Z9c5L2DY)Y{?ZY+BS>*IQn#)ESRvH4fEX-RbK}t=i+9NhoWfVwSG>Md9n#xq06e<%;hE1ZA3mI%ov7*9M z$}|?u7k6ZhNt(oos1?oG4H8J&BQq9~p^Frvl^R83*KOM@)uv|4Rk9+=j8vtjYZ@es zvTW33ElFytT8c86nVF5Lwrt8+uxX7(M5NM9wW%$vWfa7yX{nSY8VzMOno~$gwMMq7 zkrfhSEhyu2EvNy>`15G-FdHtqHWHG_+8qWxZT(rlp#g#wgMxCX-<@m9Y_& zk}^&gCqbDp8cEsIe>(no2>cWK>2d z+YvCp(vtV?#qIAq()AQ6PGfLJ>+f3SI zf{A6Kf`yi&Nm2^Ng&L8nrrRl1WmUOWqUN%i#y-pMkZTrjbTf-1>#n311=D%s5SM?knIWJ zv!i;U%@R*P$!5%qNGl+30HP=tchh@-sA@*rQMR<2wv{VwOAA`onGq5}PzewLP4mMV zk`U37f`8PrfF!v?h)seFiV)?LWG-1TsX3;GBv>I+O4PPnEVj;O8EHv)+}2-a^=Zg+ z3NYQLZ8CT3Lk_bqrhHZf&%;T|n`rkds*_BxYsIr-~S1SY@zMr0p?-6&D2y1QQt86;W;%RL;oE7GP6@x`P%5++)?Ib8zF_Bn=QABL-HHT;0&G46;Oe`)Z zTN+~zHMRoBZ8d-#y8_rpgx0JJYSPkf5yK zm2xtOhC4f6NNB2j>H zRHqQpAt?}s$)vJP6c?OZyI2F%wG0|ktTr21=;&fOxv8VF>B!g9tUB+6(|W)b0g28s zlNNBYUKzdKO_s`2Id&6pa|12Ge09L^fx-mtl(mpMCI@aB$cBZD19z=ChYK?JaN27w zOtjp(un{S3w4ce@(YhUUS}_<&j3lWFkz;5=Hk(?dDlYS^Q!*FAxo**rUb?bJ$$1n} zcF~A}3R}>0N2}+DcSI=TyScR(Qpve+vf3df!P=eRagyx`$l=LQVGtD%MI5|9#j{}s zK+P_(x_QnSyl`=_*GLzc3XX`jatS;#NGiz&Ar*#h2M#XIkdRI^7BP$}mPPuAFgE}9 zP~AC%Q#i$ll~wZN5)aVl|EREG;QuS!II<79F=xTf^f&w$*_rO!?T~1iPT-Iv%rCv$ z1Rr@9WVJCKSwC*dQ;WzFX>%jULYX%#R8Bj)ySum8HO7c$@&HbIp$48nv`6kwzbDp0v<1xCtLt~G;c zGczTO%V1hq7}Qt`E+$^A$e!;;+p17mEwVADCX_*!^m^=C$Pq$zfVB>qnK4wOLRgCeZbm5i;7l_iLRA{x`imm;J|sbHZp)hb2Y5MnUn3`mTI(2X@F zNJKV)V=bVem1IPt5idP;No&%?$l5(4X*^rTjB5xYux%9kTaB!qx&s_KNg-nHsn!v%PO7i!9f|-%q%2|kUAJ^d77e& zTa~%DEtX5QS6y_GrGP0Q^<_%H?UZEQltcogmncj!%37i@7{E}9#zet(tIN32a=CRY zrP*7RB%tG9%7p^kE<%P7V`)UAMMjux(w=qOWeQTh73qT$(IGqNC?l!tkTEd}-I9Xh z+*YMxELI?iTN!L7<n2EmDbXbICl7E2CYP^mubEo}%@vZYZAC@%t$LN?ArY&`Es-kj>d|P5D|}5{tJ$lN znv@POH#lHLB@tv;3nIj=fxRud8jTh!8mw$+lSmPg*xaj_3~HFosx5M>n^-J`qg5s} zC`3S2QH&qezoO~p8!VnwKzd3gP_cqBiPIhRX_r4sHUB-!Ksmq-Fj%!6*Kcmyu%@8J z8Z#;qv0HPRjf&4YylY%71>&wng3-=rb#yYav1^vDn5^y^ zfD$1fk}By6clrLczx4gT!vBoZr{mx2*u7&3j)y}d|1Z)Wwdz(W*oyIlJd}tJi@@Bd zr3XLys33|?IuaeF`SGWL-{p0Emt3yfo5kjPQ}dBzV+AO@3Osm0|J6*JrxDLMz^xPd z6G|V1qXKE`)d@zfjpC~@3gV|psk&bMsD7W{=gj!?=1*VCJ0n-rm2Zw#SLJx7?Kl~!nnd3gzG3759XQ06Q7{}#Ph4b zckcDl<@ZsxFI+a4vuCkycefXkab2~49p@8IzJ)*1`VN(OZqq z6_y|w(z5;I&VR&+{rw(yPy9#mt{MDZ>ifT+>{~uz6FHeGZ;G0=qc*+js%(fO`WEl7vP2gPsA`R#FvsV!^M-GG@AA=LE}O;zxK;}^Su zBqQxjZ=w*1HMaVl-L*$H%jkC2DA$cew;Mn z3MjVbtB8a~sJ1Aoh$xB(h}U;TbC-9wl@-ijDosNIOwm36PS~K6_);?zY(e}j{(<=T zyCIMaG4+uo06*0O1|Q-X{ws3Xg9;!E2Le(IGKH2|3NQsf^$3U`RKV1BuP{9LR9rgRz;KZ zTMyclGLo`4?o1n&>zkwRuSX|hn3fRPuRs&z)g}i?t-?eG?zw^NGfu^wMTIm<)WILp zn~n;>XEpty^nz$;LnMn-$|nRWNN&TCKceM_Ujg9USFSLo12+1T(3_bb0-bJH4Q90y z@rU`19;QSgt-4!XQ@`-8k^b1a!~8$E|KQNazs76)n;*ZhbA)@SOh?f7)PDDrO^770`QPT|Eu!+)&Y&EegV;* zQMY{`d4E1N^v7Xu=OO>M`Y&Z4%A9~K_;g+*@NGI|CUn?j{`G+koq=KdW0Al9o(%AT z+9Ukac;od@^8{>X)UxhkuMm?mDp-NMS7@>zB%LNh8xxBj4sIogXhDS51c?}HaNv&R z2$~W}#t>9U0unGsd9a`Pn0jfJ;+c;aoouPO)OA~IcRA9Um;LYGPk;FSUUYe%z<(d_ zd9riqiS>02kbU^I*f{|p5<*FVE)qXH{0uL+$RkhgBmWO~4|aZ=VF!e$u=Lk)kM8p6 zhVS`*Ka3pc$ME4E+a&Eyr zWg~8U3ZfMH5-(e6`|s+sX`b`d4opR5Mj9mCIa+GWAJV+#{C9oZ_WsLnIPl6gyE|%_ zJk8VS+xq8J$MHvl|8+aOzo*018b*VyB1V`mWazE#f=|EpO5Z28%SjQl`yPk&c3lrj z>g4wBw`?cP@!y8c`}Se7SMSqP9l1vPEB!VW=VqGR>o=eD+4Xz&%Z8s+xZO_7E?Z;H z6^86Cv)&|^vs(^Sv$dI~>!Y$u)1NH78>r*W)VoFc;Pj8^cjaf*h z8W;qwFAxno9qbs4_eGNc0Ws{d#}i{;XxipdrepRuYj3eBsWp%xR%>V) zaHxRX97IVFGXSU;0c1c)5g+1;15r^{5LEl12~h_|t+A@wEv!{yrdqeu(iIRC3=vkM zp&$aVf)I)zpVb+pQK3^MsSH_U(%cZFYwh|!@_cx=k7gV%H!j-{oE?jAuCS-|DTRy(lDpMQaahWa&}8=IR* z_;J5HJG(JIzjmU2|DehSk%Ub{K2K+s>c&5pj84Cm4reh!xDym&z(9mWp{HbI62VG; zcM-QU+<%8}FTeI>{C`dV2>c_;2wV`Pg;(QaQ#JViA{?gGLVSPb&kwNtJwIDB3=(7J z)d!v~ULQu_KZFP1?n7NZGLX_zN|_NeZ>_fFSU3&;R9MNhN^T@Wazd!`9pUd9AB0;` zkw$ywY{Pnph?t$W-n^*;|9b~uCX56Oj?8~=U*Gsry1fplf7&RFcbRS{)x_t@#Y&F% zyyvZEeY@wS0qySedp%bd@~;j-^Vz-AgYISpfA)?ipH zA_`ifWbL?(vFZI*FAJHa`fqZh+t{Oag9O-U2N%Xh=EUMcl88e?HWQZ-(#CibXn2rTNU}if_wF*0dvU8-aF^%(A3b+5qv(@HNH*r0C)H}GdDqd#3}$G+9*0fWK@uu z(D*8u+a6fV2WYu>?de?m=YPYo=yi5)CJUl0OY<)U5XHASw2;9FOp9&4{W(atN41Mx zf^?Y|L?Y@oh(ybUyDbE!ukycW{)K-^2k>q&pKWU%_&FsTnTC%7!y-pLj1{bdaX~Q| zGX)9Hb=xKyBi&V^Z8&GPXFa~Wx8n4$+d;)FiWnHt=d`aI=c1${%r^arDdU-JFNpfS}i$rmC39g#jcMH^cfD z4Z>K!bY4GJ_#d%FmLJf6IfizsqwX|Olpl-ma@EzwsUg`qbcE(^;=K~v6Y{+eB*Y8h>s329Mm15pvQ(#d4sHs34Buf_eJ ze>c+hcQ*E(ecr$bg31y>WRQXYHc*fN0FVGQ!!RTyizO0CC1%i!gYETR()QlzAyR!> z>eKcHyl4wsM-ZqMH@oe1+=!7(y?1h zX>A}|OKrB>2~dKB0E7n6`R>K^c>5x4UYsM%3bdcgLU48<&_!hmtUsUWb@4*mB}k?$ zSg~Toixr*QuI;Yw)wGt-w!pTMTT5we3X0lQwi4Sdw%W$hmW8w~QsuVGX)T}@(3N;5 zVQrTv7eBd#hGSboTSD3dwv|#gme97s+Y4-{qiF)#RBeT}TVYijLa|2Bw*BTFjGaNY zRTKLCGXeE&3R(=d#+(S7%_8z_e!sH5e?IT${*O=F_EYggC(&2O%k1$d1tG`Yg+||T z&$!$(Ov4hTv@G*&vVefdBOrqaoeZ#!ZnkM`Z5v8!Gg+3*)@Io?nYLtmdv)y$hC_Yb z-pGoQh>~bBfXX|m_1^sU_5Qxy#nE@c7$XETtp7W)Vu;6Id_D2`TWZ=C+ikS7I4l1h zC&!bRgv!O^?sE}x>wapf3QGjgMfNyyc70zKd`B9mBdG(px|)8%u5QN5?#MxH50q`0&}Mj<1H>TWH&U?sNPc z!R~zuK6DE|L(>!=$Kv8h{=>lus5@-EixYm-2}1K3c03uloMJs9-3TQZLd4Nz!YE~V zX;{kdUF5yqBZQ7Gekbs$K6k@h*B3=F>QbtkHKYxbM>Uy>Z%f-^F zn?N&%5vv7T_JLll$E%4x;T2&)rOwlF-KX%0HIG61Y0}ffl>QO^pS-vY{Hb?JxG&j@ z9gTrg`>%SO?{kBs==r?AQydtaT9*E39HO-iit`l@0tVTKNJ+~5?!z;rhi5_@DrP?@ z{m(}CgqZE(Rs&0@?jqlxC&|5SR)#kch=+9jAGnKXzaBOgbO&SY(CIc-(Vc~3pZk4r zpW&8|rViM@5ApiFhF3Ob>}>4~VZk9Jz3uR3On+u@BNM-?PDT@L=n--7zUMp{3Dx0W zas6LSyYRh^BWFhd_BIg5e_`5iFT&2BKQ66hhQf+ed6rn87}Ooi^WdM8`q%UupFDBA z)5m_7E2*kopJnwYAKY}onD}EeL_``NfEy$+ml^!)Y~6GRWuoC^!_eY(s$ZX@)p$Gn z{gCvJX5Vk`fTt`jk$7-?1CLE?zA!V6iTd-7d+y~)hyqPn&0gAK)xJ3 zn6bI%S>@;3wYzB&egRB}O0ZIs%-lxm>C;;ncQw^L;D2UFfY7VfgYV2yAKPs_`E%op{F#G)nCerr3Gb9&!GBT09xW*H%fHA9M zcouNrLfur4hByx7D=TNX-}?{vj8OP#JjE?`S}2Zg#ODFTLExN5eyewGiEnSy$~H3o z$=P4tl1U_lB$7{w>f|uIv#E^O4b8JNhp9)bEVA~(*gQBnAOZT2Gj98*;kt@RF!!?I z;J-c8iv!JYw|2Nax~sl4wZg$kB$6WR>5@wd!j!FljHeRQ5^CG2%K1|+*!*#^UJmcb z#Etfxp+CIaj7aiMU`JBL9LcyfU7o4_TJBs!mm)|@O4a{W_I!N5Q|A1+H@@r+i1WqA zbDFh8NWmd;gQRpj#U$%`f`a@#tT13}Q_f!>8^rs0n4%w4s;Z*iIm?6uhs({-7>gb^ zy50>000eIrF}dfTLcMexm~lGhilTp{-J{xKWwWd)cW~>0e9r^!r0&|2o$N335a+_D zNgzU=e3}A97N%(myQ3;eTIa5hG;$C~gy`L}w5j%xDSakr(%RE$BuF3IOuri}EBE(8 z+_!Zxy}5*&r|=CpcQ!Y_2!vh3oIP+fK7T8|l7%Fyebg3&YJeW!=AV0+i$uQJj zc8(w~D*7v!L$oIcN2ajJP4#kYWQ!ETnbPTC5@3HP%-$rBe zCR^ruYv0oDJ%d4r^7O8~4%kXQT~pZj>=1}FW4GOvUuD)(Bd&Z)^~|YU2JZFB6EdAX?W;y zwYrnz0QH;0EahcVbQ?cw00=2RNoWD&Ml;m{p+76uO&k$P5E^4^X%()GeD&7K%Il%v z;OwkJ7G^}fm?K}B60A?#58w_bLjXF5e0xh!=^lMkBVv|{)g+QhB$7(-s$y(uQm(&x zxXX<>*uy$z@L$i_gx8W=FkZzLKhwAQ)+gS3_K{U-I{V9yThF`CJu2eoh{(+LTCnGJE{>2_%(t*WK1sV3Mp+)(D;&Ag90mZ-~k99X%xA5kPUGCEP~1& zgQ*lb2r@9g?1}{$;>;Uv4*p-?27(eA|E9tbv!WI+nLdm0m7gMcwx0q`st<0+L;EaM zbpI$1=e&o%=#pk;5FwcYZK$f)+Qp*MAHiS!ZTweP|0U-lACjlT`0C;pAV{GhilRuc zLIf5>$}3O;df=0+Ir)Drz8}NrvId^hZ>#f;)_a9X{%8SkfFbJvHruF>k+1BSPvia# z!?=gL4~|D-^M?M(KYH)=`oB+2a_h76>1JXXVRj=m>0svTvG!PaMIYW7?_Vh*As?JX zKZ+vBVJbT1xvh``5J+pLQvT$BtMa9+3;u8P{%yZtSnO;CNy-MnsRWFXF=|N0)@H0( znzG88ZMMm_w1(C-R9eQ{43vhoB&DFGM%GE1HW_Pc`wd%S*D`57j@N4&QyMzs{8fjs z!7x@Yd+QY>KEjer#Si|lhf{v5t<@R%KW#EB+7Ueja0t4`c57+wF*c zIRK%5ZX!Yec0oVS09)=s)P9veQ;bis`~Mmr-iZH`6?IhhSoTPRMWD_|XZJ;dAvT2o zpUQt%ev^P6P*A6t(TfI0aowy8-;y~PD$Sv_aFVQCV*x>Uz!D^b#vJ$u_#jIrMW`{{P57U(C5DQp_|PQd72AvL;Qxy% z-igA%q9I$6NKhJxokRu@xjvip!0;gUf+Rdd+L3Ta00|DLg^(-&_2X;qCP?K2IkYfM zpcHLDG(dR~3KK*9f=6iJQ3*u<)`NbR5@Uk^Z$CfS#2Bd?<$^QMVVtQh%=OtsH-!M4 zG?a(a2u(B=<{6<$j0usak(TL759{SQ7<2+(<5YX#KRrIP z1%`mo7wM7=gCmLa#Uqg1%{jg71U_HY<@#=K10g6q#xXgvW(;j;%9VNZMrv%2M~(m7 zBmC2V+HN$@(~nqg9b&J@pIqS1mOvj!K8BKQs9h#u%MVcE#fw5n;R{68Jm9VMt(~xX z{}vXSBgRKw%QyucMq}o<6MaJw?K{E^dkvVFoLHTEnm%1`?pqM~@Q@v68 zZRrzssT2fo(#&MW|Jm+eSHgTffcksbN&Q|`iDdI5sVHyp$jf2R}`!uY(&V?kA;(SjkV)R%bc2LDKQIhhC-59lQ2qhA@=VbS0Vn`ht50ODZMI0Tp)bJyi zt3yW(BkuanK+8h#HHR`4ZUPe8he8mSK$;O;VOqtgH#s~WoU_R^dJPc<=5uOeLQJ`Z zrj)-5j?}(|SzO8!v@MMmrzDCe*L$~(`eE;=Jn0oYn?Sr;R*uAn<@q=EvBWAch&=Sk zY6uJX1VEBWj7_!8MH^x=X*6s^0BVR0v}T!CkcL zDpaKpM4%tH_BsJcpfb$|k3kU~6EgYUN80VbuYULMf zC7zoY0(XH9P&~6h7~SokV3Om%25N(79}~#%IMY|^%mWRN@Hs9#Uw-l5cPHE%RO4d6 z=X&b{=VFkEOmgjSCfGr|6jnocd>-#J&?&P|Cn``J4tWj+lAhdpppmOcB6ad}wh?%5 zOeHb-by1J|Ggq??y0e{BF8$}};IyUtFxR8={vSa`us!h7FYx?l(-ZQrjqA_li2{*O zZ}S~w=W;USrdLd+8N2j~5KGetiDdb`V;x}&@$;OE)O{54u9e;PJ2iqi`7inX5A{BS zk(*ODI6=^j!vBx>{W^blb(r#oH~u2LOSyEXPMtb+#aq~y`d{6

$UM{=PkuTlAyY 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 QAN`BDBAh5l1Seiu01bpY^#A|> literal 0 HcmV?d00001 diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/meta/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/meta/main.yml new file mode 100644 index 00000000..8dd51618 --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/meta/main.yml @@ -0,0 +1,3 @@ +--- +collections: + - community.general diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/doing.yml b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/doing.yml new file mode 100644 index 00000000..3163163e --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/doing.yml @@ -0,0 +1,83 @@ +--- +- name: install needed packages + become: true + ansible.builtin.package: + name: "{{ r8152_packages }}" + state: present + register: aptp + + +- name: add reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" + +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + register: aptc + +- name: updated installed packages + become: true + ansible.builtin.package: + upgrade: dist + register: apti + +- name: reboot - 1 + ansible.builtin.reboot: + reboot_timeout: "{{ r8152_reboot_timeout }}" + pre_reboot_delay: "{{ r8152_reboot_timeout }}" + post_reboot_delay: "{{ r8152_post_reboot_delay }}" + when: + - aptp.changed + - apti.changed + - aptc.changed + +- name: create dirs + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - "/tmp/r8152/" + - "/lib/modules/r8152/{{ r8152_filename }}" + +- name: copy archive + become: true + ansible.builtin.copy: + src: "files/{{ r8152_filename }}.tar.bz2" + dest: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" + mode: '0775' + +- name: extract archive + become: true + ansible.builtin.unarchive: + src: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" + dest: "/lib/modules/r8152/{{ r8152_filename }}" + mode: a+x + extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives + remote_src: true #datei liegt also auf dem zielsystem + +- name: make + community.general.make: + chdir: "/lib/modules/r8152/{{ r8152_filename }}" + become: true + +- name: make install + community.general.make: + chdir: "/lib/modules/r8152/{{ r8152_filename }}" + target: install + become: true + +- name: depmod -a + become: true + ansible.builtin.shell: depmod -a + +- name: reboot - 2 + ansible.builtin.reboot: + reboot_timeout: "{{ r8152_reboot_timeout }}" + pre_reboot_delay: "{{ r8152_reboot_timeout }}" + post_reboot_delay: "{{ r8152_post_reboot_delay }}" + +- name: cancel reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -c diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/main.yml new file mode 100644 index 00000000..0a26caed --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/mgrote.r8152_kernel_module_on_off/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: check if module is installed - folder + become: true + ansible.builtin.stat: + path: "/lib/modules/r8152/{{ r8152_filename }}" + register: folder_exists + +- name: check if module is installed - lsmod + become: true + ansible.builtin.shell: lsmod + register: module_in_lsmod + changed_when: false # sorgt dafür das der Task nie als "changed" angezeigt wird + +- name: include tasks (task get skipped if the folder or the module exists or r8152_module_needed == false) + ansible.builtin.include_tasks: doing.yml + when: ((folder_exists.stat.exists == False) or (module_in_lsmod.stdout.find('r8152') == -1)) and (r8152_module_needed) diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/tasks/doing.yml b/friedhof/mgrote_r8152_kernel_module_on_off/tasks/doing.yml new file mode 100644 index 00000000..3163163e --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/tasks/doing.yml @@ -0,0 +1,83 @@ +--- +- name: install needed packages + become: true + ansible.builtin.package: + name: "{{ r8152_packages }}" + state: present + register: aptp + + +- name: add reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" + +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + register: aptc + +- name: updated installed packages + become: true + ansible.builtin.package: + upgrade: dist + register: apti + +- name: reboot - 1 + ansible.builtin.reboot: + reboot_timeout: "{{ r8152_reboot_timeout }}" + pre_reboot_delay: "{{ r8152_reboot_timeout }}" + post_reboot_delay: "{{ r8152_post_reboot_delay }}" + when: + - aptp.changed + - apti.changed + - aptc.changed + +- name: create dirs + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - "/tmp/r8152/" + - "/lib/modules/r8152/{{ r8152_filename }}" + +- name: copy archive + become: true + ansible.builtin.copy: + src: "files/{{ r8152_filename }}.tar.bz2" + dest: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" + mode: '0775' + +- name: extract archive + become: true + ansible.builtin.unarchive: + src: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" + dest: "/lib/modules/r8152/{{ r8152_filename }}" + mode: a+x + extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives + remote_src: true #datei liegt also auf dem zielsystem + +- name: make + community.general.make: + chdir: "/lib/modules/r8152/{{ r8152_filename }}" + become: true + +- name: make install + community.general.make: + chdir: "/lib/modules/r8152/{{ r8152_filename }}" + target: install + become: true + +- name: depmod -a + become: true + ansible.builtin.shell: depmod -a + +- name: reboot - 2 + ansible.builtin.reboot: + reboot_timeout: "{{ r8152_reboot_timeout }}" + pre_reboot_delay: "{{ r8152_reboot_timeout }}" + post_reboot_delay: "{{ r8152_post_reboot_delay }}" + +- name: cancel reboot(for safekeeping) + become: true + ansible.builtin.shell: shutdown -c diff --git a/friedhof/mgrote_r8152_kernel_module_on_off/tasks/main.yml b/friedhof/mgrote_r8152_kernel_module_on_off/tasks/main.yml new file mode 100644 index 00000000..0a26caed --- /dev/null +++ b/friedhof/mgrote_r8152_kernel_module_on_off/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: check if module is installed - folder + become: true + ansible.builtin.stat: + path: "/lib/modules/r8152/{{ r8152_filename }}" + register: folder_exists + +- name: check if module is installed - lsmod + become: true + ansible.builtin.shell: lsmod + register: module_in_lsmod + changed_when: false # sorgt dafür das der Task nie als "changed" angezeigt wird + +- name: include tasks (task get skipped if the folder or the module exists or r8152_module_needed == false) + ansible.builtin.include_tasks: doing.yml + when: ((folder_exists.stat.exists == False) or (module_in_lsmod.stdout.find('r8152') == -1)) and (r8152_module_needed) diff --git a/roles/mgrote.mount_cifs/LICENSE b/friedhof/mgrote_supermicro_fan_control/LICENSE similarity index 100% rename from roles/mgrote.mount_cifs/LICENSE rename to friedhof/mgrote_supermicro_fan_control/LICENSE diff --git a/roles/mgrote.supermicro_fan_control/README.md b/friedhof/mgrote_supermicro_fan_control/README.md similarity index 100% rename from roles/mgrote.supermicro_fan_control/README.md rename to friedhof/mgrote_supermicro_fan_control/README.md diff --git a/friedhof/mgrote_supermicro_fan_control/handlers/main.yml b/friedhof/mgrote_supermicro_fan_control/handlers/main.yml new file mode 100644 index 00000000..176ba46f --- /dev/null +++ b/friedhof/mgrote_supermicro_fan_control/handlers/main.yml @@ -0,0 +1,25 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: systemctl enable units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + enabled: true + masked: false + with_items: + - sm_fan_control.service + - sm_fan_control.timer + +- name: systemctl start units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + state: restarted + enabled: true + with_items: + - sm_fan_control.timer + notify: systemctl daemon-reload diff --git a/roles/mgrote.munin-node/LICENSE b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/LICENSE similarity index 100% rename from roles/mgrote.munin-node/LICENSE rename to friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/LICENSE diff --git a/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/README.md b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/README.md new file mode 100644 index 00000000..b52dd8f3 --- /dev/null +++ b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/README.md @@ -0,0 +1,25 @@ +## mgrote.supermicro_fan_control + +### Beschreibung +Setzt den Fan-Mode auf "Standard". +Setzt die Grenzwerte fur die Lüfterdrehzahlen passend für "beQuiet PureWings 2 140mm" + +### getestet auf +- [X] ProxMox 7* + + +### Sonstiges +Setze Fan Speed für "CPU" auf 25%: `ipmitool raw 0x30 0x70 0x66 0x01 0x01 0x16` +Setze Fan Speed für "Case" 50%: `ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x32` +Setze Fan-Threshold: `ipmitool sensor thresh "FAN5" lower 100 200 300` + + + Locating sensor record 'FAN5'... + Setting sensor "FAN5" Lower Non-Recoverable threshold to 100.000 + Setting sensor "FAN5" Lower Critical threshold to 200.000 + Setting sensor "FAN5" Lower Non-Critical threshold to 300.000 + + +### Quellen +* https://forums.servethehome.com/index.php?resources/supermicro-x9-x10-x11-fan-speed-control.20/ +* https://www.truenas.com/community/resources/how-to-change-ipmi-sensor-thresholds-using-ipmitool.35/ diff --git a/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/handlers/main.yml b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/handlers/main.yml new file mode 100644 index 00000000..176ba46f --- /dev/null +++ b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/handlers/main.yml @@ -0,0 +1,25 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: systemctl enable units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + enabled: true + masked: false + with_items: + - sm_fan_control.service + - sm_fan_control.timer + +- name: systemctl start units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + state: restarted + enabled: true + with_items: + - sm_fan_control.timer + notify: systemctl daemon-reload diff --git a/roles/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png similarity index 100% rename from roles/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png rename to friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png diff --git a/roles/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png similarity index 100% rename from roles/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png rename to friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/screenshots/2022-03-27 13_20_11-default_1_ansible2.grote.lan - _default_1_bash - _pve2_ _.png diff --git a/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/tasks/main.yml b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/tasks/main.yml new file mode 100644 index 00000000..1a908615 --- /dev/null +++ b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/tasks/main.yml @@ -0,0 +1,36 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - ipmitool + state: present + +- name: template sm_fan_control.service + become: true + ansible.builtin.template: + src: sm_fan_control.service.j2 + dest: /etc/systemd/system/sm_fan_control.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: template sm_fan_control.timer + become: true + ansible.builtin.template: + src: sm_fan_control.timer.j2 + dest: /etc/systemd/system/sm_fan_control.timer + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: systemctl start sm_fan_control.timer + become: true + ansible.builtin.systemd: + name: sm_fan_control.timer + state: started + enabled: true diff --git a/roles/mgrote.supermicro_fan_control/templates/sm_fan_control.service.j2 b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/templates/sm_fan_control.service.j2 similarity index 100% rename from roles/mgrote.supermicro_fan_control/templates/sm_fan_control.service.j2 rename to friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/templates/sm_fan_control.service.j2 diff --git a/roles/mgrote.supermicro_fan_control/templates/sm_fan_control.timer.j2 b/friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/templates/sm_fan_control.timer.j2 similarity index 100% rename from roles/mgrote.supermicro_fan_control/templates/sm_fan_control.timer.j2 rename to friedhof/mgrote_supermicro_fan_control/mgrote.supermicro_fan_control/templates/sm_fan_control.timer.j2 diff --git a/friedhof/mgrote_supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png b/friedhof/mgrote_supermicro_fan_control/screenshots/2022-03-27 13_19_36-Reference Material - Supermicro X9_X10_X11 Fan Speed Control _ ServeTheHome Foru.png new file mode 100644 index 0000000000000000000000000000000000000000..e85b1446348d849ded60981685c9f7dff3b81ae6 GIT binary patch literal 164235 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Ü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%0ApI~M8#F%I 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 z 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

HT$KF`u9r4Mp( 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.04) + +### Variablen + Defaults +see [defaults](./defaults/main.yml) diff --git a/friedhof/mgrote_timeshift/mgrote.timeshift/handlers/main.yml b/friedhof/mgrote_timeshift/mgrote.timeshift/handlers/main.yml new file mode 100644 index 00000000..dced8ff2 --- /dev/null +++ b/friedhof/mgrote_timeshift/mgrote.timeshift/handlers/main.yml @@ -0,0 +1,4 @@ +--- +- name: create snapshot + become: true + ansible.builtin.shell: "/usr/bin/timeshift --scripted --create" diff --git a/friedhof/mgrote_timeshift/mgrote.timeshift/tasks/main.yml b/friedhof/mgrote_timeshift/mgrote.timeshift/tasks/main.yml new file mode 100644 index 00000000..2663b394 --- /dev/null +++ b/friedhof/mgrote_timeshift/mgrote.timeshift/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - timeshift + state: present + notify: create snapshot + +- name: copy timeshift config + become: true + ansible.builtin.template: + src: "timeshift.json" + dest: "/etc/timeshift/timeshift.json" + +- name: create timeshift cronjob + become: true + ansible.builtin.cron: + name: restic + state: present + job: "/usr/bin/timeshift --scripted --create" + minute: "7" + hour: "*/4" diff --git a/roles/mgrote.timeshift/templates/timeshift.json b/friedhof/mgrote_timeshift/mgrote.timeshift/templates/timeshift.json similarity index 100% rename from roles/mgrote.timeshift/templates/timeshift.json rename to friedhof/mgrote_timeshift/mgrote.timeshift/templates/timeshift.json diff --git a/friedhof/mgrote_timeshift/tasks/main.yml b/friedhof/mgrote_timeshift/tasks/main.yml new file mode 100644 index 00000000..2663b394 --- /dev/null +++ b/friedhof/mgrote_timeshift/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - timeshift + state: present + notify: create snapshot + +- name: copy timeshift config + become: true + ansible.builtin.template: + src: "timeshift.json" + dest: "/etc/timeshift/timeshift.json" + +- name: create timeshift cronjob + become: true + ansible.builtin.cron: + name: restic + state: present + job: "/usr/bin/timeshift --scripted --create" + minute: "7" + hour: "*/4" diff --git a/friedhof/mgrote_timeshift/templates/timeshift.json b/friedhof/mgrote_timeshift/templates/timeshift.json new file mode 100644 index 00000000..af2fd8ab --- /dev/null +++ b/friedhof/mgrote_timeshift/templates/timeshift.json @@ -0,0 +1,31 @@ +{{ file_header | default () }} +{ + "backup_device_uuid" : "9b924961-0fd4-423f-b440-f2f3d1fa46d8", + "parent_device_uuid" : "", + "do_first_run" : "false", + "btrfs_mode" : "false", + "include_btrfs_home_for_backup" : "false", + "include_btrfs_home_for_restore" : "false", + "stop_cron_emails" : "false", + "btrfs_use_qgroup" : "false", + "schedule_monthly" : "false", + "schedule_weekly" : "false", + "schedule_daily" : "false", + "schedule_hourly" : "false", + "schedule_boot" : "false", + "count_monthly" : "2", + "count_weekly" : "3", + "count_daily" : "7", + "count_hourly" : "6", + "count_boot" : "5", + "snapshot_size" : "7515627384", + "snapshot_count" : "254372", + "date_format" : "%Y-%m-%d %H:%M:%S", + "exclude" : [ + "/root/**", + "/home/polybar/**", + "/home/ansible-user/**", + "/home/mg/**" + ], + "exclude-apps" : [] +} diff --git a/roles/mgrote.pbs_pve_integration/LICENSE b/friedhof/mgrote_tor_node/LICENSE similarity index 100% rename from roles/mgrote.pbs_pve_integration/LICENSE rename to friedhof/mgrote_tor_node/LICENSE diff --git a/roles/mgrote.tor-node/README.md b/friedhof/mgrote_tor_node/README.md similarity index 100% rename from roles/mgrote.tor-node/README.md rename to friedhof/mgrote_tor_node/README.md diff --git a/friedhof/mgrote_tor_node/defaults/main.yml b/friedhof/mgrote_tor_node/defaults/main.yml new file mode 100644 index 00000000..f02f40c7 --- /dev/null +++ b/friedhof/mgrote_tor_node/defaults/main.yml @@ -0,0 +1,18 @@ +--- +# required +# [a-zA-Z0-9] +tor_relay_name: tor1name +tor_or_port: 443 +tor_socks_port: 0 +tor_control_socket: 0 +tor_contact_info: webmaster@domain.local +tor_control_port: 9051 +# optional +# tor_my_family: name +# tor_bandwidth_rate: +# tor_bandwidth_burst: +tor_mode: relay # OR bridge +tor_bridge_port: 5555 + +# use IPv6 +tor_ipv6: false diff --git a/friedhof/mgrote_tor_node/handlers/main.yml b/friedhof/mgrote_tor_node/handlers/main.yml new file mode 100644 index 00000000..44896b18 --- /dev/null +++ b/friedhof/mgrote_tor_node/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart tor + become: true + ansible.builtin.systemd: + name: tor + enabled: true + state: restarted diff --git a/friedhof/mgrote_tor_node/tasks/bridge.yml b/friedhof/mgrote_tor_node/tasks/bridge.yml new file mode 100644 index 00000000..bea1d5ed --- /dev/null +++ b/friedhof/mgrote_tor_node/tasks/bridge.yml @@ -0,0 +1,15 @@ +--- +- name: install obsf packages + become: true + ansible.builtin.package: + name: + - obfs4proxy + state: present + notify: restart tor + +- name: templating torrc + become: true + ansible.builtin.template: + src: "bridge_torrc" + dest: "/etc/tor/torrc" + notify: restart tor diff --git a/friedhof/mgrote_tor_node/tasks/main.yml b/friedhof/mgrote_tor_node/tasks/main.yml new file mode 100644 index 00000000..77a3a3df --- /dev/null +++ b/friedhof/mgrote_tor_node/tasks/main.yml @@ -0,0 +1,39 @@ +--- +- name: install dependencies + become: true + ansible.builtin.package: + name: apt-transport-https + state: present + +- name: add tor repo key + ansible.builtin.apt_key: + url: https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc + state: present + +- name: add tor repo + ansible.builtin.apt_repository: + repo: deb https://deb.torproject.org/torproject.org {{ ansible_distribution_release }} main + state: present + filename: tor + +- name: install tor packages + become: true + ansible.builtin.package: + name: + - tor + - deb.torproject.org-keyring + state: present + notify: restart tor + +- name: include bridge tasks + ansible.builtin.include_tasks: bridge.yml + when: + - tor_mode == 'bridge' + +- name: include relay tasks + ansible.builtin.include_tasks: relay.yml + when: + - tor_mode == 'relay' + +- name: include nyx tasks + ansible.builtin.include_tasks: nyx.yml diff --git a/friedhof/mgrote_tor_node/tasks/nyx.yml b/friedhof/mgrote_tor_node/tasks/nyx.yml new file mode 100644 index 00000000..ea4b33cf --- /dev/null +++ b/friedhof/mgrote_tor_node/tasks/nyx.yml @@ -0,0 +1,8 @@ +--- +- name: install nyx packages + become: true + ansible.builtin.package: + name: + - nyx + state: present + notify: restart tor diff --git a/friedhof/mgrote_tor_node/tasks/relay.yml b/friedhof/mgrote_tor_node/tasks/relay.yml new file mode 100644 index 00000000..e688c672 --- /dev/null +++ b/friedhof/mgrote_tor_node/tasks/relay.yml @@ -0,0 +1,7 @@ +--- +- name: templating torrc + become: true + ansible.builtin.template: + src: "relay_torrc" + dest: "/etc/tor/torrc" + notify: restart tor diff --git a/roles/mgrote.tor-node/templates/bridge_torrc b/friedhof/mgrote_tor_node/templates/bridge_torrc similarity index 100% rename from roles/mgrote.tor-node/templates/bridge_torrc rename to friedhof/mgrote_tor_node/templates/bridge_torrc diff --git a/roles/mgrote.tor-node/templates/relay_torrc b/friedhof/mgrote_tor_node/templates/relay_torrc similarity index 100% rename from roles/mgrote.tor-node/templates/relay_torrc rename to friedhof/mgrote_tor_node/templates/relay_torrc diff --git a/roles/mgrote.pbs_users/LICENSE b/friedhof/mgrote_xnview/LICENSE similarity index 100% rename from roles/mgrote.pbs_users/LICENSE rename to friedhof/mgrote_xnview/LICENSE diff --git a/roles/mgrote.xnview/README.md b/friedhof/mgrote_xnview/README.md similarity index 100% rename from roles/mgrote.xnview/README.md rename to friedhof/mgrote_xnview/README.md diff --git a/friedhof/mgrote_xnview/defaults/main.yml b/friedhof/mgrote_xnview/defaults/main.yml new file mode 100644 index 00000000..3ba6a4e6 --- /dev/null +++ b/friedhof/mgrote_xnview/defaults/main.yml @@ -0,0 +1,2 @@ +--- +xnview_deb_url: https://download.xnview.com/XnViewMP-linux-x64.deb diff --git a/roles/mgrote.polybar/LICENSE b/friedhof/mgrote_xnview/mgrote.xnview/LICENSE similarity index 100% rename from roles/mgrote.polybar/LICENSE rename to friedhof/mgrote_xnview/mgrote.xnview/LICENSE diff --git a/friedhof/mgrote_xnview/mgrote.xnview/README.md b/friedhof/mgrote_xnview/mgrote.xnview/README.md new file mode 100644 index 00000000..7debfdd9 --- /dev/null +++ b/friedhof/mgrote_xnview/mgrote.xnview/README.md @@ -0,0 +1,8 @@ +## mgrote.xnview +### Beschreibung +Installiert xnview. + + +### getestet auf +- [x] Ubuntu (>=18.04) +- [x] Linux Mint diff --git a/friedhof/mgrote_xnview/mgrote.xnview/defaults/main.yml b/friedhof/mgrote_xnview/mgrote.xnview/defaults/main.yml new file mode 100644 index 00000000..3ba6a4e6 --- /dev/null +++ b/friedhof/mgrote_xnview/mgrote.xnview/defaults/main.yml @@ -0,0 +1,2 @@ +--- +xnview_deb_url: https://download.xnview.com/XnViewMP-linux-x64.deb diff --git a/friedhof/mgrote_xnview/mgrote.xnview/tasks/main.yml b/friedhof/mgrote_xnview/mgrote.xnview/tasks/main.yml new file mode 100644 index 00000000..595e0b50 --- /dev/null +++ b/friedhof/mgrote_xnview/mgrote.xnview/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- name: download and install xnview + become: true + ansible.builtin.apt: + deb: "{{ xnview_deb_url }}" diff --git a/friedhof/mgrote_xnview/tasks/main.yml b/friedhof/mgrote_xnview/tasks/main.yml new file mode 100644 index 00000000..595e0b50 --- /dev/null +++ b/friedhof/mgrote_xnview/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- name: download and install xnview + become: true + ansible.builtin.apt: + deb: "{{ xnview_deb_url }}" diff --git a/roles/mgrote.postfix/LICENSE b/friedhof/mgrote_xrdp/LICENSE similarity index 100% rename from roles/mgrote.postfix/LICENSE rename to friedhof/mgrote_xrdp/LICENSE diff --git a/roles/mgrote.xrdp/README.md b/friedhof/mgrote_xrdp/README.md similarity index 100% rename from roles/mgrote.xrdp/README.md rename to friedhof/mgrote_xrdp/README.md diff --git a/roles/mgrote.proxmox_bind_mounts/LICENSE b/friedhof/mgrote_xrdp/mgrote.xrdp/LICENSE similarity index 100% rename from roles/mgrote.proxmox_bind_mounts/LICENSE rename to friedhof/mgrote_xrdp/mgrote.xrdp/LICENSE diff --git a/friedhof/mgrote_xrdp/mgrote.xrdp/README.md b/friedhof/mgrote_xrdp/mgrote.xrdp/README.md new file mode 100644 index 00000000..ba582fa2 --- /dev/null +++ b/friedhof/mgrote_xrdp/mgrote.xrdp/README.md @@ -0,0 +1,11 @@ +## mgrote.xrdp +### Beschreibung +Installiert xrdp. + +### getestet auf +- [ ] Ubuntu (>=18.04) +- [x] Linux Mint + + +### Variablen +`xrdp_user` - user whos session-config gets created(default: `mg`) diff --git a/friedhof/mgrote_xrdp/mgrote.xrdp/tasks/main.yml b/friedhof/mgrote_xrdp/mgrote.xrdp/tasks/main.yml new file mode 100644 index 00000000..b4a65176 --- /dev/null +++ b/friedhof/mgrote_xrdp/mgrote.xrdp/tasks/main.yml @@ -0,0 +1,24 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - xrdp + - xorgxrdp + state: present + +- name: create xsession config file + become: true + ansible.builtin.file: + path: "/home/{{ xrdp_user | default('mg') }}/.xsession" + state: touch + owner: "{{ xrdp_user | default('mg') }}" + modification_time: preserve + access_time: preserve + +- name: set xsession config + become: true + ansible.builtin.blockinfile: + path: "/home/{{ xrdp_user | default('mg') }}/.xsession" + block: | + env -u SESSION_MANAGER -u DBUS_SESSION_BUS_ADDRESS cinnamon-session diff --git a/friedhof/mgrote_xrdp/tasks/main.yml b/friedhof/mgrote_xrdp/tasks/main.yml new file mode 100644 index 00000000..b4a65176 --- /dev/null +++ b/friedhof/mgrote_xrdp/tasks/main.yml @@ -0,0 +1,24 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - xrdp + - xorgxrdp + state: present + +- name: create xsession config file + become: true + ansible.builtin.file: + path: "/home/{{ xrdp_user | default('mg') }}/.xsession" + state: touch + owner: "{{ xrdp_user | default('mg') }}" + modification_time: preserve + access_time: preserve + +- name: set xsession config + become: true + ansible.builtin.blockinfile: + path: "/home/{{ xrdp_user | default('mg') }}/.xsession" + block: | + env -u SESSION_MANAGER -u DBUS_SESSION_BUS_ADDRESS cinnamon-session diff --git a/roles/mgrote.proxmox_lxc_profiles/LICENSE b/friedhof/mgrote_zswap/LICENSE similarity index 100% rename from roles/mgrote.proxmox_lxc_profiles/LICENSE rename to friedhof/mgrote_zswap/LICENSE diff --git a/roles/mgrote.zswap/README.md b/friedhof/mgrote_zswap/README.md similarity index 100% rename from roles/mgrote.zswap/README.md rename to friedhof/mgrote_zswap/README.md diff --git a/friedhof/mgrote_zswap/defaults/main.yml b/friedhof/mgrote_zswap/defaults/main.yml new file mode 100644 index 00000000..f30e693b --- /dev/null +++ b/friedhof/mgrote_zswap/defaults/main.yml @@ -0,0 +1,2 @@ +--- +zswap_path: "/sys/module/zswap/parameters/enabled" diff --git a/roles/mgrote.qemu_guest_agent/LICENSE b/friedhof/mgrote_zswap/mgrote.zswap/LICENSE similarity index 100% rename from roles/mgrote.qemu_guest_agent/LICENSE rename to friedhof/mgrote_zswap/mgrote.zswap/LICENSE diff --git a/friedhof/mgrote_zswap/mgrote.zswap/README.md b/friedhof/mgrote_zswap/mgrote.zswap/README.md new file mode 100644 index 00000000..e3ed0a3b --- /dev/null +++ b/friedhof/mgrote_zswap/mgrote.zswap/README.md @@ -0,0 +1,10 @@ +## mgrote.zswap + +### Beschreibung + +Aktiviert [zswap](https://www.kernel.org/doc/html/latest/admin-guide/mm/zswap.html) per cronjob + + +### getestet auf + +- [x] Ubuntu (>=20.04) diff --git a/friedhof/mgrote_zswap/mgrote.zswap/defaults/main.yml b/friedhof/mgrote_zswap/mgrote.zswap/defaults/main.yml new file mode 100644 index 00000000..f30e693b --- /dev/null +++ b/friedhof/mgrote_zswap/mgrote.zswap/defaults/main.yml @@ -0,0 +1,2 @@ +--- +zswap_path: "/sys/module/zswap/parameters/enabled" diff --git a/friedhof/mgrote_zswap/mgrote.zswap/tasks/main.yml b/friedhof/mgrote_zswap/mgrote.zswap/tasks/main.yml new file mode 100644 index 00000000..609a6c4b --- /dev/null +++ b/friedhof/mgrote_zswap/mgrote.zswap/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: add zswap to crontab + ansible.builtin.cron: + name: "activate zswap" + special_time: reboot + job: "echo 1 > {{ zswap_path }}" diff --git a/friedhof/mgrote_zswap/tasks/main.yml b/friedhof/mgrote_zswap/tasks/main.yml new file mode 100644 index 00000000..609a6c4b --- /dev/null +++ b/friedhof/mgrote_zswap/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: add zswap to crontab + ansible.builtin.cron: + name: "activate zswap" + special_time: reboot + job: "echo 1 > {{ zswap_path }}" diff --git a/group_vars/all.yml b/group_vars/all.yml index a49d7a01..35c1edbe 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -1,220 +1,220 @@ --- - ### wird in vielen Rollen verwendet - ssh_public_key_mg: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKL8opSQ0rWVw9uCfbuiqmXq188OP4xh66MBTO3zV5jo heimserver_mg_v3 - empfaenger_mail: michael.grote@posteo.de - file_header: | - #----------------------------------------------------------------# - # This file is managed with ansible! # - #----------------------------------------------------------------# - ### mgrote.restic - restic_user: root - restic_group: restic - restic_conf_dir: /etc/restic - restic_exclude: | - ._* - desktop.ini - .Trash-* - **/**cache***/** - **/**Cache***/** - **/**AppData***/** - # https://github.com/restic/restic/issues/1005 - # https://forum.restic.net/t/exclude-syntax-confusion/1531/12 - restic_mount_timeout: "10 min" - restic_failure_delay: "30 s" - restic_schedule: "0/6:00" # alle 6 Stunden - restic_folders_to_backup: "/" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files - restic_repository: "//fileserver3.grote.lan/restic" - restic_repository_password: "{{ lookup('keepass', 'restic_repository_password', 'password') }}" - restic_mount_user: restic - restic_mount_password: "{{ lookup('keepass', 'fileserver_smb_user_restic', 'password') }}" - restic_fail_mail: "{{ empfaenger_mail }}" - ### mgrote.user - users: - - username: mg - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: "{{ ssh_public_key_mg }}" - allow_sudo: true - allow_passwordless_sudo: true - - username: ansible-user - password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu - allow_sudo: true - allow_passwordless_sudo: true +### wird in vielen Rollen verwendet +ssh_public_key_mg: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKL8opSQ0rWVw9uCfbuiqmXq188OP4xh66MBTO3zV5jo heimserver_mg_v3 +empfaenger_mail: michael.grote@posteo.de +file_header: | + #----------------------------------------------------------------# + # This file is managed with ansible! # + #----------------------------------------------------------------# +### mgrote.restic +restic_user: root +restic_group: restic +restic_conf_dir: /etc/restic +restic_exclude: | + ._* + desktop.ini + .Trash-* + **/**cache***/** + **/**Cache***/** + **/**AppData***/** + # https://github.com/restic/restic/issues/1005 + # https://forum.restic.net/t/exclude-syntax-confusion/1531/12 +restic_mount_timeout: "10 min" +restic_failure_delay: "30 s" +restic_schedule: "0/6:00" # alle 6 Stunden +restic_folders_to_backup: "/" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files +restic_repository: "//fileserver3.grote.lan/restic" +restic_repository_password: "{{ lookup('keepass', 'restic_repository_password', 'password') }}" +restic_mount_user: restic +restic_mount_password: "{{ lookup('keepass', 'fileserver_smb_user_restic', 'password') }}" +restic_fail_mail: "{{ empfaenger_mail }}" +### mgrote.user +users: + - username: mg + password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: "{{ ssh_public_key_mg }}" + allow_sudo: true + allow_passwordless_sudo: true + - username: ansible-user + password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu + allow_sudo: true + allow_passwordless_sudo: true - ### mgrote.dotfiles - dotfiles_repo_url: https://git.mgrote.net/mg/dotfiles - dotfiles_repo_path: /home/mg/dotfiles - dotfiles_files: - - repo_path: "{{ dotfiles_repo_path}}/.vimrc" - local_path: "/home/mg/.vimrc" - - repo_path: "{{ dotfiles_repo_path}}/.tmux.conf" - local_path: "/home/mg/.tmux.conf" - - repo_path: "{{ dotfiles_repo_path}}/.gitconfig" - local_path: "/home/mg/.gitconfig" - dotfiles_owner: mg - ### jnv.unattended_upgrades - unattended_mail: "{{ empfaenger_mail }}" - unattended_mail_only_on_error: true - unattended_syslog_enable: true - unattended_origins_patterns: - - 'origin=Ubuntu,archive=${distro_codename}-security' - - 'o=Ubuntu,a=${distro_codename}-updates' - ### mgrote.ntp_chrony_client - ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet - ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile - ntp_chrony_servers: # welche Server sollen befragt werden - - address: ptbtime1.ptb.de - options: iburst #optionaler parameter - ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_logging: false +### mgrote.dotfiles +dotfiles_repo_url: https://git.mgrote.net/mg/dotfiles +dotfiles_repo_path: /home/mg/dotfiles +dotfiles_files: + - repo_path: "{{ dotfiles_repo_path }}/.vimrc" + local_path: "/home/mg/.vimrc" + - repo_path: "{{ dotfiles_repo_path }}/.tmux.conf" + local_path: "/home/mg/.tmux.conf" + - repo_path: "{{ dotfiles_repo_path }}/.gitconfig" + local_path: "/home/mg/.gitconfig" +dotfiles_owner: mg +### jnv.unattended_upgrades +unattended_mail: "{{ empfaenger_mail }}" +unattended_mail_only_on_error: true +unattended_syslog_enable: true +unattended_origins_patterns: + - 'origin=Ubuntu,archive=${distro_codename}-security' + - 'o=Ubuntu,a=${distro_codename}-updates' +### mgrote.ntp_chrony_client +ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet +ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile +ntp_chrony_servers: # welche Server sollen befragt werden + - address: ptbtime1.ptb.de + options: iburst #optionaler parameter +ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_logging: false - ### mgrote.postfix - postfix_absender_mailadresse: info@mgrote.net - postfix_absender_passwort: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" - postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24" - postfix_mail_nach_cronjob: false - postfix_smtp_server: smtp.strato.de - postfix_smtp_server_port: 587 - postfix_smtp_use_tls: "yes" - ### mgrote.tmux - tmux_conf_destination: "/home/mg/.tmux.conf" - tmux_bashrc_destination: "/home/mg/.bashrc" - tmux_standardsession_name: "default" - ### mgrote.fail2ban - f2b_bantime: 300 - f2b_findtime: 300 - f2b_maxretry: 5 - f2b_destemail: "{{ empfaenger_mail }}" - f2b_sender: "{{ postfix_absender_mailadresse }}" - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - ufw_default_incoming_policy: deny - ufw_default_outgoing_policy: allow - ### mgrote.apt_manage_packages - apt_packages_common: - - locales - - python3 - - build-essential - - htop - - git - - dnsutils - - mc - - cifs-utils - - haveged #https://www.linux-magazin.de/ausgaben/2011/09/einfuehrung2/ - - ca-certificates - - netdiscover - - tree - - curl - - whois - - logrotate - - ncdu - - net-tools - - apt-transport-https - - neofetch - - moreutils - - acl - - vim - - rsync - - at - - ripgrep - - iotop - - pwgen - - keychain - apt_packages_physical: - - s-tui - - smartmontools - - lm-sensors - - ethtool - apt_packages_vm: - - qemu-guest-agent - - open-vm-tools - apt_packages_absent: - - nano - - snapd - - ubuntu-advantage-tools - apt_packages_internet: - - http://docker10.grote.lan:3344/bash-helper-scripts-mgrote-latest.deb +### mgrote.postfix +postfix_absender_mailadresse: info@mgrote.net +postfix_absender_passwort: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" +postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24" +postfix_mail_nach_cronjob: false +postfix_smtp_server: smtp.strato.de +postfix_smtp_server_port: 587 +postfix_smtp_use_tls: "yes" +### mgrote.tmux +tmux_conf_destination: "/home/mg/.tmux.conf" +tmux_bashrc_destination: "/home/mg/.bashrc" +tmux_standardsession_name: "default" +### mgrote.fail2ban +f2b_bantime: 300 +f2b_findtime: 300 +f2b_maxretry: 5 +f2b_destemail: "{{ empfaenger_mail }}" +f2b_sender: "{{ postfix_absender_mailadresse }}" +### oefenweb.ufw +ufw_rules: + - rule: allow + to_port: 22 + protocol: tcp + comment: 'ssh' + from_ip: 0.0.0.0/0 +ufw_default_incoming_policy: deny +ufw_default_outgoing_policy: allow +### mgrote.apt_manage_packages +apt_packages_common: + - locales + - python3 + - build-essential + - htop + - git + - dnsutils + - mc + - cifs-utils + - haveged #https://www.linux-magazin.de/ausgaben/2011/09/einfuehrung2/ + - ca-certificates + - netdiscover + - tree + - curl + - whois + - logrotate + - ncdu + - net-tools + - apt-transport-https + - neofetch + - moreutils + - acl + - vim + - rsync + - at + - ripgrep + - iotop + - pwgen + - keychain +apt_packages_physical: + - s-tui + - smartmontools + - lm-sensors + - ethtool +apt_packages_vm: + - qemu-guest-agent + - open-vm-tools +apt_packages_absent: + - nano + - snapd + - ubuntu-advantage-tools +apt_packages_internet: + - http://docker10.grote.lan:3344/bash-helper-scripts-mgrote-latest.deb - ### mgrote.zfs_sanoid - sanoid_templates: - - name: '31tage' - keep_hourly: '24' # Aufheben (Stunde) - keep_daily: '31' # Aufheben (Tage) - keep_monthly: '3' # Aufheben (Monate) - keep_yearly: '0' # Aufheben (Jahre) - frequently: '16' # Aufheben (Minuten) - frequent_period: '15' # Intervall (alle 5 Minuten) - autosnap: 'yes' # Automatisches erstellen von Snapshots - autoprune: 'yes' - - name: '14tage' - keep_hourly: '24' - keep_daily: '14' - keep_monthly: '0' - keep_yearly: '0' - frequently: '16' - frequent_period: '15' - autosnap: 'yes' - autoprune: 'yes' - - name: '3tage' - keep_hourly: '24' - keep_daily: '7' - keep_monthly: '0' - keep_yearly: '0' - frequently: '16' - frequent_period: '15' - autosnap: 'yes' - autoprune: 'yes' - - name: '3monate' - keep_hourly: '24' - keep_daily: '7' - keep_monthly: '3' - keep_yearly: '0' - frequently: '16' - frequent_period: '15' - autosnap: 'yes' - autoprune: 'yes' - - name: 'pve3tage' - keep_hourly: '72' - keep_daily: '5' - keep_monthly: '0' - keep_yearly: '0' - frequently: '16' - frequent_period: '15' - autosnap: 'yes' - autoprune: 'yes' +### mgrote.zfs_sanoid +sanoid_templates: + - name: '31tage' + keep_hourly: '24' # Aufheben (Stunde) + keep_daily: '31' # Aufheben (Tage) + keep_monthly: '3' # Aufheben (Monate) + keep_yearly: '0' # Aufheben (Jahre) + frequently: '16' # Aufheben (Minuten) + frequent_period: '15' # Intervall (alle 5 Minuten) + autosnap: 'yes' # Automatisches erstellen von Snapshots + autoprune: 'yes' + - name: '14tage' + keep_hourly: '24' + keep_daily: '14' + keep_monthly: '0' + keep_yearly: '0' + frequently: '16' + frequent_period: '15' + autosnap: 'yes' + autoprune: 'yes' + - name: '3tage' + keep_hourly: '24' + keep_daily: '7' + keep_monthly: '0' + keep_yearly: '0' + frequently: '16' + frequent_period: '15' + autosnap: 'yes' + autoprune: 'yes' + - name: '3monate' + keep_hourly: '24' + keep_daily: '7' + keep_monthly: '3' + keep_yearly: '0' + frequently: '16' + frequent_period: '15' + autosnap: 'yes' + autoprune: 'yes' + - name: 'pve3tage' + keep_hourly: '72' + keep_daily: '5' + keep_monthly: '0' + keep_yearly: '0' + frequently: '16' + frequent_period: '15' + autosnap: 'yes' + autoprune: 'yes' - ### mgrote.zfs_sanoid - sanoid_deb_url: http://docker10.grote.lan:3344/sanoid_3.0.4.deb +### mgrote.zfs_sanoid +sanoid_deb_url: http://docker10.grote.lan:3344/sanoid_3.0.4.deb - # Ansible Variablen - ### User - ansible_user: "ansible-user" - ### SSH - ansible_ssh_common_args: "'-o StrictHostKeyChecking=no'" - ### python3 - # https://docs.ansible.com/ansible/latest/reference_appendices/python_3_support.html - ansible_python_interpreter: "/usr/bin/python3" +# Ansible Variablen +### User +ansible_user: "ansible-user" +### SSH +ansible_ssh_common_args: "'-o StrictHostKeyChecking=no'" +### python3 +# https://docs.ansible.com/ansible/latest/reference_appendices/python_3_support.html +ansible_python_interpreter: "/usr/bin/python3" - # Ansible Plugin Variablen - ### Keepass - # https://github.com/viczem/ansible-keepass - keepass_dbx: "./keepass_db.kdbx" - keepass_psw: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 62383737623066396239383336646164616537646630653964313532383130343533346561633039 - 3437306134656535353438666165376332633064383135650a636537626662656130376537633164 - 61613132326536666466636632363866393066656236303766333338356337396338376266346631 - 6364336331623539300a313562303161373631613734313938346666376239613333333363376236 - 38363035376662353135333332363431343833656666643036326234656166643531 +# Ansible Plugin Variablen +### Keepass +# https://github.com/viczem/ansible-keepass +keepass_dbx: "./keepass_db.kdbx" +keepass_psw: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 62383737623066396239383336646164616537646630653964313532383130343533346561633039 + 3437306134656535353438666165376332633064383135650a636537626662656130376537633164 + 61613132326536666466636632363866393066656236303766333338356337396338376266346631 + 6364336331623539300a313562303161373631613734313938346666376239613333333363376236 + 38363035376662353135333332363431343833656666643036326234656166643531 diff --git a/group_vars/ansible.yml b/group_vars/ansible.yml index aa262fcf..0625961f 100644 --- a/group_vars/ansible.yml +++ b/group_vars/ansible.yml @@ -1,16 +1,16 @@ --- - ### geerlingguy.pip - pip_package: python3-pip - pip_install_packages: - - name: pykeepass - version: 3.2.1 - - name: Jinja2>=2.11.2 - - name: markupsafe - - name: ara - - name: jmespath - ### geerlingguy.ansible - ansible_install_method: pip - ansible_install_version_pip: '8.0.0' - ### mgrote.apt_manage_packages - apt_packages_extra: - - sshpass +### geerlingguy.pip +pip_package: python3-pip +pip_install_packages: + - name: pykeepass + version: 3.2.1 + - name: Jinja2>=2.11.2 + - name: markupsafe + - name: ara + - name: jmespath +### geerlingguy.ansible +ansible_install_method: pip +ansible_install_version_pip: '8.0.0' +### mgrote.apt_manage_packages +apt_packages_extra: + - sshpass diff --git a/group_vars/docker.yml b/group_vars/docker.yml index c014e84b..3d77562c 100644 --- a/group_vars/docker.yml +++ b/group_vars/docker.yml @@ -1,65 +1,66 @@ --- - ### mrlesmithjr.ansible-manage-lvm - lvm_groups: - - vgname: vg_docker - disks: - - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 - create: true - lvnames: - - lvname: lv_docker - size: +100%FREE - create: true - filesystem: xfs - mount: true - mntp: /var/lib/docker - manage_lvm: true - pvresize_to_max: true - ### mgrote.restic - restic_folders_to_backup: "/ /var/lib/docker" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files - ### mgrote.user - users: - - username: mg - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo, docker - state: present - public_ssh_key: "{{ ssh_public_key_mg }}" - allow_sudo: true - allow_passwordless_sudo: true - - username: docker-user - password: "{{ lookup('keepass', 'docker-user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo, docker - state: present - allow_sudo: true - allow_passwordless_sudo: true - uid: "5000" - - username: ansible-user - password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu - allow_sudo: true - allow_passwordless_sudo: true - ### geerlingguy.docker - docker_users: - - mg - - docker-user +### mrlesmithjr.ansible-manage-lvm +lvm_groups: + - vgname: vg_docker + disks: + - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 + create: true + lvnames: + - lvname: lv_docker + size: +100%FREE + create: true + filesystem: xfs + mount: true + mntp: /var/lib/docker +manage_lvm: true +pvresize_to_max: true +### mgrote.restic +restic_folders_to_backup: "/ /var/lib/docker" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files +### mgrote.user +users: + - username: mg + password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo, docker + state: present + public_ssh_key: "{{ ssh_public_key_mg }}" + allow_sudo: true + allow_passwordless_sudo: true + - username: docker-user + password: "{{ lookup('keepass', 'docker-user_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo, docker + state: present + allow_sudo: true + allow_passwordless_sudo: true + uid: "5000" + - username: ansible-user + password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu + allow_sudo: true + allow_passwordless_sudo: true - ### mgrote.docker-compose-deploy - docker_compose_base_dir: /home/docker-user +### geerlingguy.docker +docker_users: + - mg + - docker-user - ### mgrote.apt_manage_sources - repos_override: # mit docker-repos - - deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} main restricted" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates main restricted" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} universe" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates universe" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} multiverse" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates multiverse" - - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-backports main restricted universe multiverse" - - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security main restricted" - - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security universe" - - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security multiverse" +### mgrote.docker-compose-deploy +docker_compose_base_dir: /home/docker-user + +### mgrote.apt_manage_sources +repos_override: # mit docker-repos + - deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} main restricted" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates main restricted" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} universe" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates universe" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }} multiverse" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-updates multiverse" + - "deb http://de.archive.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-backports main restricted universe multiverse" + - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security main restricted" + - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security universe" + - "deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security multiverse" diff --git a/group_vars/dokuwiki.yml b/group_vars/dokuwiki.yml index f89f3cdf..1b03f3bd 100644 --- a/group_vars/dokuwiki.yml +++ b/group_vars/dokuwiki.yml @@ -1,19 +1,19 @@ --- - ### mgrote.dokuwiki - dokuwiki_install_path: /var/www/dokuwiki # wohin soll dokuwiki installiert werden - dokuwiki_download_url: https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz # wo soll dokuwiki heruntergeladen werden - dokuwiki_version_name: 2022-07-31 "Igor" # aus /var/www/dokuwiki/VERSION # welche Version, damit wird abgeglichen ob das Archiv heruntergeladen werden muss - dokuwiki_user: www-data # dokuwiki nutzer - dokuwiki_group: www-data # dokuwiki gruppe - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - - rule: allow - to_port: 80 - comment: 'dokuwiki-webserver' - from_ip: 0.0.0.0/0 - protocol: tcp +### mgrote.dokuwiki +dokuwiki_install_path: /var/www/dokuwiki # wohin soll dokuwiki installiert werden +dokuwiki_download_url: https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz # wo soll dokuwiki heruntergeladen werden +dokuwiki_version_name: 2022-07-31 "Igor" # aus /var/www/dokuwiki/VERSION # welche Version, damit wird abgeglichen ob das Archiv heruntergeladen werden muss +dokuwiki_user: www-data # dokuwiki nutzer +dokuwiki_group: www-data # dokuwiki gruppe +### oefenweb.ufw +ufw_rules: + - rule: allow + to_port: 22 + protocol: tcp + comment: 'ssh' + from_ip: 0.0.0.0/0 + - rule: allow + to_port: 80 + comment: 'dokuwiki-webserver' + from_ip: 0.0.0.0/0 + protocol: tcp diff --git a/group_vars/fileserver.yml b/group_vars/fileserver.yml index 03eae044..db04154b 100644 --- a/group_vars/fileserver.yml +++ b/group_vars/fileserver.yml @@ -1,121 +1,121 @@ --- - ### PROXMOX - # fileserver3 ist ein LXC-Container; der Container ist "privileged" damit der Bind-Mount die richtigen Rechte bekommt +### PROXMOX +# fileserver3 ist ein LXC-Container; der Container ist "privileged" damit der Bind-Mount die richtigen Rechte bekommt - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - - rule: allow - to_port: 445 - comment: 'smb' - from_ip: 0.0.0.0/0 - - rule: allow - to_port: 139 - comment: 'smb' - from_ip: 0.0.0.0/0 +### oefenweb.ufw +ufw_rules: + - rule: allow + to_port: 22 + protocol: tcp + comment: 'ssh' + from_ip: 0.0.0.0/0 + - rule: allow + to_port: 445 + comment: 'smb' + from_ip: 0.0.0.0/0 + - rule: allow + to_port: 139 + comment: 'smb' + from_ip: 0.0.0.0/0 - ### mgrote.apt_manage_packages - apt_packages_internet: - - http://docker10.grote.lan:3344/bash-helper-scripts-mgrote-latest.deb +### mgrote.apt_manage_packages +apt_packages_internet: + - http://docker10.grote.lan:3344/bash-helper-scripts-mgrote-latest.deb - ### mgrote.youtubedl - ytdl_dl_url: "https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp" - ytdl_timer: "Tue,Sat 03:00" - ytdl_bin_path: /usr/local/bin/yt-dlp - ytdl_active: true - ytdl_video_urls: - - https://www.youtube.com/c/KurzgesagtDE/videos # Kurzgesagt - Deutsch - - https://www.youtube.com/c/inanutshell/videos # Kurzgesagt - Englisch - - https://www.youtube.com/c/MartinSonneborn/videos #martin sonneborn - - https://www.youtube.com/c/100SekundenPhysik/videos #100 sekunden physik - - https://www.youtube.com/c/Handwerkskunst/videos #swr handwerkskunst kanal - - https://www.youtube.com/c/PracticalEngineeringChannel/videos # pracrical engineering - - https://www.youtube.com/channel/UC0vFIgkGrbmfxKVhZ2hgMeg/videos #gaby weber - - https://www.youtube.com/playlist?list=PLPM-eyPokAWNhhDNO4YzC5cGRwuI2ykwE # music - - https://www.youtube.com/playlist?list=PLPM-eyPokAWNnDxuyX131R5wkl8fzvu7D # lost and found - - https://www.youtube.com/playlist?list=PLPM-eyPokAWPmStfh37roJge-JuLfgma0 # lost and found 2 - - https://www.youtube.com/playlist?list=PLcpuu5BzmasC7cI-B713EY3xdpWrLhDdH #Japan Day in the Life Series by Paolo fromTOKYO - - https://www.youtube.com/playlist?list=PLlQWnS27jXh9gX1kvMT1frhzvFnDgP_8M # arte die großen mythen - - https://www.youtube.com/playlist?list=PLrMX9ct-uNyOKfDG0WrRd6fQsB21MzorZ # JoBlo - Videos - WTF HAPPENED TO THIS MOVIE?! - - https://www.youtube.com/playlist?list=PLrMX9ct-uNyOt0Z-iqBGuyiZU9pFJyvD5 # JoBlo - Videos - THE MOVIE THAT ALMOST WAS - - https://www.youtube.com/playlist?list=PLrMX9ct-uNyMNMZgSkxRdNh2xa8GEZQn4 # JoBlo - Videos - WTF HAPPENED TO THIS CELEBRITY?! - - https://www.youtube.com/watch?v=TowKvEJcYDw&list=PLlQWnS27jXh9aEp7hl54xrk5CgiVbvMBy # arte - zu Tisch in... - - https://www.youtube.com/playlist?list=PLs4hTtftqnlAkiQNdWn6bbKUr-P1wuSm0 # jimmy kimmel mean tweets - - https://www.youtube.com/tomstantonengineering - - https://www.youtube.com/@liamcarps #englandvideos ironisch - ytdl_podcast_urls: - - https://sternengeschichten.podigee.io/feed/aac # Sternengeschichten - - https://feeds.br.de/radiowissen/feed.xml # BR2 RadioWissen +### mgrote.youtubedl +ytdl_dl_url: "https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp" +ytdl_timer: "Tue,Sat 03:00" +ytdl_bin_path: /usr/local/bin/yt-dlp +ytdl_active: true +ytdl_video_urls: + - https://www.youtube.com/c/KurzgesagtDE/videos # Kurzgesagt - Deutsch + - https://www.youtube.com/c/inanutshell/videos # Kurzgesagt - Englisch + - https://www.youtube.com/c/MartinSonneborn/videos #martin sonneborn + - https://www.youtube.com/c/100SekundenPhysik/videos #100 sekunden physik + - https://www.youtube.com/c/Handwerkskunst/videos #swr handwerkskunst kanal + - https://www.youtube.com/c/PracticalEngineeringChannel/videos # pracrical engineering + - https://www.youtube.com/channel/UC0vFIgkGrbmfxKVhZ2hgMeg/videos #gaby weber + - https://www.youtube.com/playlist?list=PLPM-eyPokAWNhhDNO4YzC5cGRwuI2ykwE # music + - https://www.youtube.com/playlist?list=PLPM-eyPokAWNnDxuyX131R5wkl8fzvu7D # lost and found + - https://www.youtube.com/playlist?list=PLPM-eyPokAWPmStfh37roJge-JuLfgma0 # lost and found 2 + - https://www.youtube.com/playlist?list=PLcpuu5BzmasC7cI-B713EY3xdpWrLhDdH #Japan Day in the Life Series by Paolo fromTOKYO + - https://www.youtube.com/playlist?list=PLlQWnS27jXh9gX1kvMT1frhzvFnDgP_8M # arte die großen mythen + - https://www.youtube.com/playlist?list=PLrMX9ct-uNyOKfDG0WrRd6fQsB21MzorZ # JoBlo - Videos - WTF HAPPENED TO THIS MOVIE?! + - https://www.youtube.com/playlist?list=PLrMX9ct-uNyOt0Z-iqBGuyiZU9pFJyvD5 # JoBlo - Videos - THE MOVIE THAT ALMOST WAS + - https://www.youtube.com/playlist?list=PLrMX9ct-uNyMNMZgSkxRdNh2xa8GEZQn4 # JoBlo - Videos - WTF HAPPENED TO THIS CELEBRITY?! + - https://www.youtube.com/watch?v=TowKvEJcYDw&list=PLlQWnS27jXh9aEp7hl54xrk5CgiVbvMBy # arte - zu Tisch in... + - https://www.youtube.com/playlist?list=PLs4hTtftqnlAkiQNdWn6bbKUr-P1wuSm0 # jimmy kimmel mean tweets + - https://www.youtube.com/tomstantonengineering + - https://www.youtube.com/@liamcarps #englandvideos ironisch +ytdl_podcast_urls: + - https://sternengeschichten.podigee.io/feed/aac # Sternengeschichten + - https://feeds.br.de/radiowissen/feed.xml # BR2 RadioWissen - ytdl_video_output: "/shares_videos/Youtube/%(uploader)s/%(title)s-%(id)s.%(ext)s" # Videos werden jetzt IMMEr nach "Uploader/Name.ext" geschrieben +ytdl_video_output: "/shares_videos/Youtube/%(uploader)s/%(title)s-%(id)s.%(ext)s" # Videos werden jetzt IMMEr nach "Uploader/Name.ext" geschrieben - ytdl_podcast_output: "/shares_music/Podcasts/%(playlist)s/%(id)s.%(ext)s" - ytdl_video_log_output: "/shares_videos/Youtube/archive-youtube.log" - ytdl_podcast_log_output: "/shares_music/Podcasts/archive-podcast.log" - ytdl_youtube_username: "{{ lookup('keepass', 'youtubedl_youtube_login', 'username') }}" - ytdl_youtube_password: "{{ lookup('keepass', 'youtubedl_youtube_login', 'password') }}" - ytdl_conf_dir: "/etc/youtubedl" #ohne / am ende - ytdl_download_limit: "10000K" +ytdl_podcast_output: "/shares_music/Podcasts/%(playlist)s/%(id)s.%(ext)s" +ytdl_video_log_output: "/shares_videos/Youtube/archive-youtube.log" +ytdl_podcast_log_output: "/shares_music/Podcasts/archive-podcast.log" +ytdl_youtube_username: "{{ lookup('keepass', 'youtubedl_youtube_login', 'username') }}" +ytdl_youtube_password: "{{ lookup('keepass', 'youtubedl_youtube_login', 'password') }}" +ytdl_conf_dir: "/etc/youtubedl" #ohne / am ende +ytdl_download_limit: "10000K" - ### mgrote.smb_fileserver - smb_shares: - - name: 'videos' - path: '/shares_videos' - users_ro: 'kodi' - users_rw: 'michaelgrote win10' - - name: 'scans' - path: '/shares_scans' - users_ro: ' michaelgrote' - users_rw: 'brother_ads2700w' - - name: 'papa_backup' - path: '/shares_papa_backup' - users_ro: 'michaelgrote' - users_rw: 'win10' - - name: 'backup' - path: '/shares_backup' - users_ro: '' - users_rw: 'win10 michaelgrote' - - name: 'archiv' - path: '/shares_archiv' - users_ro: '' - users_rw: 'michaelgrote win10' - - name: 'hm' - path: '/shares_hm' - users_ro: '' - users_rw: 'michaelgrote win10' - - name: 'musik' - path: '/shares_music' - users_ro: 'navidrome kodi ' - users_rw: 'win10 michaelgrote' - - name: 'tmp' - path: '/shares_tmp' - users_ro: 'win10' - users_rw: 'kodi win10 michaelgrote' - - name: 'bilder' - path: '/shares_bilder' - users_ro: 'photoprism' - users_rw: ' michaelgrote win10' - - name: 'proxmox' - path: '/shares_pve_backup' - users_ro: 'michaelgrote' - users_rw: 'pve win10' - - name: 'restic' - path: '/shares_restic' - users_ro: '' - users_rw: ' restic win10 michaelgrote' - - name: 'buecher' - path: '/shares_buecher' - users_ro: '' - users_rw: 'michaelgrote win10' - - name: 'programme' - path: '/shares_programme' - users_ro: '' - users_rw: 'michaelgrote win10' - - name: 'vm' - path: '/shares_vm' - users_ro: '' - users_rw: 'michaelgrote' +### mgrote.smb_fileserver +smb_shares: + - name: 'videos' + path: '/shares_videos' + users_ro: 'kodi' + users_rw: 'michaelgrote win10' + - name: 'scans' + path: '/shares_scans' + users_ro: ' michaelgrote' + users_rw: 'brother_ads2700w' + - name: 'papa_backup' + path: '/shares_papa_backup' + users_ro: 'michaelgrote' + users_rw: 'win10' + - name: 'backup' + path: '/shares_backup' + users_ro: '' + users_rw: 'win10 michaelgrote' + - name: 'archiv' + path: '/shares_archiv' + users_ro: '' + users_rw: 'michaelgrote win10' + - name: 'hm' + path: '/shares_hm' + users_ro: '' + users_rw: 'michaelgrote win10' + - name: 'musik' + path: '/shares_music' + users_ro: 'navidrome kodi ' + users_rw: 'win10 michaelgrote' + - name: 'tmp' + path: '/shares_tmp' + users_ro: 'win10' + users_rw: 'kodi win10 michaelgrote' + - name: 'bilder' + path: '/shares_bilder' + users_ro: 'photoprism' + users_rw: ' michaelgrote win10' + - name: 'proxmox' + path: '/shares_pve_backup' + users_ro: 'michaelgrote' + users_rw: 'pve win10' + - name: 'restic' + path: '/shares_restic' + users_ro: '' + users_rw: ' restic win10 michaelgrote' + - name: 'buecher' + path: '/shares_buecher' + users_ro: '' + users_rw: 'michaelgrote win10' + - name: 'programme' + path: '/shares_programme' + users_ro: '' + users_rw: 'michaelgrote win10' + - name: 'vm' + path: '/shares_vm' + users_ro: '' + users_rw: 'michaelgrote' diff --git a/group_vars/gitea.yml b/group_vars/gitea.yml index f420a34d..b0726503 100644 --- a/group_vars/gitea.yml +++ b/group_vars/gitea.yml @@ -1,99 +1,101 @@ --- - ### mrlesmithjr.ansible-manage-lvm - lvm_groups: - - vgname: vg_gitea_data - disks: - - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 - create: true - lvnames: - - lvname: lv_gitea_data - size: +100%FREE - create: true - filesystem: xfs - mount: true - mntp: /var/lib/gitea - manage_lvm: true - pvresize_to_max: true - ### mgrote.restic - restic_folders_to_backup: "/ /var/lib/gitea" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - - rule: allow - to_port: "{{ gitea_http_port }}" - protocol: tcp - comment: 'gitea' - from_ip: 0.0.0.0/0 - - rule: allow - to_port: "{{ gitea_ssh_port }}" - protocol: tcp - comment: 'gitea' - from_ip: 0.0.0.0/0 +### mrlesmithjr.ansible-manage-lvm +lvm_groups: + - vgname: vg_gitea_data + disks: + - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 + create: true + lvnames: + - lvname: lv_gitea_data + size: +100%FREE + create: true + filesystem: xfs + mount: true + mntp: /var/lib/gitea +manage_lvm: true +pvresize_to_max: true - ### l3d.gitea - # config liegt in /etc/gitea/gitea.ini - gitea_version: "1.20.3" - gitea_app_name: "Gitea" - gitea_user: "gitea" - gitea_home: "/var/lib/gitea" - gitea_repository_root: "{{ gitea_home }}" - gitea_user_repo_limit: 300 - gitea_root_url: https://git.mgrote.net - gitea_offline_mode: true - gitea_lfs_server_enabled: false - gitea_secret_key: "{{ lookup('keepass', 'gitea_secret_key', 'password') }}" - gitea_internal_token: "{{ lookup('keepass', 'gitea_internal_token', 'password') }}" - gitea_disable_git_hooks: false - gitea_show_user_email: false - gitea_disable_gravatar: true - gitea_enable_captcha: true - gitea_only_allow_external_registration: false - gitea_enable_notify_mail: false - gitea_force_private: false - gitea_oauth2_enabled: true - gitea_repo_indexer_enabled: true +### mgrote.restic +restic_folders_to_backup: "/ /var/lib/gitea" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files - gitea_mailer_enabled: true - gitea_mailer_skip_verify: false - gitea_mailer_tls_enabled: true - gitea_mailer_host: smtp.strato.de:465 - gitea_mailer_from: info@mgrote.net - gitea_mailer_user: "info@mgrote.net" - gitea_mailer_password: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" - gitea_mailer_type: smtp +### oefenweb.ufw +ufw_rules: + - rule: allow + to_port: 22 + protocol: tcp + comment: 'ssh' + from_ip: 0.0.0.0/0 + - rule: allow + to_port: "{{ gitea_http_port }}" + protocol: tcp + comment: 'gitea' + from_ip: 0.0.0.0/0 + - rule: allow + to_port: "{{ gitea_ssh_port }}" + protocol: tcp + comment: 'gitea' + from_ip: 0.0.0.0/0 - gitea_default_branch: 'master' +### l3d.gitea +# config liegt in /etc/gitea/gitea.ini +gitea_version: "1.20.3" +gitea_app_name: "Gitea" +gitea_user: "gitea" +gitea_home: "/var/lib/gitea" +gitea_repository_root: "{{ gitea_home }}" +gitea_user_repo_limit: 300 +gitea_root_url: https://git.mgrote.net +gitea_offline_mode: true +gitea_lfs_server_enabled: false +gitea_secret_key: "{{ lookup('keepass', 'gitea_secret_key', 'password') }}" +gitea_internal_token: "{{ lookup('keepass', 'gitea_internal_token', 'password') }}" +gitea_disable_git_hooks: false +gitea_show_user_email: false +gitea_disable_gravatar: true +gitea_enable_captcha: true +gitea_only_allow_external_registration: false +gitea_enable_notify_mail: false +gitea_force_private: false +gitea_oauth2_enabled: true +gitea_repo_indexer_enabled: true - gitea_db_type: sqlite3 - gitea_db_path: "{{ gitea_home }}/data/gitea.db" # for sqlite3 +gitea_mailer_enabled: true +gitea_mailer_skip_verify: false +gitea_mailer_tls_enabled: true +gitea_mailer_host: smtp.strato.de:465 +gitea_mailer_from: info@mgrote.net +gitea_mailer_user: "info@mgrote.net" +gitea_mailer_password: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" +gitea_mailer_type: smtp - gitea_ssh_listen: 0.0.0.0 - gitea_ssh_domain: gitea.grote.lan - gitea_ssh_port: 2222 - gitea_start_ssh: true +gitea_default_branch: 'master' - gitea_http_domain: git.mgrote.net - gitea_http_listen: 0.0.0.0 - gitea_http_port: 3000 - gitea_disable_http_git: false - gitea_protocol: http +gitea_db_type: sqlite3 +gitea_db_path: "{{ gitea_home }}/data/gitea.db" # for sqlite3 - gitea_show_registration_button: false - gitea_require_signin: false - gitea_disable_registration: true +gitea_ssh_listen: 0.0.0.0 +gitea_ssh_domain: gitea.grote.lan +gitea_ssh_port: 2222 +gitea_start_ssh: true - gitea_fail2ban_enabled: true - gitea_fail2ban_jail_maxretry: 3 - gitea_fail2ban_jail_findtime: 300 - gitea_fail2ban_jail_bantime: 600 - # wird für drone benötigt, sonst wird der Webhook nicht "gesendet" - gitea_extra_config: | - [webhook] - ALLOWED_HOST_LIST = *.grote.lan +gitea_http_domain: git.mgrote.net +gitea_http_listen: 0.0.0.0 +gitea_http_port: 3000 +gitea_disable_http_git: false +gitea_protocol: http - gitea_backup_on_upgrade: false - gitea_backup_location: "{{ gitea_home }}/backups/" +gitea_show_registration_button: false +gitea_require_signin: false +gitea_disable_registration: true + +gitea_fail2ban_enabled: true +gitea_fail2ban_jail_maxretry: 3 +gitea_fail2ban_jail_findtime: 300 +gitea_fail2ban_jail_bantime: 600 +# wird für drone benötigt, sonst wird der Webhook nicht "gesendet" +gitea_extra_config: | + [webhook] + ALLOWED_HOST_LIST = *.grote.lan + +gitea_backup_on_upgrade: false +gitea_backup_location: "{{ gitea_home }}/backups/" diff --git a/group_vars/k3s.yml b/group_vars/k3s.yml index 882ee7d6..55160e56 100644 --- a/group_vars/k3s.yml +++ b/group_vars/k3s.yml @@ -1,81 +1,81 @@ --- - ### Allgemein - kubeconfig: /etc/rancher/k3s/k3s.yaml - - ### mgrote.restic - restic_folders_to_backup: "/ /var" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files +### Allgemein +kubeconfig: /etc/rancher/k3s/k3s.yaml - ### pandemonium1986.ansible-role-k9s - k9s_version: "v0.27.3" +### mgrote.restic +restic_folders_to_backup: "/ /var" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben; https://restic.readthedocs.io/en/latest/040_backup.html#excluding-files - ### mrlesmithjr.ansible-manage-lvm - #lvm_groups: - # - vgname: vg_gitea_data - # disks: - # - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 - # create: true - # lvnames: - # - lvname: lv_gitea_data - # size: +100%FREE - # create: true - # filesystem: xfs - # mount: true - # mntp: /var/lib/gitea - #manage_lvm: true - #pvresize_to_max: true +### pandemonium1986.ansible-role-k9s +k9s_version: "v0.27.3" - ### oefenweb.ufw - ufw_rules: - - rule: allow - comment: 'k3s - alles offen' - from_ip: 0.0.0.0/0 +### mrlesmithjr.ansible-manage-lvm +#lvm_groups: +# - vgname: vg_gitea_data +# disks: +# - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 +# create: true +# lvnames: +# - lvname: lv_gitea_data +# size: +100%FREE +# create: true +# filesystem: xfs +# mount: true +# mntp: /var/lib/gitea +#manage_lvm: true +#pvresize_to_max: true - ### pyratlabs.k3s - k3s_state: installed - k3s_release_version: v1.25.11+k3s1 - k3s_airgap: false - k3s_config_file: /etc/rancher/k3s/config.yaml - k3s_build_cluster: true - k3s_install_dir: /usr/local/bin - k3s_etcd_datastore: true - k3s_become: true - k3s_use_experimental: true - k3s_debug: false - k3s_server: - # siehe https://docs.k3s.io/reference/server-config - # cli parameter OHNE -- am anfang - write-kubeconfig-mode: '644' - cluster-cidr: "10.42.0.0/16" - service-cidr: "10.43.0.0/16" - disable: - - traefik - - local-storage # disables local-path-provisioner - - disable-helm-controller # https://fluxcd.io/flux/cheatsheets/troubleshooting/ +### oefenweb.ufw +ufw_rules: + - rule: allow + comment: 'k3s - alles offen' + from_ip: 0.0.0.0/0 - ### mgrote.fluxcd - flux_repo_host: gitea.grote.lan - flux_repo_host_port: 2222 - flux_repo_branch: master - flux_repo_url_complete: "ssh://gitea@{{ flux_repo_host }}:{{ flux_repo_host_port }}/mg/manifests.git" - flux_install_host: k3s4.grote.lan - flux_homedir: /home/flux - flux_path_ssh_dir: /home/flux/.ssh - flux_user_group: flux - flux_user: flux - flux_download_url: https://github.com/fluxcd/flux2/releases/download/v2.0.1/flux_2.0.1_linux_amd64.tar.gz # updaten - flux_path_bin: /usr/local/sbin - flux_path_ssh_id_file: id_rsa - flux_ssh_key_format: ed25519 - flux_sync_interval: 1m +### pyratlabs.k3s +k3s_state: installed +k3s_release_version: v1.25.11+k3s1 +k3s_airgap: false +k3s_config_file: /etc/rancher/k3s/config.yaml +k3s_build_cluster: true +k3s_install_dir: /usr/local/bin +k3s_etcd_datastore: true +k3s_become: true +k3s_use_experimental: true +k3s_debug: false +k3s_server: + # siehe https://docs.k3s.io/reference/server-config + # cli parameter OHNE -- am anfang + write-kubeconfig-mode: '644' + cluster-cidr: "10.42.0.0/16" + service-cidr: "10.43.0.0/16" + disable: + - traefik + - local-storage # disables local-path-provisioner + - disable-helm-controller # https://fluxcd.io/flux/cheatsheets/troubleshooting/ - ### mgrote.apt_manage_packages - apt_packages_extra: - - nfs-common # für nfs-subdir-external-provisioner +### mgrote.fluxcd +flux_repo_host: gitea.grote.lan +flux_repo_host_port: 2222 +flux_repo_branch: master +flux_repo_url_complete: "ssh://gitea@{{ flux_repo_host }}:{{ flux_repo_host_port }}/mg/manifests.git" +flux_install_host: k3s4.grote.lan +flux_homedir: /home/flux +flux_path_ssh_dir: /home/flux/.ssh +flux_user_group: flux +flux_user: flux +flux_download_url: https://github.com/fluxcd/flux2/releases/download/v2.0.1/flux_2.0.1_linux_amd64.tar.gz # updaten +flux_path_bin: /usr/local/sbin +flux_path_ssh_id_file: id_rsa +flux_ssh_key_format: ed25519 +flux_sync_interval: 1m - ### mgrote.sealed-secrets - sealed_secrets_homedir: /home/sealed_secrets - sealed_secrets_user_group: sealed_secrets - sealed_secrets_user: sealed_secrets - kubeseal_download_url: "https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.1/kubeseal-0.19.1-linux-amd64.tar.gz" #updaten - kubeseal_path_bin: /usr/local/sbin - sealed_secrets_keepass_entry_name: "{{ lookup('keepass', 'k3s-sealed-secrets-private-key', 'notes') }}" +### mgrote.apt_manage_packages +apt_packages_extra: + - nfs-common # für nfs-subdir-external-provisioner + +### mgrote.sealed-secrets +sealed_secrets_homedir: /home/sealed_secrets +sealed_secrets_user_group: sealed_secrets +sealed_secrets_user: sealed_secrets +kubeseal_download_url: "https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.1/kubeseal-0.19.1-linux-amd64.tar.gz" #updaten +kubeseal_path_bin: /usr/local/sbin +sealed_secrets_keepass_entry_name: "{{ lookup('keepass', 'k3s-sealed-secrets-private-key', 'notes') }}" diff --git a/group_vars/laptop.yml b/group_vars/laptop.yml deleted file mode 100644 index 3d481f13..00000000 --- a/group_vars/laptop.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- - ### mgrote.tmux - tmux_auto_attach: absent - ### mgrote.dotfiles - dotfiles_repo_url: https://git.mgrote.net/mg/dotfiles - dotfiles_repo_path: /home/mg/dotfiles - dotfiles_files: - - repo_path: "{{ dotfiles_repo_path}}/.vimrc" - local_path: "/home/mg/.vimrc" - - repo_path: "{{ dotfiles_repo_path}}/.tmux.conf" - local_path: "/home/mg/.tmux.conf" - - repo_path: "{{ dotfiles_repo_path}}/.gitconfig" - local_path: "/home/mg/.gitconfig" - - repo_path: "{{ dotfiles_repo_path}}/i3/config" - local_path: "/home/mg/.config/i3/config" - - repo_path: "{{ dotfiles_repo_path}}/alacritty/alacritty.yml" - local_path: "/home/mg/.config/alacritty/alacritty.yml" - - repo_path: "{{ dotfiles_repo_path}}/flameshot/flameshot.ini" - local_path: "/home/mg/.config/flameshot/flameshot.ini" - - repo_path: "{{ dotfiles_repo_path}}/.ssh/config" - local_path: "/home/mg/.ssh/config" - - repo_path: "{{ dotfiles_repo_path}}/dunstrc" - local_path: "/home/mg/.config/dunst/dunstrc" - dotfiles_dirs: - - path: /home/mg/.config/i3 - - path: /home/mg/.config/polybar - - path: /home/mg/.config/alacritty - - path: /home/mg/.config/.ssh - - path: /home/mg/.config/flameshot - dotfiles_owner: mg - ### mgrote.apt_manage_packages - apt_packages_extra: - - bmon - - s-tui - - smartmontools - - lm-sensors - - ethtool - - nextcloud-desktop - - gnome-tweaks - - powertop - - caja # filemanager - - arandr - - keepassxc - - vlc - - libreoffice - - gnome-calculator - - supertux - - python3-pip - - gramps # stammbaum - - shellcheck - - vivaldi-stable - - cowsay - - lolcat - - fortune-mod - ### mgrote.apt_manage_sources - # Extra-Repositories, sollte pro Host gesetzt werden - extra_repos: - - "deb [arch=amd64] https://repo.vivaldi.com/stable/deb/ stable main" - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - ### mgrote.user - users: - - username: mg - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo, docker - state: present - public_ssh_key: "{{ ssh_public_key_mg }}" - allow_sudo: true - allow_passwordless_sudo: true - - username: ansible-user - password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyqs0OE5RVqs6tIzyuGQWvq/OVDa/tfdSEqMIwcthFt+pwCCjpqtNc8L8FSXgphSwuNosFakqhMLDFD3pmII+t61NRExsoR3nGTDuCAQnTvTKXTEfhnunN3pwgXWVTI68j9pRzmSy+hMkSFbgN9EGMSXxGcNunY7ewS3ZkVe08SWFpiX9giYq6uiOiMHsZKdcP6s2QRXUhZlTx2cOc/9gJ5lD82EUXQRZzT6ww2xVrceIW9c3CZFmSmYWxvrR7dPcHrke90FPPd5WhU+Anz++6GsT6+OhZTk+uQnBHllFXn9NoFQIEUDO4zV+gFXITaAbTkLAcCwuKB2QcDZ6C2mhf ansible-generated on ansible-v2 - allow_sudo: true - allow_passwordless_sudo: true diff --git a/group_vars/pbs.yml b/group_vars/pbs.yml index f1abbd22..6c02e8db 100644 --- a/group_vars/pbs.yml +++ b/group_vars/pbs.yml @@ -1,32 +1,32 @@ --- - ### mgrote.postfix - postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24 192.168.3.0/24" +### mgrote.postfix +postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24 192.168.3.0/24" - ### mgrote.restic - restic_folders_to_backup: "/ /etc/proxmox-backup" +### mgrote.restic +restic_folders_to_backup: "/ /etc/proxmox-backup" - ### mgrote.user - users: - - username: root - password: "{{ lookup('keepass', 'root_linux_password_hash_proxmox', 'password') }}" - update_password: always - groups: ssh, sudo, root - state: present - allow_sudo: true - allow_passwordless_sudo: true - - username: mg - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: "{{ ssh_public_key_mg }}" - allow_sudo: true - allow_passwordless_sudo: true - - username: ansible-user - password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu - allow_sudo: true - allow_passwordless_sudo: true +### mgrote.user +users: + - username: root + password: "{{ lookup('keepass', 'root_linux_password_hash_proxmox', 'password') }}" + update_password: always + groups: ssh, sudo, root + state: present + allow_sudo: true + allow_passwordless_sudo: true + - username: mg + password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: "{{ ssh_public_key_mg }}" + allow_sudo: true + allow_passwordless_sudo: true + - username: ansible-user + password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu + allow_sudo: true + allow_passwordless_sudo: true diff --git a/group_vars/pve.yml b/group_vars/pve.yml index 198657d8..380c9560 100644 --- a/group_vars/pve.yml +++ b/group_vars/pve.yml @@ -1,40 +1,41 @@ --- - ### mgrote.restic - restic_folders_to_backup: "/ /etc/pve" - ### mgrote.user - users: - - username: root - password: "{{ lookup('keepass', 'root_linux_password_hash_proxmox', 'password') }}" - update_password: always - groups: ssh, sudo, root - state: present - allow_sudo: true - allow_passwordless_sudo: true - - username: mg - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: "{{ ssh_public_key_mg }}" - allow_sudo: true - allow_passwordless_sudo: true - - username: ansible-user - password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" - update_password: always - groups: ssh, sudo - state: present - public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu - allow_sudo: true - allow_passwordless_sudo: true +### mgrote.restic +restic_folders_to_backup: "/ /etc/pve" - ### mgrote.apt_manage_packages - apt_packages_extra: - - ifupdown2 - - bmon - - qemu-guest-agent - - open-vm-tools - - systemd-boot +### mgrote.user +users: + - username: root + password: "{{ lookup('keepass', 'root_linux_password_hash_proxmox', 'password') }}" + update_password: always + groups: ssh, sudo, root + state: present + allow_sudo: true + allow_passwordless_sudo: true + - username: mg + password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: "{{ ssh_public_key_mg }}" + allow_sudo: true + allow_passwordless_sudo: true + - username: ansible-user + password: "{{ lookup('keepass', 'ansible_user_linux_password_hash', 'password') }}" + update_password: always + groups: ssh, sudo + state: present + public_ssh_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJcBwOjanQV6sFWaTetqpl20SVe3aRzGjKbsp7hKkDCE mg@irantu + allow_sudo: true + allow_passwordless_sudo: true - # Ansible Variablen - ### sudo - sudo: false +### mgrote.apt_manage_packages +apt_packages_extra: + - ifupdown2 + - bmon + - qemu-guest-agent + - open-vm-tools + - systemd-boot + +# Ansible Variablen +### sudo +sudo: false diff --git a/host_vars/docker10.grote.lan.yml b/host_vars/docker10.grote.lan.yml index ce4826cf..0beef40a 100644 --- a/host_vars/docker10.grote.lan.yml +++ b/host_vars/docker10.grote.lan.yml @@ -1,71 +1,73 @@ --- - ### mrlesmithjr.ansible-manage-lvm - lvm_groups: - - vgname: vg_docker - disks: - - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 - create: true - lvnames: - - lvname: docker - size: +100%FREE - create: true - filesystem: xfs - mount: true - mntp: /var/lib/docker - manage_lvm: true - pvresize_to_max: true - ### mgrote.restic - restic_folders_to_backup: "/ /var/lib/docker /mnt/oci-registry" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben +### mrlesmithjr.ansible-manage-lvm +lvm_groups: + - vgname: vg_docker + disks: + - /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 + create: true + lvnames: + - lvname: docker + size: +100%FREE + create: true + filesystem: xfs + mount: true + mntp: /var/lib/docker +manage_lvm: true +pvresize_to_max: true - ### mgrote.docker-compose-inline - compose_owner: "docker-user" - compose_group: "docker-user" - compose_file_permissions: "644" - compose_dir_permissions: "755" - compose_dest_basedir: "/docker" - compose_src_basedir: "{{ inventory_dir }}/docker-compose" - compose_files: - - name: homer - state: present - - name: drone - state: present - - name: nextcloud - state: present - network: traefik - - name: httpd - state: present - - name: unifi-controller - state: present - - name: miniflux - state: present - network: traefik - - name: traefik - state: present - network: traefik - - name: navidrome - state: present - network: traefik - - name: watchtower - state: present - - name: routeros-config-export - state: present - - name: registry - state: present - network: traefik - - name: whoami - state: absent - network: traefik - ### oefenweb.ufw - ufw_rules: - - rule: allow - to_port: 22 - protocol: tcp - comment: 'ssh' - from_ip: 0.0.0.0/0 - # docker network inspect $(docker network ls -q)|grep -E "IPv(4|6)A" | grep -v \"\" | sort -h - - rule: allow - from_ip: 192.168.0.0/16 - comment: 'docker networks' - - rule: allow - from_ip: 172.0.0.0/8 - comment: 'docker networks' +### mgrote.restic +restic_folders_to_backup: "/ /var/lib/docker /mnt/oci-registry" # --one-file-system ist gesetzt, also werden weitere Dateisysteme nicht eingeschlossen, es sei denn sie werden hier explizit angegeben + +### mgrote.docker-compose-inline +compose_owner: "docker-user" +compose_group: "docker-user" +compose_file_permissions: "644" +compose_dir_permissions: "755" +compose_dest_basedir: "/docker" +compose_src_basedir: "{{ inventory_dir }}/docker-compose" +compose_files: + - name: homer + state: present + - name: drone + state: present + - name: nextcloud + state: present + network: traefik + - name: httpd + state: present + - name: unifi-controller + state: present + - name: miniflux + state: present + network: traefik + - name: traefik + state: present + network: traefik + - name: navidrome + state: present + network: traefik + - name: watchtower + state: present + - name: routeros-config-export + state: present + - name: registry + state: present + network: traefik + - name: whoami + state: absent + network: traefik + +### oefenweb.ufw +ufw_rules: + - rule: allow + to_port: 22 + protocol: tcp + comment: 'ssh' + from_ip: 0.0.0.0/0 + # docker network inspect $(docker network ls -q)|grep -E "IPv(4|6)A" | grep -v \"\" | sort -h + - rule: allow + from_ip: 192.168.0.0/16 + comment: 'docker networks' + - rule: allow + from_ip: 172.0.0.0/8 + comment: 'docker networks' diff --git a/host_vars/k3s4.grote.lan.yml b/host_vars/k3s4.grote.lan.yml index b056ad12..752c9f70 100644 --- a/host_vars/k3s4.grote.lan.yml +++ b/host_vars/k3s4.grote.lan.yml @@ -1,3 +1,3 @@ --- - ### pyratlabs.k3s - k3s_control_node: true +### pyratlabs.k3s +k3s_control_node: true diff --git a/host_vars/pbs-test.grote.lan.yml b/host_vars/pbs-test.grote.lan.yml index fd03b8e0..6af3efe5 100644 --- a/host_vars/pbs-test.grote.lan.yml +++ b/host_vars/pbs-test.grote.lan.yml @@ -1,167 +1,168 @@ --- - # pbs_* - pbs_datastores: - - name: zfs_backup - path: /backup/pbs_data - gc_schedule: "sat 19:00" +# pbs_* +pbs_datastores: + - name: zfs_backup + path: /backup/pbs_data + gc_schedule: "sat 19:00" - pbs_prune_jobs: - - name: standard - schedule: "sat 18:15" - store: zfs_backup - keep_last: 3 - keep_hourly: 24 - keep_daily: 7 - keep_weekly: 2 +pbs_prune_jobs: + - name: standard + schedule: "sat 18:15" + store: zfs_backup + keep_last: 3 + keep_hourly: 24 + keep_daily: 7 + keep_weekly: 2 - pbs_permissions: - - user: user_pve5-test@pbs - datastore: zfs_backup - role: DatastoreBackup +pbs_permissions: + - user: user_pve5-test@pbs + datastore: zfs_backup + role: DatastoreBackup - pbs_users: - - name: user_pve5 - password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" - realm: pbs - - name: user_pve5-test - password: "{{ lookup('keepass', 'pbs_pve_user-test', 'password') }}" - realm: pbs - # rpool ist unverschlüsselt als Boot-Medium - # entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l +pbs_users: + - name: user_pve5 + password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" + realm: pbs + - name: user_pve5-test + password: "{{ lookup('keepass', 'pbs_pve_user-test', 'password') }}" + realm: pbs +# rpool ist unverschlüsselt als Boot-Medium +# entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l - ## backup - ### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase backup /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 +## backup +### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase backup /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 - # mgrote.zfs_manage_datasets - ### mgrote.zfs_extra - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_datasets: # DatenPools werden hier nicht verwaltet - # rpool - System-Datasets - - dataset: rpool - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - refreservation: 1G - - dataset: rpool/ROOT - state: present - refreservation: 1G - - dataset: rpool/ROOT/pbs-1 - state: present - refreservation: 1G - # backup-pool - - dataset: backup/pbs_data - state: present - quota: 10GB - - dataset: backup/pve5 - state: present - canmount: off - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_extra_arc_max_size: "1073741824" # 1GB in Bytes - zfs_extra_zfs_pools: - - name: "rpool" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals - - name: "backup" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" +# mgrote.zfs_manage_datasets +### mgrote.zfs_extra +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_datasets: # DatenPools werden hier nicht verwaltet + # rpool - System-Datasets + - dataset: rpool + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + refreservation: 1G + - dataset: rpool/ROOT + state: present + refreservation: 1G + - dataset: rpool/ROOT/pbs-1 + state: present + refreservation: 1G + # backup-pool + - dataset: backup/pbs_data + state: present + quota: 10GB + - dataset: backup/pve5 + state: present + canmount: off # noqa yaml[truthy] +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_extra_arc_max_size: "1073741824" # 1GB in Bytes +zfs_extra_zfs_pools: + - name: "rpool" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals + - name: "backup" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" - ### mgrote.zfs_sanoid - sanoid_snaps_enable: true - ## syncoid - sanoid_syncoid_destination_host: false - sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" - sanoid_syncoid_timer: '*-*-* *:00:00' # jede Stunde - sanoid_syncoid_bwlimit: 30m # 30MB/s - sanoid_syncoid_datasets_sync: - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/pve_backup - source_dataset: hdd_data_raidz/pve_backup +### mgrote.zfs_sanoid +sanoid_snaps_enable: true - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/videos - source_dataset: hdd_data_raidz/videos +## syncoid +sanoid_syncoid_destination_host: false +sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" +sanoid_syncoid_timer: '*-*-* *:00:00' # jede Stunde +sanoid_syncoid_bwlimit: 30m # 30MB/s +sanoid_syncoid_datasets_sync: + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/pve_backup + source_dataset: hdd_data_raidz/pve_backup - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/music - source_dataset: hdd_data_raidz/music + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/videos + source_dataset: hdd_data_raidz/videos - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/tmp - source_dataset: hdd_data_raidz/tmp + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/music + source_dataset: hdd_data_raidz/music - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/archiv - source_dataset: hdd_data_raidz/archiv + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/tmp + source_dataset: hdd_data_raidz/tmp - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/bilder - source_dataset: hdd_data_raidz/bilder + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/archiv + source_dataset: hdd_data_raidz/archiv - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/hm - source_dataset: hdd_data_raidz/hm + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/bilder + source_dataset: hdd_data_raidz/bilder - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/scans - source_dataset: hdd_data_raidz/scans + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/hm + source_dataset: hdd_data_raidz/hm - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/restic - source_dataset: hdd_data_raidz/restic + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/scans + source_dataset: hdd_data_raidz/scans - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/backup - source_dataset: hdd_data_raidz/backup + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/restic + source_dataset: hdd_data_raidz/restic - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/buecher - source_dataset: hdd_data_raidz/buecher + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/backup + source_dataset: hdd_data_raidz/backup - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/programme - source_dataset: hdd_data_raidz/programme + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/buecher + source_dataset: hdd_data_raidz/buecher - - source_host: pve5.grote.lan - destination_mount_check: backup - destination_dataset: backup/pve5/vm - source_dataset: hdd_data_raidz/vm + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/programme + source_dataset: hdd_data_raidz/programme - # sanoid - sanoid_datasets: - ### rpool - - path: rpool - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT/pbs-1 - recursive: 'no' - snapshots: true - template: 'pve3tage' - ### backup - - path: backup - recursive: 'no' - snapshots: true - template: '14tage' - - path: backup/pbs_data - recursive: 'no' - snapshots: true - template: '14tage' + - source_host: pve5.grote.lan + destination_mount_check: backup + destination_dataset: backup/pve5/vm + source_dataset: hdd_data_raidz/vm + +# sanoid +sanoid_datasets: + ### rpool + - path: rpool + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT/pbs-1 + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + ### backup + - path: backup + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: backup/pbs_data + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' diff --git a/host_vars/pbs.grote.lan.yml b/host_vars/pbs.grote.lan.yml index 11a8f0de..cdd02de2 100644 --- a/host_vars/pbs.grote.lan.yml +++ b/host_vars/pbs.grote.lan.yml @@ -1,159 +1,159 @@ --- - # pbs_* - pbs_datastores: - - name: zfs_backup - path: /backup/pbs_data - gc_schedule: "sat 19:00" +# pbs_* +pbs_datastores: + - name: zfs_backup + path: /backup/pbs_data + gc_schedule: "sat 19:00" - pbs_prune_jobs: - - name: standard - schedule: "sat 18:15" - store: zfs_backup - keep_last: 1 - keep_hourly: 3 - keep_daily: 3 +pbs_prune_jobs: + - name: standard + schedule: "sat 18:15" + store: zfs_backup + keep_last: 1 + keep_hourly: 3 + keep_daily: 3 - pbs_permissions: - - user: user_pve5@pbs - datastore: zfs_backup - role: DatastoreBackup +pbs_permissions: + - user: user_pve5@pbs + datastore: zfs_backup + role: DatastoreBackup - pbs_users: - - name: user_pve5 - password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" - realm: pbs - # rpool ist unverschlüsselt als Boot-Medium - # entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l +pbs_users: + - name: user_pve5 + password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" + realm: pbs +# rpool ist unverschlüsselt als Boot-Medium +# entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l - ## backup - ### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase backup /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A28LFJDH +## backup +### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase backup /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A28LFJDH - # mgrote.zfs_manage_datasets - ### mgrote.zfs_extra - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_datasets: # DatenPools werden hier nicht verwaltet - # rpool - System-Datasets - - dataset: rpool - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - refreservation: 10G - - dataset: rpool/ROOT - state: present - refreservation: 10G - - dataset: rpool/ROOT/pbs-1 - state: present - refreservation: 10G - # backup-pool - - dataset: backup/pbs_data - state: present - quota: 1TB - - dataset: backup/pve5 - state: present - canmount: off - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_extra_arc_max_size: "4294967296" # 4GB in Bytes - zfs_extra_zfs_pools: - - name: "rpool" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals - - name: "backup" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" +# mgrote.zfs_manage_datasets +### mgrote.zfs_extra +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_datasets: # DatenPools werden hier nicht verwaltet + # rpool - System-Datasets + - dataset: rpool + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + refreservation: 10G + - dataset: rpool/ROOT + state: present + refreservation: 10G + - dataset: rpool/ROOT/pbs-1 + state: present + refreservation: 10G + # backup-pool + - dataset: backup/pbs_data + state: present + quota: 1TB + - dataset: backup/pve5 + state: present + canmount: off # noqa yaml[truthy] +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_extra_arc_max_size: "4294967296" # 4GB in Bytes +zfs_extra_zfs_pools: + - name: "rpool" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals + - name: "backup" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" - ### mgrote.zfs_sanoid - sanoid_snaps_enable: true - ## syncoid - sanoid_syncoid_destination_host: true - sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" - sanoid_syncoid_timer: '*-*-* *:00:00' # jede Stunde - sanoid_syncoid_bwlimit: 50M # 30MB/s - sanoid_syncoid_datasets_sync: - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/pve_backup - source_dataset: hdd_data_raidz/pve_backup +### mgrote.zfs_sanoid +sanoid_snaps_enable: true +## syncoid +sanoid_syncoid_destination_host: true +sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" +sanoid_syncoid_timer: '*-*-* *:00:00' # jede Stunde +sanoid_syncoid_bwlimit: 50M # 30MB/s +sanoid_syncoid_datasets_sync: + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/pve_backup + source_dataset: hdd_data_raidz/pve_backup - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/videos - source_dataset: hdd_data_raidz/videos + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/videos + source_dataset: hdd_data_raidz/videos - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/music - source_dataset: hdd_data_raidz/music + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/music + source_dataset: hdd_data_raidz/music - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/tmp - source_dataset: hdd_data_raidz/tmp + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/tmp + source_dataset: hdd_data_raidz/tmp - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/archiv - source_dataset: hdd_data_raidz/archiv + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/archiv + source_dataset: hdd_data_raidz/archiv - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/bilder - source_dataset: hdd_data_raidz/bilder + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/bilder + source_dataset: hdd_data_raidz/bilder - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/hm - source_dataset: hdd_data_raidz/hm + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/hm + source_dataset: hdd_data_raidz/hm - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/scans - source_dataset: hdd_data_raidz/scans + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/scans + source_dataset: hdd_data_raidz/scans - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/restic - source_dataset: hdd_data_raidz/restic + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/restic + source_dataset: hdd_data_raidz/restic - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/backup - source_dataset: hdd_data_raidz/backup + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/backup + source_dataset: hdd_data_raidz/backup - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/buecher - source_dataset: hdd_data_raidz/buecher + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/buecher + source_dataset: hdd_data_raidz/buecher - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/programme - source_dataset: hdd_data_raidz/programme + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/programme + source_dataset: hdd_data_raidz/programme - - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann - destination_mount_check: backup - destination_dataset: backup/pve5/vm - source_dataset: hdd_data_raidz/vm + - source_host: 192.168.2.16 # pve5, weil pbs den fqdn nicht auflösen kann + destination_mount_check: backup + destination_dataset: backup/pve5/vm + source_dataset: hdd_data_raidz/vm - # sanoid - sanoid_datasets: - ### rpool - - path: rpool - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT/pbs-1 - recursive: 'no' - snapshots: true - template: 'pve3tage' - ### backup - - path: backup/pbs_data - recursive: 'no' - snapshots: true - template: '3tage' +# sanoid +sanoid_datasets: + ### rpool + - path: rpool + recursive: 'no' + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT + recursive: 'no' + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT/pbs-1 + recursive: 'no' + snapshots: true + template: 'pve3tage' + ### backup + - path: backup/pbs_data + recursive: 'no' + snapshots: true + template: '3tage' diff --git a/host_vars/pve5-test.grote.lan.yml b/host_vars/pve5-test.grote.lan.yml index 44e5aa23..afa74ae4 100644 --- a/host_vars/pve5-test.grote.lan.yml +++ b/host_vars/pve5-test.grote.lan.yml @@ -1,232 +1,232 @@ --- - # rpool ist unverschlüsselt als Boot-Medium - # der Speicherort fur die VMs ist verschlüsselt - # zfs create -o encryption=aes-256-gcm -o keyformat=passphrase rpool/vm - # entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l - ## HDD_DATA_RAIDZ - ### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase hdd_data_raidz mirror /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 +# rpool ist unverschlüsselt als Boot-Medium +# der Speicherort fur die VMs ist verschlüsselt +# zfs create -o encryption=aes-256-gcm -o keyformat=passphrase rpool/vm +# entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l +## HDD_DATA_RAIDZ +### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase hdd_data_raidz mirror /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 - # mgrote.zfs_manage_datasets - ### mgrote.zfs_extra - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_datasets: # DatenPools werden hier nicht verwaltet - # rpool - System-Datasets - - dataset: rpool - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - refreservation: 1G - - dataset: rpool/ROOT - state: present - refreservation: 1G - - dataset: rpool/ROOT/pve-1 - state: present - refreservation: 1G +# mgrote.zfs_manage_datasets +### mgrote.zfs_extra +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_datasets: # DatenPools werden hier nicht verwaltet + # rpool - System-Datasets + - dataset: rpool + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + refreservation: 1G + - dataset: rpool/ROOT + state: present + refreservation: 1G + - dataset: rpool/ROOT/pve-1 + state: present + refreservation: 1G - # rpool - VMs - - dataset: rpool/vm - state: present - - dataset: rpool/vm/zvol - state: present - - dataset: rpool/vm/lxc - state: present - # hdd_data_raidz - - dataset: hdd_data_raidz - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - - dataset: hdd_data_raidz/papa_backup - state: present - - dataset: hdd_data_raidz/pve_backup - state: present - recordsize: 1M - - dataset: hdd_data_raidz/videos - state: present - recordsize: 1M - - dataset: hdd_data_raidz/music - state: present - recordsize: 1M - - dataset: hdd_data_raidz/tmp - state: present - - dataset: hdd_data_raidz/archiv - state: present - - dataset: hdd_data_raidz/bilder - state: present - recordsize: 1M - - dataset: hdd_data_raidz/hm - state: present - - dataset: hdd_data_raidz/scans - state: present - - dataset: hdd_data_raidz/restic - state: present - - dataset: hdd_data_raidz/backup - state: present - - dataset: hdd_data_raidz/buecher - state: present - - dataset: hdd_data_raidz/programme - state: present - - dataset: hdd_data_raidz/vm - state: present + # rpool - VMs + - dataset: rpool/vm + state: present + - dataset: rpool/vm/zvol + state: present + - dataset: rpool/vm/lxc + state: present + # hdd_data_raidz + - dataset: hdd_data_raidz + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + - dataset: hdd_data_raidz/papa_backup + state: present + - dataset: hdd_data_raidz/pve_backup + state: present + recordsize: 1M + - dataset: hdd_data_raidz/videos + state: present + recordsize: 1M + - dataset: hdd_data_raidz/music + state: present + recordsize: 1M + - dataset: hdd_data_raidz/tmp + state: present + - dataset: hdd_data_raidz/archiv + state: present + - dataset: hdd_data_raidz/bilder + state: present + recordsize: 1M + - dataset: hdd_data_raidz/hm + state: present + - dataset: hdd_data_raidz/scans + state: present + - dataset: hdd_data_raidz/restic + state: present + - dataset: hdd_data_raidz/backup + state: present + - dataset: hdd_data_raidz/buecher + state: present + - dataset: hdd_data_raidz/programme + state: present + - dataset: hdd_data_raidz/vm + state: present - zfs_extra_arc_max_size: "1073741824" # 1GB in Bytes - zfs_extra_zfs_pools: - - name: "rpool" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals - - name: "hdd_data_raidz" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" +zfs_extra_arc_max_size: "1073741824" # 1GB in Bytes +zfs_extra_zfs_pools: + - name: "rpool" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals + - name: "hdd_data_raidz" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" - ### mgrote.zfs_sanoid - sanoid_datasets: - - path: 'hdd_data_raidz/videos' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/music' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/papa_backup' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/tmp' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/pve_backup' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/archiv' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: hdd_data_raidz/bilder - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/hm - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/scans - recursive: 'no' - snapshots: true - template: '3tage' - - path: hdd_data_raidz/backup - recursive: 'no' - snapshots: true - template: '31tage' - - path: hdd_data_raidz/restic - recursive: 'no' - snapshots: true - template: '3tage' - - path: hdd_data_raidz/programme - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/buecher - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/vm - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT/pve-1 - recursive: 'no' - snapshots: true - template: '3tage' +### mgrote.zfs_sanoid +sanoid_datasets: + - path: 'hdd_data_raidz/videos' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/music' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/papa_backup' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/tmp' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/pve_backup' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/archiv' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: hdd_data_raidz/bilder + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/hm + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/scans + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' + - path: hdd_data_raidz/backup + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '31tage' + - path: hdd_data_raidz/restic + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' + - path: hdd_data_raidz/programme + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/buecher + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/vm + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT/pve-1 + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' - ### mgrote.cv4pve-autosnap - cv4pve_api_user: root@pam!cv4pve-autosnap - cv4pve_api_token: "{{ lookup('keepass', 'cv4pve_api_token', 'password') }}" - cv4pve_vmid: all - cv4pve_keep_snapshots: 5 - cv4pve_dl_link: "https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.10.0/cv4pve-autosnap-linux-x64.zip" +### mgrote.cv4pve-autosnap +cv4pve_api_user: root@pam!cv4pve-autosnap +cv4pve_api_token: "{{ lookup('keepass', 'cv4pve_api_token', 'password') }}" +cv4pve_vmid: all +cv4pve_keep_snapshots: 5 +cv4pve_dl_link: "https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.10.0/cv4pve-autosnap-linux-x64.zip" - ### mgrote.proxmox_bind_mounts - pve_bind_mounts: - - vmid: 100 - mp_nr: 0 - mp_path_host: /hdd_data_raidz/videos - mp_path_guest: /shares_videos - - vmid: 100 - mp_nr: 2 - mp_path_host: /hdd_data_raidz/pve_backup - mp_path_guest: /shares_pve_backup - - vmid: 100 - mp_nr: 3 - mp_path_host: /hdd_data_raidz/papa_backup - mp_path_guest: /shares_papa_backup - - vmid: 100 - mp_nr: 4 - mp_path_host: /hdd_data_raidz/music - mp_path_guest: /shares_music - - vmid: 100 - mp_nr: 5 - mp_path_host: /hdd_data_raidz/tmp - mp_path_guest: /shares_tmp - - vmid: 100 - mp_nr: 6 - mp_path_host: /hdd_data_raidz/archiv - mp_path_guest: /shares_archiv - - vmid: 100 - mp_nr: 7 - mp_path_host: /hdd_data_raidz/bilder - mp_path_guest: /shares_bilder - - vmid: 100 - mp_nr: 8 - mp_path_host: /hdd_data_raidz/hm - mp_path_guest: /shares_hm - - vmid: 100 - mp_nr: 9 - mp_path_host: /hdd_data_raidz/scans - mp_path_guest: /shares_scans - - vmid: 100 - mp_nr: 10 - mp_path_host: /hdd_data_raidz/restic - mp_path_guest: /shares_restic - - vmid: 100 - mp_nr: 12 - mp_path_host: /hdd_data_raidz/backup - mp_path_guest: /shares_backup - - vmid: 100 - mp_nr: 14 - mp_path_host: /hdd_data_raidz/buecher - mp_path_guest: /shares_buecher - - vmid: 100 - mp_nr: 15 - mp_path_host: /hdd_data_raidz/programme - mp_path_guest: /shares_programme - - vmid: 100 - mp_nr: 16 - mp_path_host: /hdd_data_raidz/vm - mp_path_guest: /shares_vm +### mgrote.proxmox_bind_mounts +pve_bind_mounts: + - vmid: 100 + mp_nr: 0 + mp_path_host: /hdd_data_raidz/videos + mp_path_guest: /shares_videos + - vmid: 100 + mp_nr: 2 + mp_path_host: /hdd_data_raidz/pve_backup + mp_path_guest: /shares_pve_backup + - vmid: 100 + mp_nr: 3 + mp_path_host: /hdd_data_raidz/papa_backup + mp_path_guest: /shares_papa_backup + - vmid: 100 + mp_nr: 4 + mp_path_host: /hdd_data_raidz/music + mp_path_guest: /shares_music + - vmid: 100 + mp_nr: 5 + mp_path_host: /hdd_data_raidz/tmp + mp_path_guest: /shares_tmp + - vmid: 100 + mp_nr: 6 + mp_path_host: /hdd_data_raidz/archiv + mp_path_guest: /shares_archiv + - vmid: 100 + mp_nr: 7 + mp_path_host: /hdd_data_raidz/bilder + mp_path_guest: /shares_bilder + - vmid: 100 + mp_nr: 8 + mp_path_host: /hdd_data_raidz/hm + mp_path_guest: /shares_hm + - vmid: 100 + mp_nr: 9 + mp_path_host: /hdd_data_raidz/scans + mp_path_guest: /shares_scans + - vmid: 100 + mp_nr: 10 + mp_path_host: /hdd_data_raidz/restic + mp_path_guest: /shares_restic + - vmid: 100 + mp_nr: 12 + mp_path_host: /hdd_data_raidz/backup + mp_path_guest: /shares_backup + - vmid: 100 + mp_nr: 14 + mp_path_host: /hdd_data_raidz/buecher + mp_path_guest: /shares_buecher + - vmid: 100 + mp_nr: 15 + mp_path_host: /hdd_data_raidz/programme + mp_path_guest: /shares_programme + - vmid: 100 + mp_nr: 16 + mp_path_host: /hdd_data_raidz/vm + mp_path_guest: /shares_vm - # mgrote.pbs_pve_integration - pve_pbs_datastore: - - name: pbs - server: 192.168.2.18 - datastore: zfs_backup - username: user_pve5-test@pbs - password: "{{ lookup('keepass', 'pbs_pve_user-test', 'password') }}" - fingerprint: "38:53:f6:1e:99:99:76:78:c4:00:dd:90:1a:89:47:56:97:4e:f3:62:01:d2:2c:76:ba:f8:55:be:f8:05:d1:7a" +# mgrote.pbs_pve_integration +pve_pbs_datastore: + - name: pbs + server: 192.168.2.18 + datastore: zfs_backup + username: user_pve5-test@pbs + password: "{{ lookup('keepass', 'pbs_pve_user-test', 'password') }}" + fingerprint: "38:53:f6:1e:99:99:76:78:c4:00:dd:90:1a:89:47:56:97:4e:f3:62:01:d2:2c:76:ba:f8:55:be:f8:05:d1:7a" diff --git a/host_vars/pve5.grote.lan.yml b/host_vars/pve5.grote.lan.yml index 0ae4b8f8..659b0fc3 100644 --- a/host_vars/pve5.grote.lan.yml +++ b/host_vars/pve5.grote.lan.yml @@ -1,243 +1,243 @@ ---- - # rpool ist unverschlüsselt als Boot-Medium - # der Speicherort fur die VMs ist verschlüsselt - # zfs create -o encryption=aes-256-gcm -o keyformat=passphrase rpool/vm - # entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l - ## HDD_DATA_RAIDZ - ### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase hdd_data_raidz mirror /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A27KFJDH /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A28LFJDH + # noqa yaml[truthy]--- +# rpool ist unverschlüsselt als Boot-Medium +# der Speicherort fur die VMs ist verschlüsselt +# zfs create -o encryption=aes-256-gcm -o keyformat=passphrase rpool/vm +# entschlüsseln nach Boot mit: sudo zpool import -d /dev/disk/by-id/ -a && sudo zfs mount -a -l +## HDD_DATA_RAIDZ +### sudo zpool create -o ashift=12 -o feature@encryption=enabled -O encryption=on -O keylocation=prompt -O keyformat=passphrase hdd_data_raidz mirror /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A27KFJDH /dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_Z1B0A28LFJDH - # mgrote.zfs_manage_datasets - ### mgrote.zfs_extra - # Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* - zfs_datasets: # DatenPools werden hier nicht verwaltet - # rpool - System-Datasets - - dataset: rpool - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - refreservation: 10G - - dataset: rpool/ROOT - state: present - refreservation: 10G - - dataset: rpool/ROOT/pve-1 - state: present - refreservation: 10G - # rpool - Data - - dataset: rpool/data - state: present - # rpool - VMs - - dataset: rpool/vm - state: present - - dataset: rpool/vm/zvol - state: present - - dataset: rpool/vm/lxc - state: present - - dataset: rpool/data - state: present - # hdd_data_raidz - - dataset: hdd_data_raidz - state: present - compression: zstd - sync: disabled - xattr: sa - dnodesize: auto - atime: on - snapdir: hidden - reservation: 1G - - dataset: hdd_data_raidz/papa_backup - state: present - - dataset: hdd_data_raidz/pve_backup - state: present - recordsize: 1M - - dataset: hdd_data_raidz/videos - state: present - recordsize: 1M - - dataset: hdd_data_raidz/music - state: present - recordsize: 1M - - dataset: hdd_data_raidz/tmp - state: present - - dataset: hdd_data_raidz/archiv - state: present - - dataset: hdd_data_raidz/bilder - state: present - recordsize: 1M - - dataset: hdd_data_raidz/hm - state: present - - dataset: hdd_data_raidz/scans - state: present - - dataset: hdd_data_raidz/restic - state: present - - dataset: hdd_data_raidz/backup - state: present - - dataset: hdd_data_raidz/buecher - state: present - - dataset: hdd_data_raidz/programme - state: present - - dataset: hdd_data_raidz/vm - state: present +# mgrote.zfs_manage_datasets +### mgrote.zfs_extra +# Variablen für mgrote.zfs_health/trim/scrub/zed/arc_mem/ sind zusammengefasst unter zfs_extra_* +zfs_datasets: # DatenPools werden hier nicht verwaltet + # rpool - System-Datasets + - dataset: rpool + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + refreservation: 10G + - dataset: rpool/ROOT + state: present + refreservation: 10G + - dataset: rpool/ROOT/pve-1 + state: present + refreservation: 10G + # rpool - Data + - dataset: rpool/data + state: present + # rpool - VMs + - dataset: rpool/vm + state: present + - dataset: rpool/vm/zvol + state: present + - dataset: rpool/vm/lxc + state: present + - dataset: rpool/data + state: present + # hdd_data_raidz + - dataset: hdd_data_raidz + state: present + compression: zstd + sync: disabled + xattr: sa + dnodesize: auto + atime: on # noqa yaml[truthy] + snapdir: hidden + reservation: 1G + - dataset: hdd_data_raidz/papa_backup + state: present + - dataset: hdd_data_raidz/pve_backup + state: present + recordsize: 1M + - dataset: hdd_data_raidz/videos + state: present + recordsize: 1M + - dataset: hdd_data_raidz/music + state: present + recordsize: 1M + - dataset: hdd_data_raidz/tmp + state: present + - dataset: hdd_data_raidz/archiv + state: present + - dataset: hdd_data_raidz/bilder + state: present + recordsize: 1M + - dataset: hdd_data_raidz/hm + state: present + - dataset: hdd_data_raidz/scans + state: present + - dataset: hdd_data_raidz/restic + state: present + - dataset: hdd_data_raidz/backup + state: present + - dataset: hdd_data_raidz/buecher + state: present + - dataset: hdd_data_raidz/programme + state: present + - dataset: hdd_data_raidz/vm + state: present - zfs_extra_arc_max_size: "8589934592" # 8GB in Bytes - zfs_extra_zfs_pools: - - name: "rpool" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals - - name: "hdd_data_raidz" - systemd_timer_schedule: "*-01,04,07,10-01 23:00" +zfs_extra_arc_max_size: "8589934592" # 8GB in Bytes +zfs_extra_zfs_pools: + - name: "rpool" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" # jeden ersten eines jeden Quartals + - name: "hdd_data_raidz" + systemd_timer_schedule: "*-01,04,07,10-01 23:00" - ### mgrote.zfs_sanoid - sanoid_snaps_enable: true - ## enable sending snaps - sanoid_syncoid_source_host: true - sanoid_syncoid_ssh_pubkey: "{{ lookup('keepass', 'sanoid_syncoid_public_key', 'notes') }}" - sanoid_datasets: - ### hdd_data_raidz - - path: 'hdd_data_raidz/videos' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/music' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/papa_backup' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/tmp' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/pve_backup' - template: '3tage' - recursive: 'yes' - snapshots: true - - path: 'hdd_data_raidz/archiv' - template: '14tage' - recursive: 'yes' - snapshots: true - - path: hdd_data_raidz/bilder - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/hm - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/scans - recursive: 'no' - snapshots: true - template: '3tage' - - path: hdd_data_raidz/backup - recursive: 'no' - snapshots: true - template: '31tage' - - path: hdd_data_raidz/restic - recursive: 'no' - snapshots: true - template: '3tage' - - path: hdd_data_raidz/programme - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/buecher - recursive: 'no' - snapshots: true - template: '14tage' - - path: hdd_data_raidz/vm - recursive: 'no' - snapshots: true - template: '3tage' - ### rpool - - path: rpool - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT - recursive: 'no' - snapshots: true - template: 'pve3tage' - - path: rpool/ROOT/pve-1 - recursive: 'no' - snapshots: true - template: 'pve3tage' +### mgrote.zfs_sanoid +sanoid_snaps_enable: true +## enable sending snaps +sanoid_syncoid_source_host: true +sanoid_syncoid_ssh_pubkey: "{{ lookup('keepass', 'sanoid_syncoid_public_key', 'notes') }}" +sanoid_datasets: + ### hdd_data_raidz + - path: 'hdd_data_raidz/videos' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/music' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/papa_backup' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/tmp' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/pve_backup' + template: '3tage' + recursive: 'yes' + snapshots: true + - path: 'hdd_data_raidz/archiv' + template: '14tage' + recursive: 'yes' + snapshots: true + - path: hdd_data_raidz/bilder + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/hm + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/scans + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' + - path: hdd_data_raidz/backup + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '31tage' + - path: hdd_data_raidz/restic + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' + - path: hdd_data_raidz/programme + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/buecher + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '14tage' + - path: hdd_data_raidz/vm + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: '3tage' + ### rpool + - path: rpool + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' + - path: rpool/ROOT/pve-1 + recursive: 'no' # noqa yaml[truthy] + snapshots: true + template: 'pve3tage' - ### mgrote.cv4pve-autosnap - cv4pve_api_user: root@pam!cv4pve-autosnap - cv4pve_api_token: "{{ lookup('keepass', 'cv4pve_api_token', 'password') }}" - cv4pve_vmid: all,-106,-112,-115 - cv4pve_keep_snapshots: 5 - cv4pve_dl_link: "https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.14.7/cv4pve-autosnap-linux-x64.zip" +### mgrote.cv4pve-autosnap +cv4pve_api_user: root@pam!cv4pve-autosnap +cv4pve_api_token: "{{ lookup('keepass', 'cv4pve_api_token', 'password') }}" +cv4pve_vmid: all,-106,-112,-115 +cv4pve_keep_snapshots: 5 +cv4pve_dl_link: "https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.14.7/cv4pve-autosnap-linux-x64.zip" - ### mgrote.proxmox_bind_mounts - pve_bind_mounts: - ### fileserver3 - - vmid: 115 - mp_nr: 0 - mp_path_host: /hdd_data_raidz/videos - mp_path_guest: /shares_videos - - vmid: 115 - mp_nr: 2 - mp_path_host: /hdd_data_raidz/pve_backup - mp_path_guest: /shares_pve_backup - - vmid: 115 - mp_nr: 3 - mp_path_host: /hdd_data_raidz/papa_backup - mp_path_guest: /shares_papa_backup - - vmid: 115 - mp_nr: 4 - mp_path_host: /hdd_data_raidz/music - mp_path_guest: /shares_music - - vmid: 115 - mp_nr: 5 - mp_path_host: /hdd_data_raidz/tmp - mp_path_guest: /shares_tmp - - vmid: 115 - mp_nr: 6 - mp_path_host: /hdd_data_raidz/archiv - mp_path_guest: /shares_archiv - - vmid: 115 - mp_nr: 7 - mp_path_host: /hdd_data_raidz/bilder - mp_path_guest: /shares_bilder - - vmid: 115 - mp_nr: 8 - mp_path_host: /hdd_data_raidz/hm - mp_path_guest: /shares_hm - - vmid: 115 - mp_nr: 9 - mp_path_host: /hdd_data_raidz/scans - mp_path_guest: /shares_scans - - vmid: 115 - mp_nr: 10 - mp_path_host: /hdd_data_raidz/restic - mp_path_guest: /shares_restic - - vmid: 115 - mp_nr: 12 - mp_path_host: /hdd_data_raidz/backup - mp_path_guest: /shares_backup - - vmid: 115 - mp_nr: 14 - mp_path_host: /hdd_data_raidz/buecher - mp_path_guest: /shares_buecher - - vmid: 115 - mp_nr: 15 - mp_path_host: /hdd_data_raidz/programme - mp_path_guest: /shares_programme - - vmid: 115 - mp_nr: 16 - mp_path_host: /hdd_data_raidz/vm - mp_path_guest: /shares_vm +### mgrote.proxmox_bind_mounts +pve_bind_mounts: + ### fileserver3 + - vmid: 115 + mp_nr: 0 + mp_path_host: /hdd_data_raidz/videos + mp_path_guest: /shares_videos + - vmid: 115 + mp_nr: 2 + mp_path_host: /hdd_data_raidz/pve_backup + mp_path_guest: /shares_pve_backup + - vmid: 115 + mp_nr: 3 + mp_path_host: /hdd_data_raidz/papa_backup + mp_path_guest: /shares_papa_backup + - vmid: 115 + mp_nr: 4 + mp_path_host: /hdd_data_raidz/music + mp_path_guest: /shares_music + - vmid: 115 + mp_nr: 5 + mp_path_host: /hdd_data_raidz/tmp + mp_path_guest: /shares_tmp + - vmid: 115 + mp_nr: 6 + mp_path_host: /hdd_data_raidz/archiv + mp_path_guest: /shares_archiv + - vmid: 115 + mp_nr: 7 + mp_path_host: /hdd_data_raidz/bilder + mp_path_guest: /shares_bilder + - vmid: 115 + mp_nr: 8 + mp_path_host: /hdd_data_raidz/hm + mp_path_guest: /shares_hm + - vmid: 115 + mp_nr: 9 + mp_path_host: /hdd_data_raidz/scans + mp_path_guest: /shares_scans + - vmid: 115 + mp_nr: 10 + mp_path_host: /hdd_data_raidz/restic + mp_path_guest: /shares_restic + - vmid: 115 + mp_nr: 12 + mp_path_host: /hdd_data_raidz/backup + mp_path_guest: /shares_backup + - vmid: 115 + mp_nr: 14 + mp_path_host: /hdd_data_raidz/buecher + mp_path_guest: /shares_buecher + - vmid: 115 + mp_nr: 15 + mp_path_host: /hdd_data_raidz/programme + mp_path_guest: /shares_programme + - vmid: 115 + mp_nr: 16 + mp_path_host: /hdd_data_raidz/vm + mp_path_guest: /shares_vm - # mgrote.pbs_pve_integration - pve_pbs_datastore: - - name: pbs - server: pbs.grote.lan - datastore: zfs_backup - username: user_pve5@pbs - password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" - fingerprint: "7F:AC:54:75:1C:33:55:84:1E:1E:3A:15:5A:5E:AF:79:33:C9:D4:E1:C0:A0:1C:0D:9E:6A:EA:82:F9:27:57:79" +# mgrote.pbs_pve_integration +pve_pbs_datastore: + - name: pbs + server: pbs.grote.lan + datastore: zfs_backup + username: user_pve5@pbs + password: "{{ lookup('keepass', 'pbs_pve_user', 'password') }}" + fingerprint: "7F:AC:54:75:1C:33:55:84:1E:1E:3A:15:5A:5E:AF:79:33:C9:D4:E1:C0:A0:1C:0D:9E:6A:EA:82:F9:27:57:79" diff --git a/inventory_laptop b/inventory_laptop deleted file mode 100644 index f255a303..00000000 --- a/inventory_laptop +++ /dev/null @@ -1,5 +0,0 @@ -all: - children: - laptop: - hosts: - t410.grote.lan: diff --git a/playbooks/1_bootstrap.yml b/playbooks/1_bootstrap.yml index 17cf566a..c83f658d 100644 --- a/playbooks/1_bootstrap.yml +++ b/playbooks/1_bootstrap.yml @@ -1,34 +1,29 @@ --- - - hosts: all - gather_facts: false - max_fail_percentage: 20% - roles: - - { role: robertdebock.bootstrap, tags: "bootstrap", become: yes} - - { role: mgrote.users, tags: "user", become: yes} - - { role: mgrote.r8152_kernel_module } - - { role: mgrote.apt_manage_sources, tags: "apt_sources" } - - { role: mgrote.qemu_guest_agent } - - { role: mgrote.apt_update_packages, tags: "updates"} - post_tasks: - - name: Change user password - become: true - user: - name: mg - update_password: always - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" - - - vars: - ### reobertdebock.bootstrap - bootstrap_user: mg - bootstrap_wait_for_host: no - bootstrap_timeout: 1 - ### ansible - ansible_user: "mg" - ansible_password: hallowelt - ansible_become_password: hallowelt - ansible_ssh_common_args: "'-o StrictHostKeyChecking=no'" - +- hosts: all + gather_facts: false + roles: + - { role: robertdebock.bootstrap, tags: "bootstrap", become: true} + - { role: mgrote_users, tags: "user", become: true} + - { role: mgrote_apt_manage_sources, tags: "apt_sources" } + - { role: mgrote_qemu_guest_agent } + - { role: mgrote_apt_update_packages, tags: "updates"} + post_tasks: + - name: Change user password + become: true + ansible.builtin.user: + name: mg + update_password: always + password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" + vars: + ### reobertdebock.bootstrap + bootstrap_user: mg + bootstrap_wait_for_host: false + bootstrap_timeout: 1 + ### ansible + ansible_user: "mg" + ansible_password: hallowelt + ansible_become_password: hallowelt + ansible_ssh_common_args: "'-o StrictHostKeyChecking=no'" # Nach dem ersten durchlaufen ist keine Anmeldung mehr per Passwort & ssh möglich. Damit scheitert auch der Versuch das Playbook ein zweites mal durchlaufen zu lassen. diff --git a/playbooks/2_all.yml b/playbooks/2_all.yml index 08e5e646..020bb6db 100644 --- a/playbooks/2_all.yml +++ b/playbooks/2_all.yml @@ -1,18 +1,17 @@ --- - - import_playbook: base/apt_sources.yml - - import_playbook: base/packages.yml - - import_playbook: base/ntp_client.yml - - import_playbook: base/restic.yml - - import_playbook: base/users.yml - - import_playbook: base/motd.yml - - import_playbook: base/dotfiles.yml - - import_playbook: base/vim.yml - - import_playbook: base/postfix.yml - - import_playbook: base/ufw.yml - - import_playbook: base/ssh.yml - - import_playbook: base/f2b.yml - - import_playbook: base/remove_snapd.yml - - import_playbook: base/unattended_upgrades.yml - - import_playbook: base/update_packages.yml - - import_playbook: base/lvm.yml - - import_playbook: base/fwupd.yml +- ansible.builtin.import_playbook: base/apt_sources.yml +- ansible.builtin.import_playbook: base/packages.yml +- ansible.builtin.import_playbook: base/ntp_client.yml +- ansible.builtin.import_playbook: base/restic.yml +- ansible.builtin.import_playbook: base/users.yml +- ansible.builtin.import_playbook: base/dotfiles.yml +- ansible.builtin.import_playbook: base/vim.yml +- ansible.builtin.import_playbook: base/postfix.yml +- ansible.builtin.import_playbook: base/ufw.yml +- ansible.builtin.import_playbook: base/ssh.yml +- ansible.builtin.import_playbook: base/f2b.yml +- ansible.builtin.import_playbook: base/remove_snapd.yml +- ansible.builtin.import_playbook: base/unattended_upgrades.yml +- ansible.builtin.import_playbook: base/update_packages.yml +- ansible.builtin.import_playbook: base/lvm.yml +- ansible.builtin.import_playbook: base/fwupd.yml diff --git a/playbooks/3_service/acng.yml b/playbooks/3_service/acng.yml deleted file mode 100644 index 2dc9134a..00000000 --- a/playbooks/3_service/acng.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -- hosts: acng - roles: - - { role: mgrote.acng, tags: "acng" } diff --git a/playbooks/3_service/dnsmasq.yml b/playbooks/3_service/dnsmasq.yml deleted file mode 100644 index 9c9e4d69..00000000 --- a/playbooks/3_service/dnsmasq.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - - hosts: dnsmasq - roles: - - { role: mgrote.dnsmasq_adblocker, tags: "dns", become: true } diff --git a/playbooks/3_service/docker.yml b/playbooks/3_service/docker.yml index cb55bce8..2dbb0a46 100644 --- a/playbooks/3_service/docker.yml +++ b/playbooks/3_service/docker.yml @@ -1,9 +1,9 @@ --- - hosts: docker roles: - - { role: mgrote.systemd-resolved, tags: "dns", become: true } + - { role: mgrote_systemd_resolved, tags: "dns", become: true } - { role: geerlingguy.pip, tags: "pip", become: true } - { role: geerlingguy.docker, tags: "docker", become: true } - { role: gantsign.ctop, tags: "ctop", become: true } - - { role: mgrote.set_permissions, tags: "perm", become: true } - - { role: mgrote.docker-compose-inline, tags: "compose", become: true } + - { role: mgrote_set_permissions, tags: "perm", become: true } + - { role: mgrote_docker_compose_inline, tags: "compose", become: true } diff --git a/playbooks/3_service/dokuwiki.yml b/playbooks/3_service/dokuwiki.yml index f2cde001..ce325b19 100644 --- a/playbooks/3_service/dokuwiki.yml +++ b/playbooks/3_service/dokuwiki.yml @@ -1,4 +1,4 @@ --- - hosts: dokuwiki roles: - - { role: mgrote.dokuwiki, tags: "dokuwiki" } + - { role: mgrote_dokuwiki, tags: "dokuwiki" } diff --git a/playbooks/3_service/fileserver.yml b/playbooks/3_service/fileserver.yml index fae4fe3a..a6b4d769 100644 --- a/playbooks/3_service/fileserver.yml +++ b/playbooks/3_service/fileserver.yml @@ -6,6 +6,6 @@ --- - hosts: fileserver roles: - - { role: mgrote.fileserver_smb, tags: "fileserver_smb" } - - { role: mgrote.youtubedl, tags: "youtubedl" } - - { role: mgrote.disable_oom_killer, tags: "oom" } + - { role: mgrote_fileserver_smb, tags: "fileserver_smb" } + - { role: mgrote_youtubedl, tags: "youtubedl" } + - { role: mgrote_disable_oom_killer, tags: "oom" } diff --git a/playbooks/3_service/gitea.yml b/playbooks/3_service/gitea.yml index e198ebaf..377e7239 100644 --- a/playbooks/3_service/gitea.yml +++ b/playbooks/3_service/gitea.yml @@ -1,5 +1,4 @@ --- - hosts: gitea roles: - - { role: mgrote.postfix, tags: "postfix" } - { role: l3d.gitea, tags: "gitea", become: true } diff --git a/playbooks/3_service/k3s.yml b/playbooks/3_service/k3s.yml index 80cd7795..33b76fbd 100644 --- a/playbooks/3_service/k3s.yml +++ b/playbooks/3_service/k3s.yml @@ -2,9 +2,9 @@ - hosts: k3s roles: - { role: PyratLabs.k3s, tags: "k3s" } - - { role: mgrote.k8s_autocompletion, tags: "autocomp" } + - { role: mgrote_k8s_autocompletion, tags: "autocomp" } - { role: pandemonium1986.ansible-role-k9s, tags: "k9s", become: true } - - { role: mgrote.fluxcd, tags: "flux", become: true } - - { role: mgrote.k8s_misc, tags: "misc", become: true } - - { role: mgrote.sealed-secrets, tags: "sealed-secrets", become: true } + - { role: mgrote_fluxcd, tags: "flux", become: true } + - { role: mgrote_k8s_misc, tags: "misc", become: true } + - { role: mgrote_sealed_secrets, tags: "sealed-secrets", become: true } - { role: geerlingguy.helm, tags: "helm", become: true } diff --git a/playbooks/3_service/laptop.yml b/playbooks/3_service/laptop.yml deleted file mode 100644 index c0fed905..00000000 --- a/playbooks/3_service/laptop.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- hosts: laptop - roles: - - { role: mgrote.i3, tags: "i3", become: true } - - { role: mgrote.polybar, tags: "polybar", become: true } - - { role: mgrote.deactivate_caps, tags: "caps", become: true } - - { role: mgrote.alacritty, tags: "alacritty", become: true } - - { role: geerlingguy.pip, tags: "pip", become: true } - - { role: geerlingguy.docker, tags: "docker", become: true } - - { role: gantsign.ctop, tags: "ctop", become: true } - - { role: mgrote.xnview, tags: "xnview", become: true } diff --git a/playbooks/3_service/nfs.yml b/playbooks/3_service/nfs.yml deleted file mode 100644 index e4839948..00000000 --- a/playbooks/3_service/nfs.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -- hosts: nfs - roles: - - { role: geerlingguy.nfs_server, tags: "nfs", become: true } diff --git a/playbooks/3_service/pbs.yml b/playbooks/3_service/pbs.yml index 42da6d1a..7abd58fe 100644 --- a/playbooks/3_service/pbs.yml +++ b/playbooks/3_service/pbs.yml @@ -1,15 +1,13 @@ --- - hosts: pbs roles: - - { role: mgrote.zfs_packages, tags: "zfs_packages" } - - { role: mgrote.zfs_arc_mem, tags: "zfs_arc_mem" } - - { role: mgrote.zfs_manage_datasets, tags: "datasets" } - - { role: mgrote.zfs_scrub, tags: "zfs_scrub" } - - { role: mgrote.zfs_zed, tags: "zfs_zed" } - - { role: mgrote.zfs_health, tags: "zfs_health" } - - { role: mgrote.zfs_sanoid, - tags: "sanoid" } - - { role: mgrote.smart, tags: "smart" } - - { role: mgrote.postfix, tags: "postfix" } - - { role: mgrote.pbs_users, tags: "pbs_users" } - - { role: mgrote.pbs_datastores, tags: "pbs_datastores" } + - { role: mgrote_zfs_packages, tags: "zfs_packages" } + - { role: mgrote_zfs_arc_mem, tags: "zfs_arc_mem" } + - { role: mgrote_zfs_manage_datasets, tags: "datasets" } + - { role: mgrote_zfs_scrub, tags: "zfs_scrub" } + - { role: mgrote_zfs_zed, tags: "zfs_zed" } + - { role: mgrote_zfs_health, tags: "zfs_health" } + - { role: mgrote_zfs_sanoid, tags: "sanoid" } + - { role: mgrote_smart, tags: "smart" } + - { role: mgrote_pbs_users, tags: "pbs_users" } + - { role: mgrote_pbs_datastores, tags: "pbs_datastores" } diff --git a/playbooks/3_service/pve.yml b/playbooks/3_service/pve.yml index 21c87206..96b0b085 100644 --- a/playbooks/3_service/pve.yml +++ b/playbooks/3_service/pve.yml @@ -1,21 +1,15 @@ --- - hosts: pve roles: - - { role: mgrote.zfs_packages, tags: "zfs_packages" } - - { role: mgrote.zfs_arc_mem, tags: "zfs_arc_mem" } - - { role: mgrote.zfs_manage_datasets, tags: "datasets" } - - { role: mgrote.zfs_scrub, tags: "zfs_scrub" } - - { role: mgrote.zfs_zed, tags: "zfs_zed" } - - { role: mgrote.zfs_health, tags: "zfs_health" } - - { role: mgrote.zfs_sanoid, - tags: "sanoid" } - - { role: mgrote.smart, tags: "smart" } - - { role: mgrote.postfix, tags: "postfix" } - - { role: mgrote.cv4pve-autosnap, - tags: "cv4pve" } - - { role: mgrote.r8152_kernel_module, - tags: "r8152" } - - { role: mgrote.proxmox_bind_mounts, - tags: "bindmounts" } - - { role: mgrote.proxmox_lxc_profiles, tags: "lxc-profile" } - - { role: mgrote.pbs_pve_integration, tags: "pbs" } + - { role: mgrote_zfs_packages, tags: "zfs_packages" } + - { role: mgrote_zfs_arc_mem, tags: "zfs_arc_mem" } + - { role: mgrote_zfs_manage_datasets, tags: "datasets" } + - { role: mgrote_zfs_scrub, tags: "zfs_scrub" } + - { role: mgrote_zfs_zed, tags: "zfs_zed" } + - { role: mgrote_zfs_health, tags: "zfs_health" } + - { role: mgrote_zfs_sanoid, tags: "sanoid" } + - { role: mgrote_smart, tags: "smart" } + - { role: mgrote_cv4pve_autosnap, tags: "cv4pve" } + - { role: mgrote_proxmox_bind_mounts, tags: "bindmounts" } + - { role: mgrote_proxmox_lxc_profiles, tags: "lxc-profile" } + - { role: mgrote_pbs_pve_integration, tags: "pbs" } diff --git a/playbooks/base/apt_sources.yml b/playbooks/base/apt_sources.yml index 1594c9d5..c63f6d5d 100644 --- a/playbooks/base/apt_sources.yml +++ b/playbooks/base/apt_sources.yml @@ -1,5 +1,5 @@ --- - - hosts: all - roles: - - role: mgrote.apt_manage_sources - tags: "apt_sources" +- hosts: all + roles: + - role: mgrote_apt_manage_sources + tags: "apt_sources" diff --git a/playbooks/base/dotfiles.yml b/playbooks/base/dotfiles.yml index 0560c703..60e6a7dd 100644 --- a/playbooks/base/dotfiles.yml +++ b/playbooks/base/dotfiles.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.dotfiles, become: true, tags: "dotfiles" } +- hosts: all + roles: + - { role: mgrote_dotfiles, become: true, tags: "dotfiles" } diff --git a/playbooks/base/f2b.yml b/playbooks/base/f2b.yml index 13a32dfb..910db28f 100644 --- a/playbooks/base/f2b.yml +++ b/playbooks/base/f2b.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.fail2ban, tags: "f2b" } +- hosts: all + roles: + - { role: mgrote_fail2ban, tags: "f2b" } diff --git a/playbooks/base/fwupd.yml b/playbooks/base/fwupd.yml index b43e4c5a..0dfe3b3a 100644 --- a/playbooks/base/fwupd.yml +++ b/playbooks/base/fwupd.yml @@ -1,7 +1,7 @@ --- - - hosts: all - roles: - - { role: mgrote.fwupd_settings, - become: true, - tags: fwupd, - when: "ansible_facts['distribution'] == 'Ubuntu'"} +- hosts: all + roles: + - role: mgrote_fwupd_settings + become: true + tags: fwupd + when: "ansible_facts['distribution'] == 'Ubuntu'" diff --git a/playbooks/base/lvm.yml b/playbooks/base/lvm.yml index 7bab0a9a..fd262037 100644 --- a/playbooks/base/lvm.yml +++ b/playbooks/base/lvm.yml @@ -1,8 +1,8 @@ --- - - hosts: all - roles: - - { role: mrlesmithjr.ansible-manage-lvm, - tags: "lvm", - become: true, - when: manage_lvm == true and manage_lvm is defined } - # $manage_lvm gehört zu dieser Rolle, wird aber extra abgefragt um das PLaybook zu "aktivieren" +- hosts: all + roles: + - { role: mrlesmithjr.ansible-manage-lvm, + tags: "lvm", + become: true, + when: manage_lvm == true and manage_lvm is defined } + # $manage_lvm gehört zu dieser Rolle, wird aber extra abgefragt um das PLaybook zu "aktivieren" diff --git a/playbooks/base/motd.yml b/playbooks/base/motd.yml deleted file mode 100644 index 174523e0..00000000 --- a/playbooks/base/motd.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - - hosts: all - roles: - - { role: mgrote.motd, tags: "motd" } diff --git a/playbooks/base/ntp_client.yml b/playbooks/base/ntp_client.yml index 33ac0e8c..d09c1e08 100644 --- a/playbooks/base/ntp_client.yml +++ b/playbooks/base/ntp_client.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.ntp_chrony_client, tags: "ntp"} +- hosts: all + roles: + - { role: mgrote_ntp_chrony_client, tags: "ntp"} diff --git a/playbooks/base/packages.yml b/playbooks/base/packages.yml index 7781910c..1b0d6581 100644 --- a/playbooks/base/packages.yml +++ b/playbooks/base/packages.yml @@ -1,6 +1,6 @@ --- - - hosts: all - serial: 3 - roles: - - { role: mgrote.apt_manage_packages, tags: "install"} - - { role: mgrote.exa, tags: "exa"} +- hosts: all + serial: 3 + roles: + - { role: mgrote_apt_manage_packages, tags: "install"} + - { role: mgrote_exa, tags: "exa"} diff --git a/playbooks/base/postfix.yml b/playbooks/base/postfix.yml index 34bf8094..5170c75b 100644 --- a/playbooks/base/postfix.yml +++ b/playbooks/base/postfix.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.postfix, tags: "postfix" } +- hosts: all + roles: + - { role: mgrote_postfix, tags: "postfix" } diff --git a/playbooks/base/remove_snapd.yml b/playbooks/base/remove_snapd.yml index b1dc2617..c7091171 100644 --- a/playbooks/base/remove_snapd.yml +++ b/playbooks/base/remove_snapd.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.remove_snapd, become: true, tags: "snapd" } +- hosts: all + roles: + - { role: mgrote_remove_snapd, become: true, tags: "snapd" } diff --git a/playbooks/base/restic.yml b/playbooks/base/restic.yml index f592f96c..2eca23f1 100644 --- a/playbooks/base/restic.yml +++ b/playbooks/base/restic.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.restic, tags: "restic" } +- hosts: all + roles: + - { role: mgrote_restic, tags: "restic" } diff --git a/playbooks/base/ssh.yml b/playbooks/base/ssh.yml index 42bb3ef7..7816715d 100644 --- a/playbooks/base/ssh.yml +++ b/playbooks/base/ssh.yml @@ -1,5 +1,5 @@ --- - - hosts: all - roles: - - { role: mgrote.ssh, - tags: "ssh"} +- hosts: all + roles: + - { role: mgrote_ssh, + tags: "ssh"} diff --git a/playbooks/base/ufw.yml b/playbooks/base/ufw.yml index e051ec18..6361cbe4 100644 --- a/playbooks/base/ufw.yml +++ b/playbooks/base/ufw.yml @@ -1,6 +1,6 @@ --- - - hosts: all:!pve:!pbs - roles: - - { role: oefenweb.ufw, # Regeln werden in den Group/Host-Vars gesetzt - tags: "ufw", - become: true} +- hosts: all:!pve:!pbs + roles: + - { role: oefenweb.ufw, # Regeln werden in den Group/Host-Vars gesetzt + tags: "ufw", + become: true} diff --git a/playbooks/base/unattended_upgrades.yml b/playbooks/base/unattended_upgrades.yml index bb4ddae9..d1b77f7c 100644 --- a/playbooks/base/unattended_upgrades.yml +++ b/playbooks/base/unattended_upgrades.yml @@ -1,7 +1,7 @@ --- - - hosts: all:!pve,!pbs - roles: - - { role: hifis-net.unattended_upgrades, - become: true, - tags: unattended, - when: "ansible_facts['distribution'] == 'Ubuntu'"} +- hosts: all,!pve,!pbs + roles: + - { role: hifis-net.unattended_upgrades, + become: true, + tags: unattended, + when: "ansible_facts['distribution'] == 'Ubuntu'"} diff --git a/playbooks/base/update_packages.yml b/playbooks/base/update_packages.yml index e06b001f..facc9e2e 100644 --- a/playbooks/base/update_packages.yml +++ b/playbooks/base/update_packages.yml @@ -1,5 +1,5 @@ --- - - hosts: all - serial: 3 - roles: - - { role: mgrote.apt_update_packages, tags: "updates"} +- hosts: all + serial: 3 + roles: + - { role: mgrote_apt_update_packages, tags: "updates"} diff --git a/playbooks/base/users.yml b/playbooks/base/users.yml index 3dd2eae1..617009d1 100644 --- a/playbooks/base/users.yml +++ b/playbooks/base/users.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.users, tags: "user", become: yes } +- hosts: all + roles: + - { role: mgrote_users, tags: "user", become: true } diff --git a/playbooks/base/vim.yml b/playbooks/base/vim.yml index e9f821e3..6083f349 100644 --- a/playbooks/base/vim.yml +++ b/playbooks/base/vim.yml @@ -1,4 +1,4 @@ --- - - hosts: all - roles: - - { role: mgrote.vim, tags: "vim", become: true } +- hosts: all + roles: + - { role: mgrote_vim, tags: "vim", become: true } diff --git a/playbooks/on-off/activate_ssh_password_login.yml b/playbooks/on-off/activate_ssh_password_login.yml deleted file mode 100644 index 253616bf..00000000 --- a/playbooks/on-off/activate_ssh_password_login.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- hosts: proxmox - become: yes - - tasks: - - name: allow ssh login with password - become: yes - ansible.builtin.lineinfile: - path: /etc/ssh/sshd_config - regexp: 'PasswordAuthentication no' - line: '#PasswordAuthentication yes' - state: present - validate: "/usr/sbin/sshd -T -f %s" - notify: restart_sshd - - handlers: - - name: restart_sshd - become: yes - systemd: - name: sshd - enabled: yes - state: restarted diff --git a/playbooks/on-off/apt_autoremove.yml b/playbooks/on-off/apt_autoremove.yml deleted file mode 100644 index ca36b3f8..00000000 --- a/playbooks/on-off/apt_autoremove.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -- hosts: all - become: yes - serial: 5 - - tasks: - - name: apt autoremove - become: yes - ansible.builtin.apt: - autoremove: yes diff --git a/playbooks/on-off/apt_update.yml b/playbooks/on-off/apt_update.yml deleted file mode 100644 index 5b574bff..00000000 --- a/playbooks/on-off/apt_update.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -- hosts: all - become: yes - serial: 5 - - tasks: - - name: update apt cache - become: yes - ansible.builtin.apt: - update_cache: yes diff --git a/playbooks/on-off/delete_old_upgrades_config.yml b/playbooks/on-off/delete_old_upgrades_config.yml deleted file mode 100644 index 16e0f316..00000000 --- a/playbooks/on-off/delete_old_upgrades_config.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- hosts: all - tasks: - - name: delete_old_upgrades_config - become: yes - ansible.builtin.file: - name: "{{ item }}" - state: absent - loop: - - /etc/apt/apt.conf.d/20auto-upgrades - - /etc/apt/apt.conf.d/50unattended-upgrades diff --git a/playbooks/on-off/delete_ssh.yml b/playbooks/on-off/delete_ssh.yml deleted file mode 100644 index 4843f0b6..00000000 --- a/playbooks/on-off/delete_ssh.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- -- hosts: all - tasks: - - name: delete /home/mg/.ssh/authorized_keys - become: yes - ansible.builtin.file: - name: /home/mg/.ssh/authorized_keys - state: absent - - name: delete /home/ansible-user/.ssh/authorized_keys - become: yes - ansible.builtin.file: - name: /home/ansible-user/.ssh/authorized_keys - state: absent - - name: prohibit ssh login with password - become: yes - ansible.builtin.lineinfile: - path: /etc/ssh/sshd_config - regexp: 'PasswordAuthentication no' - line: 'PasswordAuthentication yes' - state: present - - name: restart_sshd - become: yes - systemd: - name: sshd - enabled: yes - state: restarted diff --git a/playbooks/on-off/f2b.yml b/playbooks/on-off/f2b.yml deleted file mode 100644 index 5eed98cd..00000000 --- a/playbooks/on-off/f2b.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- hosts: testeinzeln - become: yes - roles: - - { role: mgrote.postfix, tags: "postfix" } - - { role: mgrote.fail2ban, tags: "f2b" } diff --git a/playbooks/on-off/remove_bash-helper-scripts.yml b/playbooks/on-off/remove_bash-helper-scripts.yml index 4600123f..dd942bc0 100644 --- a/playbooks/on-off/remove_bash-helper-scripts.yml +++ b/playbooks/on-off/remove_bash-helper-scripts.yml @@ -2,7 +2,7 @@ - hosts: all tasks: - name: bash-helper-scripts-mgrote deinstallieren - become: yes + become: true ansible.builtin.package: name: bash-helper-scripts-mgrote state: absent diff --git a/playbooks/on-off/remove_chrony.yml b/playbooks/on-off/remove_chrony.yml deleted file mode 100644 index 2be4d61f..00000000 --- a/playbooks/on-off/remove_chrony.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -- hosts: all - tasks: - # deinstalliere andere ntp-implementationen - - name: removed chrony/ntp packages - become: yes - ansible.builtin.package: - name: - - chrony - - ntp - state: absent - - - name: remove chrony config - become: yes - ansible.builtin.file: - dest: /etc/chrony/chrony.conf - state: absent - - - name: remove logrotate config - become: yes - ansible.builtin.file: - dest: /etc/logrotate.d/chrony - state: absent - - - name: remove chrony driftfile folder - become: yes - file: - state: absent - path: /var/lib/chrony diff --git a/playbooks/on-off/remove_cowsay.yml b/playbooks/on-off/remove_cowsay.yml deleted file mode 100644 index 25ea0fc1..00000000 --- a/playbooks/on-off/remove_cowsay.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- hosts: all - tasks: - - name: cowsay deinstallieren - become: yes - ansible.builtin.package: - name: cowsay - state: absent diff --git a/playbooks/on-off/remove_dotfiles_dir.yml b/playbooks/on-off/remove_dotfiles_dir.yml deleted file mode 100644 index 09219c12..00000000 --- a/playbooks/on-off/remove_dotfiles_dir.yml +++ /dev/null @@ -1,54 +0,0 @@ ---- -- hosts: all - become: yes - tasks: - - name: delete /home/mg/dotfiles-repo - become: yes - ansible.builtin.file: - path: /home/mg/dotfiles-repo - state: absent - - name: delete /home/mg/.bash_aliases - become: yes - ansible.builtin.file: - path: /home/mg/.bash_aliases - state: absent - - name: delete /home/mg/.vimrc - become: yes - ansible.builtin.file: - path: /home/mg/.vimrc - state: absent - - name: delete /home/mg/.tmux.conf - become: yes - ansible.builtin.file: - path: /home/mg/.tmux.conf - state: absent - - name: delete /home/mg/.gitconfig - become: yes - ansible.builtin.file: - path: /home/mg/.gitconfig - state: absent - - name: delete /root/dotfiles-repo - become: yes - ansible.builtin.file: - path: /root/dotfiles-repo - state: absent - - name: delete /root/.bash_aliases - become: yes - ansible.builtin.file: - path: /root/.bash_aliases - state: absent - - name: delete /root/.tmux.conf - become: yes - ansible.builtin.file: - path: /root/.tmux.conf - state: absent - - name: delete /root/.gitconfig - become: yes - ansible.builtin.file: - path: /root/.gitconfig - state: absent - - name: delete /root/.vimrc - become: yes - ansible.builtin.file: - path: /root/.vimrc - state: absent diff --git a/playbooks/on-off/remove_ipmitool.yml b/playbooks/on-off/remove_ipmitool.yml deleted file mode 100644 index ae260e01..00000000 --- a/playbooks/on-off/remove_ipmitool.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- hosts: all - become: yes - - tasks: - - name: remove Packages - become: yes - ansible.builtin.package: - name: - - hddtemp - - ipmitool - - powertop - state: absent diff --git a/playbooks/on-off/remove_munin_node.yml b/playbooks/on-off/remove_munin_node.yml deleted file mode 100644 index bb43b550..00000000 --- a/playbooks/on-off/remove_munin_node.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -- hosts: all - become: yes - - tasks: - - name: remove Packages - become: yes - ansible.builtin.apt: - autoremove: yes - autoclean: yes - purge: yes - name: - - munin-node - state: absent - - - name: remove folder - become: yes - ansible.builtin.file: - path: /etc/munin - state: absent - - - name: ensure user is absent - become: true - ansible.builtin.user: - name: munin - state: absent - remove: true diff --git a/playbooks/on-off/remove_ntpd.yml b/playbooks/on-off/remove_ntpd.yml deleted file mode 100644 index 16b8312d..00000000 --- a/playbooks/on-off/remove_ntpd.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- hosts: all - tasks: - - name: ntp deinstallieren - become: yes - ansible.builtin.package: - name: ntp - state: absent - - name: config file - become: yes - file: - path: /etc/ntp.conf - state: absent - - name: config folder - become: yes - file: - path: /var/lib/ntp - state: absent diff --git a/playbooks/on-off/remove_old_restic_config.yml b/playbooks/on-off/remove_old_restic_config.yml deleted file mode 100644 index d108add8..00000000 --- a/playbooks/on-off/remove_old_restic_config.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -- hosts: all - become: yes - tasks: - - name: remove /etc/restic - become: yes - ansible.builtin.file: - path: /etc/restic - state: absent - - - name: ensure user exists - become: true - ansible.builtin.user: - name: restic - state: absent - - - name: add user to sudoers - become: true - ansible.builtin.blockinfile: - path: /etc/sudoers - state: absent - block: | - restic ALL=(ALL) NOPASSWD:ALL - validate: '/usr/sbin/visudo -cf %s' - backup: yes - marker_begin: restic-sudoers BEGIN - marker_end: restic-sudoers END - - - name: copy smb_password.txt - become: yes - ansible.builtin.file: - dest: "/etc/restic/smb_password.txt" - state: absent - - - name: copy restic_backup.sh - become: yes - ansible.builtin.file: - state: absent - dest: "/usr/local/bin/restic_backup.sh" - - - name: remove exclude.txt - become: yes - ansible.builtin.file: - path: "/etc/restic/exclude.txt" - state: absent - - - name: copy password.txt - become: yes - ansible.builtin.file: - state: absent - dest: "/etc/restic/password.txt" - - - name: remove restic cronjob - become: yes - ansible.builtin.cron: - name: restic - state: absent - job: "/usr/local/bin/restic_backup.sh" - minute: "{{ 59|random(seed=inventory_hostname) }}" - - - name: remove restic log - become: true - ansible.builtin.file: - path: /var/log/restic.log - state: absent - - - name: copy logrotate config - become: yes - ansible.builtin.file: - state: absent - dest: /etc/logrotate.d/restic diff --git a/playbooks/on-off/remove_old_restic_cronjob.yml b/playbooks/on-off/remove_old_restic_cronjob.yml deleted file mode 100644 index 0c687ac3..00000000 --- a/playbooks/on-off/remove_old_restic_cronjob.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- hosts: all - tasks: - - name: remove restic cronjob - become: yes - ansible.builtin.cron: - name: restic - state: absent - job: "/usr/local/bin/restic_backup.sh" - minute: "{{ 59|random(seed=inventory_hostname) }}" - hour: "{{ restic_cron_hours }}" - # siehe: https://stackoverflow.com/questions/33379378/idempotence-and-random-variables-in-ansible diff --git a/playbooks/on-off/remove_old_ssh_key.yml b/playbooks/on-off/remove_old_ssh_key.yml index 1efe73f8..0ec7ee94 100644 --- a/playbooks/on-off/remove_old_ssh_key.yml +++ b/playbooks/on-off/remove_old_ssh_key.yml @@ -1,10 +1,10 @@ --- - hosts: all - become: yes + become: true tasks: - name: Set authorized key taken from file - become: yes + become: true ansible.posix.authorized_key: user: ansible-user state: present diff --git a/playbooks/on-off/remove_sanoid.yml b/playbooks/on-off/remove_sanoid.yml deleted file mode 100644 index bf2a6d6f..00000000 --- a/playbooks/on-off/remove_sanoid.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- -- hosts: all - become: yes - - tasks: - - - - name: Create Sanoid Directory - become: true - ansible.builtin.file: - path: "{{ item }}" - state: absent - owner: root - group: root - # recurse: true - with_items: - - /etc/sanoid - - - - - name: Install Sanoid Binary - become: true - ansible.builtin.file: - dest: /usr/local/bin/sanoid - state: absent - - - name: Install Sanoid Defaults Configuration - become: true - ansible.builtin.file: - dest: /etc/sanoid/sanoid.defaults.conf - state: absent - - - name: Generate Sanoid Configuration - become: true - ansible.builtin.file: - dest: /etc/sanoid/sanoid.conf - state: absent - - - name: Create Sanoid Log - become: true - ansible.builtin.file: - path: "{{ sanoid_log_file }}" - state: absent - - - name: Add Sanoid Log to be Rotated - become: true - ansible.builtin.file: - path: /etc/logrotate.d/sanoid - state: absent - - - name: Generate Sanoid Cron Scripts - become: true - ansible.builtin.file: - dest: /usr/local/bin/sanoid-cron.sh - state: absent - - - name: Configure Sanoid Cron Job - become: true - ansible.builtin.cron: - name: sanoid-cron - job: /usr/local/bin/sanoid-cron.sh - state: absent diff --git a/playbooks/on-off/remove_telegraf.yml b/playbooks/on-off/remove_telegraf.yml deleted file mode 100644 index 56aa25b8..00000000 --- a/playbooks/on-off/remove_telegraf.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- hosts: all - tasks: - - name: telegraf deinstallieren - become: yes - ansible.builtin.package: - name: telegraf - state: absent - - name: telegraf-repository entfernen - become: yes - apt_repository: - repo: 'deb https://repos.influxdata.com/ubuntu {{ ansible_distribution_release }} stable' - state: absent - filename: telegraf_repo diff --git a/playbooks/on-off/repair_syslog.yml b/playbooks/on-off/repair_syslog.yml deleted file mode 100644 index db39eb16..00000000 --- a/playbooks/on-off/repair_syslog.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- hosts: all:!proxmox - become: yes - serial: 5 - - tasks: - - name: write logrotate config rsyslog - become: yes - template: - src: rsyslog_template - dest: /etc/logrotate.d/rsyslog - - name: remove line - ansible.builtin.lineinfile: - path: /etc/rsyslog.conf - state: absent - regexp: '. @@rsyslog.grote.lan:514' diff --git a/playbooks/on-off/root_bash.yml b/playbooks/on-off/root_bash.yml deleted file mode 100644 index d3fce9e9..00000000 --- a/playbooks/on-off/root_bash.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- hosts: all - tasks: - - name: ensure root has /bin/bash - become: true - ansible.builtin.user: - name: root - shell: /bin/bash diff --git a/playbooks/on-off/rsyslog_template b/playbooks/on-off/rsyslog_template deleted file mode 100644 index 54b753f8..00000000 --- a/playbooks/on-off/rsyslog_template +++ /dev/null @@ -1,37 +0,0 @@ -/var/log/syslog -{ - rotate 7 - daily - missingok - notifempty - delaycompress - compress - postrotate - /usr/lib/rsyslog/rsyslog-rotate - endscript -} - -/var/log/mail.info -/var/log/mail.warn -/var/log/mail.err -/var/log/mail.log -/var/log/daemon.log -/var/log/kern.log -/var/log/auth.log -/var/log/user.log -/var/log/lpr.log -/var/log/cron.log -/var/log/debug -/var/log/messages -{ - rotate 4 - weekly - missingok - notifempty - compress - delaycompress - sharedscripts - postrotate - /usr/lib/rsyslog/rsyslog-rotate - endscript -} diff --git a/playbooks/on-off/set_dns_resolver.yml b/playbooks/on-off/set_dns_resolver.yml deleted file mode 100644 index 78a22bdc..00000000 --- a/playbooks/on-off/set_dns_resolver.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- hosts: dns - become: yes - - tasks: - - name: Setze DNS-Resolver fuer pihole-* - ansible.builtin.lineinfile: - path: /etc/resolv.conf.head - line: nameserver 192.168.2.3 - create: yes - backrefs: false - mode: 0664 diff --git a/playbooks/on-off/set_id0.yml b/playbooks/on-off/set_id0.yml deleted file mode 100644 index 4636177d..00000000 --- a/playbooks/on-off/set_id0.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- hosts: all - become: yes - tasks: - - name: set root gid to 0 - become: true - ansible.builtin.user: - name: root - group: root diff --git a/playbooks/on-off/set_password_mg.yml b/playbooks/on-off/set_password_mg.yml deleted file mode 100644 index bdfa5722..00000000 --- a/playbooks/on-off/set_password_mg.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- hosts: all - become: yes - tasks: - - name: Change user password - user: - name: mg - update_password: always - password: "{{ lookup('keepass', 'mg_linux_password_hash', 'password') }}" #hier muss der hash rein - -# Hash erstellen -# python -c 'import crypt,getpass; print(getpass.getpass("Name: ")+":"+crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))' -# oder -# mkpasswd --method=SHA-512 diff --git a/playbooks/on-off/set_r8152_driver.yml b/playbooks/on-off/set_r8152_driver.yml deleted file mode 100644 index df91a5e8..00000000 --- a/playbooks/on-off/set_r8152_driver.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- hosts: all - become: yes - roles: - - { role: mgrote.r8152_kernel_module_on_off } diff --git a/roles/_mgrote.musterrolle/defaults/main.yml b/roles/_mgrote.musterrolle/defaults/main.yml deleted file mode 100644 index ac1e0e2d..00000000 --- a/roles/_mgrote.musterrolle/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - acng_exthreshold: "60" - acng_server_port: "9999" - acng_security_conf_path: "/etc/apt-cacher-ng/security.conf" - acng_server_auth_user: acngadmin - acng_server_auth_pass: klauspeter diff --git a/roles/_mgrote.musterrolle/handlers/main.yml b/roles/_mgrote.musterrolle/handlers/main.yml deleted file mode 100644 index 0abd29d1..00000000 --- a/roles/_mgrote.musterrolle/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: acng starten aktivieren - become: yes - systemd: - name: apt-cacher-ng - enabled: yes - state: restarted diff --git a/roles/_mgrote.musterrolle/tasks/main.yml b/roles/_mgrote.musterrolle/tasks/main.yml deleted file mode 100644 index 7e0225b6..00000000 --- a/roles/_mgrote.musterrolle/tasks/main.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: install apt-cacher-ng packages - become: yes - ansible.builtin.package: - name: apt-cacher-ng - state: present - - - name: templating acng.conf - become: yes - ansible.builtin.template: - src: "acng.conf" - dest: "/etc/apt-cacher-ng/acng.conf" - mode: 0664 - notify: acng_starten_aktivieren - - - name: Create restic log - become: true - ansible.builtin.file: - path: /var/log/restic.log - state: touch - owner: root - group: root - mode: 0640 - access_time: preserve - modification_time: preserve - - - name: copy logrotate config - become: yes - ansible.builtin.template: - src: logrotate_restic - dest: /etc/logrotate.d/restic - owner: root # muss root sein, sonst führt logrotate die datei nicht aus - group: root # muss root sein, sonst führt logrotate die datei nicht aus - mode: 0644 - - - name: add bind mounts to container - become: true - command: "pct set {{ item.vmid }} -mp{{ item.mp_nr }} {{ item.mp_path_host }},mp={{ item.mp_path_guest }}" - register: restart - notify: restart lxc - # füge bind-mount hinzu falls er fehlt, also rc ungleich 0 - # pro bind-mount - when: - - not ansible_check_mode - - not config.rc == 0 - # überspringe wenn in check-mode diff --git a/roles/_mgrote.musterrolle/tasks/user.yml b/roles/_mgrote.musterrolle/tasks/user.yml deleted file mode 100644 index cc4fa2d7..00000000 --- a/roles/_mgrote.musterrolle/tasks/user.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ sanoid_user_group }}" - state: present - when: - - sanoid_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ sanoid_user }}" - group: "{{ sanoid_user_group }}" - shell: /usr/sbin/nologin - create_home: no - when: - - sanoid_user_group is defined - - sanoid_user is defined - - - name: add user to sudoers - become: true - ansible.builtin.blockinfile: - path: /etc/sudoers - state: present - block: | - {{ sanoid_user }} ALL=(ALL) NOPASSWD:ALL - validate: '/usr/sbin/visudo -cf %s' - backup: yes - marker_begin: sanoid-sudoers BEGIN - marker_end: sanoid-sudoers END - when: - - sanoid_user_group is defined - - sanoid_user is defined diff --git a/roles/_mgrote.musterrolle_systemd/README.md b/roles/_mgrote.musterrolle_systemd/README.md deleted file mode 100644 index 9e750969..00000000 --- a/roles/_mgrote.musterrolle_systemd/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## mgrote.rclone - -### Beschreibung -Installiert und konfiguriert rclone zur Datensicherung. - -### getestet auf -- [x] Ubuntu 20.04 (LXC) - -### Variablen + Defaults -- see [defaults](./defaults/main.yml) - -## Altes rclone Repository - -https://git.mgrote.net/mg/rclone diff --git a/roles/_mgrote.musterrolle_systemd/defaults/main.yml b/roles/_mgrote.musterrolle_systemd/defaults/main.yml deleted file mode 100644 index f5a7abdc..00000000 --- a/roles/_mgrote.musterrolle_systemd/defaults/main.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- - -# rclone_config: "{{ lookup('keepass', 'rclone.conf', 'notes') }}" # rclone Config, use as Block - -# ### mgote.rclone -# rclone_jobs: # Array of Jobs -# - name: smb_musik_glacier # Jobname -# quelle: "/shares_music" # Source -# ziel: "scaleway-encrypt-glacier:/musik" # Destination -# timer: "*-*-* 23:15" # Timer -# loglevel: DEBUG # Optional: Loglevel -# state: true # true = present // false = remove -# bwlimit: 2M # Optional: Bandwidthlimit -# mode: "--size-only" # Optional: mode (https://rclone.org/s3/) -# transfers # Optional: Transfers -# checkers # Optional: Checkers -# retries # Optional: Retries diff --git a/roles/_mgrote.musterrolle_systemd/handlers/main.yml b/roles/_mgrote.musterrolle_systemd/handlers/main.yml deleted file mode 100644 index c73886d6..00000000 --- a/roles/_mgrote.musterrolle_systemd/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes diff --git a/roles/_mgrote.musterrolle_systemd/tasks/main.yml b/roles/_mgrote.musterrolle_systemd/tasks/main.yml deleted file mode 100644 index 24465c3d..00000000 --- a/roles/_mgrote.musterrolle_systemd/tasks/main.yml +++ /dev/null @@ -1,67 +0,0 @@ ---- - - name: template systemd services - become: yes - ansible.builtin.template: - src: "rclone.service.j2" - dest: "/etc/systemd/system/name.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - # wenn die unit über einen timer aktiviert wird muss sie nicht selber enabled werden, nur der timer muss enabled werden - - name: template rclone timer - become: yes - ansible.builtin.template: - src: "rclone.timer.j2" - dest: "/etc/systemd/system/rclone_{{ item.name }}.timer" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - with_items: - - "{{ rclone_jobs }}" - - # erstelle systemd-template - - name: template rclone_mail@.service.j2 - become: yes - ansible.builtin.template: - src: "rclone_mail@.service.j2" - dest: "/etc/systemd/system/rclone_mail@.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - # enable units, muss hier erfolgen statt als handler da sonst schonmit den units weiter gearbeitet wird obwohl sie noch nciht aktiv sind - - name: systemctl enable timer units - become: yes - ansible.builtin.systemd: - name: "rclone_{{ item.name }}.timer" - enabled: yes - masked: no - state: started - with_items: - - "{{ rclone_jobs }}" - notify: - - systemctl daemon-reload - - # ändere vorhandene unit; override.d statt direkte änderungen - - name: set timer - become: true - ansible.builtin.blockinfile: - create: yes - mode: 0644 - owner: root - group: root - path: /lib/systemd/system/sanoid.timer.d/override.conf - block: | - [Timer] - OnCalendar = {{ sanoid_timer }} - when: sanoid_timer is defined - notify: - - systemctl daemon-reload diff --git a/roles/_mgrote.musterrolle_systemd/templates/rclone.service.j2 b/roles/_mgrote.musterrolle_systemd/templates/rclone.service.j2 deleted file mode 100644 index 18abe54b..00000000 --- a/roles/_mgrote.musterrolle_systemd/templates/rclone.service.j2 +++ /dev/null @@ -1,10 +0,0 @@ -{{ file_header | default () }} - -[Unit] -Description=Sync data with rclone. -OnFailure=rclone_mail@{{ item.name }}.service - - -[Service] -Type=simple -ExecStart=/usr/bin/rclone --config "/etc/rclone/rclone.conf" sync --log-level {{ item.loglevel | default ("INFO") }} --transfers {{ item.transfers | default ("8") }} --checkers {{ item.checkers | default ("8") }} --retries {{ item.retries | default ("5") }} --bwlimit {{ item.bwlimit | default ("0") }} {% if item.mode is defined %}{{ item.mode }}{% endif %} --delete-after "{{ item.quelle }}" "{{item.ziel }}" diff --git a/roles/_mgrote.musterrolle_systemd/templates/rclone_mail@.service.j2 b/roles/_mgrote.musterrolle_systemd/templates/rclone_mail@.service.j2 deleted file mode 100644 index c68413cf..00000000 --- a/roles/_mgrote.musterrolle_systemd/templates/rclone_mail@.service.j2 +++ /dev/null @@ -1,8 +0,0 @@ -{{ file_header | default () }} - -[Unit] -Description=Send a Mail in case of an error in sanoid.service. - -[Service] -Type=oneshot -ExecStart=/bin/bash -c '/bin/systemctl status rclone_%i.service | mail -s "[ERROR] rclone - %i" {{ empfaenger_mail }}' diff --git a/roles/mgrote.acng/defaults/main.yml b/roles/mgrote.acng/defaults/main.yml deleted file mode 100644 index ac1e0e2d..00000000 --- a/roles/mgrote.acng/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - acng_exthreshold: "60" - acng_server_port: "9999" - acng_security_conf_path: "/etc/apt-cacher-ng/security.conf" - acng_server_auth_user: acngadmin - acng_server_auth_pass: klauspeter diff --git a/roles/mgrote.acng/handlers/main.yml b/roles/mgrote.acng/handlers/main.yml deleted file mode 100644 index e6b6b72b..00000000 --- a/roles/mgrote.acng/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: acng_starten_aktivieren - become: yes - systemd: - name: apt-cacher-ng - enabled: yes - state: restarted diff --git a/roles/mgrote.acng/tasks/main.yml b/roles/mgrote.acng/tasks/main.yml deleted file mode 100644 index 39ad7972..00000000 --- a/roles/mgrote.acng/tasks/main.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- - - name: ensure directories exists - become: yes - ansible.builtin.file: - path: "{{ item }}" - state: directory - loop: - - /etc/apt-cacher-ng - - /var/cache/apt-cacher-ng - - - name: ensure directories have the right permissions - become: yes - ansible.builtin.file: - path: "{{ item }}" - state: directory - owner: apt-cacher-ng - group: apt-cacher-ng - loop: - - /var/cache/apt-cacher-ng - - - name: templating acng.conf - become: yes - ansible.builtin.template: - src: "acng.conf" - dest: "/etc/apt-cacher-ng/acng.conf" - mode: 0664 - notify: acng_starten_aktivieren - - - name: install apt-cacher-ng packages - become: yes - ansible.builtin.package: - name: apt-cacher-ng - state: present - - - name: templating security.conf - become: yes - ansible.builtin.template: - src: "security.conf" - dest: "{{ acng_security_conf_path }}" - mode: 0640 - notify: acng_starten_aktivieren - no_log: true diff --git a/roles/mgrote.alacritty/defaults/main.yml b/roles/mgrote.alacritty/defaults/main.yml deleted file mode 100644 index 3240c6e2..00000000 --- a/roles/mgrote.alacritty/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - alacritty_url: http://docker10.grote.lan:3344/alacritty-latest.tar.gz diff --git a/roles/mgrote.alacritty/tasks/main.yml b/roles/mgrote.alacritty/tasks/main.yml deleted file mode 100644 index 18b5f1dd..00000000 --- a/roles/mgrote.alacritty/tasks/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - - name: download binary - ansible.builtin.unarchive: - src: "{{ alacritty_url }}" - dest: /usr/local/bin - remote_src: yes - - - name: set permissions - ansible.builtin.file: - path: /usr/local/bin/alacritty - mode: '0755' diff --git a/roles/mgrote.apcupsd/defaults/main.yml b/roles/mgrote.apcupsd/defaults/main.yml deleted file mode 100644 index 6e1a912c..00000000 --- a/roles/mgrote.apcupsd/defaults/main.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- - ## Values: http://www.apcupsd.org/manual/manual.html - - ## Master - # Wenn "true" ist dieser Host master. - apcupsd_nis_master: true - - # Interface auf dem der "Master" erreichbar ist. - apcupsd_nis_master_listen_ip: 0.0.0.0 - - # Post auf dem der "Master" erreichbar ist. - apcupsd_nis_master_listen_port: 3551 - - # Name der USV - apcupsd_ups_name: APC-BX950U-GR - - ## Slave - # Zeitspanne zwischen dem pollen - apcupsd_slave_polltime: 10 #in Sekunden - - - ## Master & Slave - # FQDN oder IP des "master" - apcupsd_nis_master_hostname: pve2.grote.lan - - # Zeitspanne in Sekunden, ab der der Systemdienst einen Stromausfall annimmt. Nuetzlich, um sehr kurze Ausfaelle ignorieren zu koennen. - apcupsd_master_onbatterydelay: 10 - apcupsd_slave_onbatterydelay: 10 - - # Durch die USV gemeldete Restkapazitaet in Prozent, ab der der Rechner heruntergefahren wird. - apcupsd_master_batterylevel_for_shutdown: 50 - apcupsd_slave_batterylevel_for_shutdown: 60 - - # apcupsd will shutdown the system during a power failure when the remaining runtime on batteries as internally calculated by the UPS falls below the specified minutes. Jeweils Master und Slave. - apcupsd_master_minutes_for_shutdown: 10 - apcupsd_slave_minutes_for_shutdown: 11 - - # Specifies when apcupsd should create the NOLOGON file to prevent users from logging on to the system. Jeweils Master und Slave. - apcupsd_master_nologon_when_active: always - apcupsd_slave_nologon_when_active: always diff --git a/roles/mgrote.apcupsd/handlers/main.yml b/roles/mgrote.apcupsd/handlers/main.yml deleted file mode 100644 index 361ea0e2..00000000 --- a/roles/mgrote.apcupsd/handlers/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - - name: restart_apcupsd #wird aufgerufen wenn apcupsd.conf_kopieren nach aenderungen den status "changed hat" - become: yes - systemd: - name: apcupsd - state: restarted - enabled: yes - - - name: apc_access_mail - shell: /usr/sbin/apcaccess | mail -s "{{ ansible_hostname }}" {{ empfaenger_mail }} diff --git a/roles/mgrote.apcupsd/meta/main.yml b/roles/mgrote.apcupsd/meta/main.yml deleted file mode 100644 index 56314662..00000000 --- a/roles/mgrote.apcupsd/meta/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - dependencies: - - role: mgrote.postfix - galaxy_info: - author: mgrote - description: installs apcupsd - min_ansible_version: 2.0 - license: GPLv3 - platforms: - - name: Proxmox - versions: - - all - galaxy_tags: - - system diff --git a/roles/mgrote.apcupsd/tasks/main.yml b/roles/mgrote.apcupsd/tasks/main.yml deleted file mode 100644 index a16f89c2..00000000 --- a/roles/mgrote.apcupsd/tasks/main.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- - - name: install apcupsd packages - ansible.builtin.package: - name: - - apcupsd - - apcupsd-cgi - - apcupsd-doc - state: present - become: yes - notify: apc_access_mail - - - name: create master config - include_tasks: master.yml - when: - - apcupsd_nis_master - - apcupsd_nis_master is defined - - - name: create slave config - include_tasks: slave.yml - when: - - not apcupsd_nis_master - - apcupsd_nis_master is defined - - - name: copy apcupsd file - become: yes - ansible.builtin.template: - src: "apcupsd" - dest: "/etc/default/apcupsd" - - - name: set mail recipient - become: yes - ansible.builtin.lineinfile: - path: /etc/apcupsd/apccontrol #wo - regexp: export SYSADMIN=root #suche nach - line: export SYSADMIN={{ empfaenger_mail }} #ersetze durch... - backrefs: yes #verhindert das die zeile bei "nicht zutreffen" am ende der datei angefuegt wird: https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html#parameters - - - name: copy test script - become: yes - ansible.builtin.template: - src: "apccontrol.save" - dest: "/etc/apcupsd/apccontrol.save" diff --git a/roles/mgrote.apcupsd/tasks/master.yml b/roles/mgrote.apcupsd/tasks/master.yml deleted file mode 100644 index 6f989fd3..00000000 --- a/roles/mgrote.apcupsd/tasks/master.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: templating master_apcupsd.conf - become: yes - ansible.builtin.template: - src: "master_apcupsd.conf" - dest: "/etc/apcupsd/apcupsd.conf" - notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/roles/mgrote.apcupsd/tasks/slave.yml b/roles/mgrote.apcupsd/tasks/slave.yml deleted file mode 100644 index 171c68d0..00000000 --- a/roles/mgrote.apcupsd/tasks/slave.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: templating slave_apcupsd.conf - become: yes - ansible.builtin.template: - src: "slave_apcupsd.conf" - dest: "/etc/apcupsd/apcupsd.conf" - notify: restart_apcupsd #benachrichtigt handlers/main.yml-restart-apcupsd_restart um den dient neuzustarten, nur wenn hier status "changed" ausgeworfen wird" diff --git a/roles/mgrote.apt_manage_packages/defaults/main.yml b/roles/mgrote.apt_manage_packages/defaults/main.yml deleted file mode 100644 index 4872db06..00000000 --- a/roles/mgrote.apt_manage_packages/defaults/main.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- - apt_packages_common: - - locales - - build-essential - - ntp - - htop - - git - - dnsutils - - nano - - mc - - cifs-utils - - netdiscover - - tree - - curl - - logrotate - - ncdu - - net-tools - - sysstat - - apt-transport-https - - neofetch - - ntpdate - - acl - - python3 - - vim - apt_packages_physical: - - hddtemp - - ipmitool - - powertop - - s-tui - apt_packages_vm: - - qemu-guest-agent - - open-vm-tools - apt_packages_extra: - apt_packages_absent: - apt_packages_internet: diff --git a/roles/mgrote.apt_manage_packages/tasks/main.yml b/roles/mgrote.apt_manage_packages/tasks/main.yml deleted file mode 100644 index 3f1782d4..00000000 --- a/roles/mgrote.apt_manage_packages/tasks/main.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- - - name: install common-packages - become: yes - ansible.builtin.package: - name: "{{ apt_packages_common }}" - state: present - - - name: install extra-packages - become: yes - ansible.builtin.package: - name: "{{ apt_packages_extra }}" - state: present - when: apt_packages_extra is defined - - - name: install vm-packages - become: yes - ansible.builtin.package: - name: "{{ apt_packages_vm }}" - state: present - when: ansible_virtualization_role == 'guest' - - - name: install physical-packages - become: yes - ansible.builtin.package: - name: "{{ apt_packages_physical }}" - state: present - when: ansible_virtualization_role != 'guest' - - - name: install packages from the internet - become: yes - ansible.builtin.apt: - deb: "{{ item }}" - state: present - when: apt_packages_internet is defined - loop: "{{ apt_packages_internet }}" - - - name: remove packages - become: yes - ansible.builtin.package: - name: "{{ apt_packages_absent }}" - state: absent diff --git a/roles/mgrote.apt_manage_sources/handlers/main.yml b/roles/mgrote.apt_manage_sources/handlers/main.yml deleted file mode 100644 index 4b88c5f0..00000000 --- a/roles/mgrote.apt_manage_sources/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: update package lists # noqa no-handler - become: yes - ansible.builtin.apt: - update_cache: yes diff --git a/roles/mgrote.apt_update_packages/tasks/main.yml b/roles/mgrote.apt_update_packages/tasks/main.yml deleted file mode 100644 index fe20b127..00000000 --- a/roles/mgrote.apt_update_packages/tasks/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - - name: update apt cache - become: yes - ansible.builtin.apt: - update_cache: yes - - - name: update installed packages - become: yes - ansible.builtin.package: - upgrade: dist diff --git a/roles/mgrote.cv4pve-autosnap/defaults/main.yml b/roles/mgrote.cv4pve-autosnap/defaults/main.yml deleted file mode 100644 index 4935e342..00000000 --- a/roles/mgrote.cv4pve-autosnap/defaults/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - # when should cv4pve be run - cv4pve_cron_minute: "39" - cv4pve_cron_hour: "5" - # proxmox api-token and user - cv4pve_api_token: "XXXXXXXXXXXXXXXXXXXXXX" - cv4pve_api_user: "root@pam!test2" - # which vm to snapshot - cv4pve_vmid: all - # how many snapshots to keep - cv4pve_keep_snapshots: 3 - # under which user the script is run - cv4pve_user_group: cv4pve - cv4pve_user: cv4pve diff --git a/roles/mgrote.cv4pve-autosnap/handlers/main.yml b/roles/mgrote.cv4pve-autosnap/handlers/main.yml deleted file mode 100644 index 510b17fe..00000000 --- a/roles/mgrote.cv4pve-autosnap/handlers/main.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes - - - name: systemctl enable units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - enabled: yes - masked: no - with_items: - - cv4pve.service - - cv4pve_mail.service - - cv4pve.timer - - - name: systemctl start units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - state: restarted - enabled: yes - with_items: - - cv4pve.timer - notify: systemctl daemon-reload diff --git a/roles/mgrote.cv4pve-autosnap/tasks/main.yml b/roles/mgrote.cv4pve-autosnap/tasks/main.yml deleted file mode 100644 index 84aab1d2..00000000 --- a/roles/mgrote.cv4pve-autosnap/tasks/main.yml +++ /dev/null @@ -1,73 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - - name: create directories - become: yes - ansible.builtin.file: - path: "{{ item }}" - state: directory - owner: "{{ cv4pve_user }}" - group: "{{ cv4pve_user_group }}" - loop: - - '/tmp/cv4pve' - - '/usr/local/bin/cv4pve' - - - name: download archives - become: yes - ansible.builtin.get_url: - url: "{{ cv4pve_dl_link }}" - dest: /tmp/cv4pve/cv4pve-autosnap-linux-x64.zip - mode: '0775' - - - name: extract archives - become: yes - ansible.builtin.unarchive: - src: /tmp/cv4pve/cv4pve-autosnap-linux-x64.zip - dest: /usr/local/bin/cv4pve - remote_src: yes - mode: a+x - owner: "{{ cv4pve_user }}" - group: "{{ cv4pve_user_group }}" - - - name: template cv4pve.service - become: yes - ansible.builtin.template: - src: cv4pve.service.j2 - dest: /etc/systemd/system/cv4pve.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: template cv4pve_mail.service - become: yes - ansible.builtin.template: - src: cv4pve_mail.service.j2 - dest: /etc/systemd/system/cv4pve_mail.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - - name: template cv4pve.timer - become: yes - ansible.builtin.template: - src: cv4pve.timer.j2 - dest: /etc/systemd/system/cv4pve.timer - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: systemctl start cv4pve.timer - become: yes - ansible.builtin.systemd: - name: cv4pve.timer - state: started - enabled: yes diff --git a/roles/mgrote.cv4pve-autosnap/tasks/user.yml b/roles/mgrote.cv4pve-autosnap/tasks/user.yml deleted file mode 100644 index b346fb0b..00000000 --- a/roles/mgrote.cv4pve-autosnap/tasks/user.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ cv4pve_user_group }}" - state: present - when: - - cv4pve_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ cv4pve_user }}" - group: "{{ cv4pve_user_group }}" - shell: /usr/sbin/nologin - create_home: no - when: - - cv4pve_user_group is defined - - cv4pve_user is defined diff --git a/roles/mgrote.deactivate_caps/handlers/main.yml b/roles/mgrote.deactivate_caps/handlers/main.yml deleted file mode 100644 index 45c84358..00000000 --- a/roles/mgrote.deactivate_caps/handlers/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - - name: deactivate caps - become: true - ansible.builtin.shell: setxkbmap -option caps:none diff --git a/roles/mgrote.deactivate_caps/tasks/main.yml b/roles/mgrote.deactivate_caps/tasks/main.yml deleted file mode 100644 index 0debb058..00000000 --- a/roles/mgrote.deactivate_caps/tasks/main.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - x11-xkb-utils - state: present - notify: deactivate caps diff --git a/roles/mgrote.disable_oom_killer/tasks/main.yml b/roles/mgrote.disable_oom_killer/tasks/main.yml deleted file mode 100644 index afe665a6..00000000 --- a/roles/mgrote.disable_oom_killer/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - - name: disable oom-killer in sysctl.conf (works after a reboot) - become: true - blockinfile: - path: /etc/sysctl.conf - block: | - vm.oom-kill = 0 - register: sysctl - - - name: disable oom-killer through /proc - become: true - ansible.builtin.command: echo 2 > /proc/sys/vm/overcommit_memory - when: sysctl.changed diff --git a/roles/mgrote.dnsmasq_adblocker/defaults/main.yml b/roles/mgrote.dnsmasq_adblocker/defaults/main.yml deleted file mode 100644 index afa48cd0..00000000 --- a/roles/mgrote.dnsmasq_adblocker/defaults/main.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- - # Welche DNS-Server soll dnsmasq anfragen? - dnsmasq_resolver: - - 9.9.9.9 - - 1.1.1.1 - # Soll dnsmasq alle Anfragen loggen? - dnsmasq_log_queries: false - # Wohin soll das Log geschrieben werden? - dnsmasq_logfile: /var/log/dnsmasq.log - # Welche BLocklisten sollen verwendet werden? - dnsmasq_blocklists: - - name: sysctl.org - state: present - url: http://sysctl.org/cameleon/hosts - - name: StevenBlack.1 - state: present - url: https://raw.githubusercontent.com/StevenBlack/hosts/master/data/KADhosts/hosts - - name: StevenBlack.2 - state: present - url: https://raw.githubusercontent.com/StevenBlack/hosts/master/data/add.Spam/hosts - - name: adaway.org - state: present - url: https://adaway.org/hosts.txt - - name: StevenBlack.3 - state: present - url: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts - - name: developerdan.1 - state: present - url: https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt - - name: developerdan.2 - state: present - url: https://www.github.developerdan.com/hosts/lists/amp-hosts-extended.txt - # Wie groß soll der Cache sein? - dnsmasq_cache_size: 10000 - # Auf welchem Port soll dnsmasq laufen? - dnsmasq_port: 53 - # User und Gruppe für dnsmasq - dnsmasq_user_group: dnsmasq - dnsmasq_user: dnsmasq - # Which domain should never be forwarded tor the "dnsmasq_resolvers" - dnsmasq_never_forward_domain: local.lan diff --git a/roles/mgrote.dnsmasq_adblocker/handlers/main.yml b/roles/mgrote.dnsmasq_adblocker/handlers/main.yml deleted file mode 100644 index eb7a0ac2..00000000 --- a/roles/mgrote.dnsmasq_adblocker/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: restart dnsmasq - become: yes - ansible.builtin.systemd: - name: dnsmasq - state: restarted diff --git a/roles/mgrote.dnsmasq_adblocker/tasks/blocklist.yml b/roles/mgrote.dnsmasq_adblocker/tasks/blocklist.yml deleted file mode 100644 index 418e9c6e..00000000 --- a/roles/mgrote.dnsmasq_adblocker/tasks/blocklist.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: download blocklist(s) - ansible.builtin.get_url: - url: "{{ item.url }}" - dest: "/etc/dnsmasq.d/blocklists/{{ item.name }}" - owner: "{{ dnsmasq_user }}" - group: "{{ dnsmasq_user_group }}" - loop: "{{ dnsmasq_blocklists }}" - when: item.state == "present" - notify: restart dnsmasq - register: download - - - name: remove blocklist(s) - ansible.builtin.file: - path: "/etc/dnsmasq.d/blocklists/{{ item.name }}" - state: absent - loop: "{{ dnsmasq_blocklists }}" - when: item.state == "absent" - notify: restart dnsmasq diff --git a/roles/mgrote.dnsmasq_adblocker/tasks/config.yml b/roles/mgrote.dnsmasq_adblocker/tasks/config.yml deleted file mode 100644 index 7a77ee60..00000000 --- a/roles/mgrote.dnsmasq_adblocker/tasks/config.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- - - name: template /etc/dnsmasq.conf - become: yes - ansible.builtin.template: - src: dnsmasq.conf.j2 - dest: /etc/dnsmasq.conf - owner: "{{ dnsmasq_user }}" - group: "{{ dnsmasq_user_group }}" - notify: restart dnsmasq diff --git a/roles/mgrote.dnsmasq_adblocker/tasks/install.yml b/roles/mgrote.dnsmasq_adblocker/tasks/install.yml deleted file mode 100644 index daa91fa4..00000000 --- a/roles/mgrote.dnsmasq_adblocker/tasks/install.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- - - name: ensure packages are installed - become: yes - ansible.builtin.package: - name: - - dnsmasq - - wget - state: present - register: install - - - name: stop dnsmasq (to prevent accidental DHCP-Server after installation) - become: yes - ansible.builtin.service: - name: dnsmasq - state: stopped - when: install.changed - - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ dnsmasq_user_group }}" - state: present - when: - - dnsmasq_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ dnsmasq_user }}" - group: "{{ dnsmasq_user_group }}" - shell: /usr/sbin/nologin - create_home: no - when: - - dnsmasq_user_group is defined - - dnsmasq_user is defined - - - name: ensure needed directories exists - become: yes - ansible.builtin.file: - path: "{{ item }}" - state: directory - owner: "{{ dnsmasq_user }}" - group: "{{ dnsmasq_user_group }}" - loop: - - /etc/dnsmasq.d - - /etc/dnsmasq.d/blocklists - - - name: clear default directories - become: yes - ansible.builtin.file: - path: "{{ item }}" - state: absent - loop: - - /etc/dnsmasq.d/README - - - name: template logrotate config - become: yes - ansible.builtin.template: - src: logrotate.j2 - dest: /etc/logrotate.d/dnsmasq - owner: root - group: root diff --git a/roles/mgrote.dnsmasq_adblocker/tasks/main.yml b/roles/mgrote.dnsmasq_adblocker/tasks/main.yml deleted file mode 100644 index 09283b9a..00000000 --- a/roles/mgrote.dnsmasq_adblocker/tasks/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - - name: include install tasks - include_tasks: install.yml - - - name: include configuration tasks - include_tasks: config.yml - - - name: include systemd tasks - include_tasks: services.yml - - - name: include blocklist tasks - include_tasks: blocklist.yml diff --git a/roles/mgrote.dnsmasq_adblocker/tasks/services.yml b/roles/mgrote.dnsmasq_adblocker/tasks/services.yml deleted file mode 100644 index d75777bf..00000000 --- a/roles/mgrote.dnsmasq_adblocker/tasks/services.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - - name: stop systemd-resolved service - ansible.builtin.systemd: - name: systemd-resolved - state: stopped - - - name: mask systemd-resolved service - ansible.builtin.systemd: - name: systemd-resolved - masked: yes - state: stopped - - - name: template /etc/resolv.conf - ansible.builtin.template: - src: resolv.conf.j2 - dest: /etc/resolv.conf - backup: yes - notify: restart dnsmasq diff --git a/roles/mgrote.docker-compose-deploy/tasks/dockercompose-down.yml b/roles/mgrote.docker-compose-deploy/tasks/dockercompose-down.yml deleted file mode 100644 index cb7eb86f..00000000 --- a/roles/mgrote.docker-compose-deploy/tasks/dockercompose-down.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- - - name: set dir - "{{ item.name }}" - set_fact: - project_dir: "{{ docker_compose_base_dir }}/{{ item.dir_name | default (item.name) }}" - when: - - docker_compose_base_dir is defined - - docker_compose_projects is defined - - - name: check if dir exists - stat: - path: "{{ project_dir }}" - register: dir - - - name: stop container - "{{ item.name }}" - ansible.builtin.shell: docker-compose down - args: - chdir: "{{ project_dir }}" - when: dir.stat.exists == true - - - name: remove repository - "{{ item.name }}" - ansible.builtin.file: - state: absent - dest: "{{ project_dir }}" - when: dir.stat.exists == true diff --git a/roles/mgrote.docker-compose-deploy/tasks/dockercompose-up.yml b/roles/mgrote.docker-compose-deploy/tasks/dockercompose-up.yml deleted file mode 100644 index 68989430..00000000 --- a/roles/mgrote.docker-compose-deploy/tasks/dockercompose-up.yml +++ /dev/null @@ -1,64 +0,0 @@ ---- - - name: set username and passwort - "{{ item.name }}" - set_fact: - login: "{{ item.repository_user }}:{{ item.repository_user_password }}@" - when: - - item.repository_user is defined - - item.repository_user_password is defined - - - name: set dir - "{{ item.name }}" - set_fact: - project_dir: "{{ docker_compose_base_dir }}/{{ item.dir_name | default (item.name) }}" - when: - - docker_compose_base_dir is defined - - docker_compose_projects is defined - - - name: check if repo exists - "{{ item.name }}" (wenn der Task >30s dauert sind die Login-Daten falsch) - stat: - path: "{{ project_dir }}" - register: repo_exists - - - name: set safe directory - become: true - ansible.builtin.shell: - cmd: git config --global --add safe.directory "{{ project_dir }}" - changed_when: false - - - name: stash changes - "{{ item.name }}" - ansible.builtin.shell: git stash - args: - chdir: "{{ project_dir }}" - changed_when: false - when: repo_exists.stat.exists == true - - - name: clone repository - "{{ item.name }}" - ansible.builtin.git: - repo: "https://{{ login | default () }}{{ item.repository_url }}" - dest: "{{ project_dir }}" - version: "{{ item.git_branch | default ('master') }}" - register: repo - - - name: set owner recursive for repo - file: - path: "{{ project_dir }}" - owner: "{{ item.os_username }}" - group: "{{ item.os_username }}" - recurse: yes - when: repo is changed - - - name: create networks - "{{ item.name }}" - ansible.builtin.shell: "docker network create {{ item.network_name }}" # erstelle network - when: "item.network_name is defined" # wenn network_name definiert ist - register: network_result # speichere ergebnis in var - changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 - ignore_errors: yes # ignoriere fehler - - - name: (re)start container - "{{ item.name }}" - ansible.builtin.shell: docker-compose down && docker-compose up -d - args: - chdir: "{{ project_dir }}" - when: repo.changed - - - name: unset username and passwort - "{{ item.name }}" - set_fact: - login: "" diff --git a/roles/mgrote.docker-compose-deploy/tasks/main.yml b/roles/mgrote.docker-compose-deploy/tasks/main.yml deleted file mode 100644 index c02d0ab1..00000000 --- a/roles/mgrote.docker-compose-deploy/tasks/main.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - - name: loop docker tasks - up - include_tasks: dockercompose-up.yml - loop: "{{ docker_compose_projects }}" - when: - - item.state == "present" - - docker_compose_projects is defined - no_log: true - - - name: loop docker tasks - down - include_tasks: dockercompose-down.yml - loop: "{{ docker_compose_projects }}" - when: - - item.state == "absent" - - docker_compose_projects is defined - no_log: true diff --git a/roles/mgrote.docker-compose-inline/defaults/main.yml b/roles/mgrote.docker-compose-inline/defaults/main.yml deleted file mode 100644 index 8d9cb9e5..00000000 --- a/roles/mgrote.docker-compose-inline/defaults/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - # owner and group of all files and directories - compose_owner: "docker-user" - compose_group: "docker-user" - # default permissions for all files and directories - compose_file_permissions: "644" - compose_dir_permissions: "755" - # where to store the compose-files on the destination system - compose_dest_basedir: "/docker" # without trailing "/" - # where are the docker-compose-files located on the ansible controller - compose_src_basedir: "{{ inventory_dir }}/docker-compose" # without trailing "/" - # dict of compose-files to deploy - #compose_files: - # - name: hastebin # used for directory name; starting & stopping - # state: present - # #network: test_nw # external network (optional) - # - name: ara - # state: present diff --git a/roles/mgrote.docker-compose-inline/tasks/main.yml b/roles/mgrote.docker-compose-inline/tasks/main.yml deleted file mode 100644 index 9dfda2aa..00000000 --- a/roles/mgrote.docker-compose-inline/tasks/main.yml +++ /dev/null @@ -1,97 +0,0 @@ ---- - - name: ensure basedir exists - become: true - ansible.builtin.file: - path: "{{ compose_dest_basedir }}" - state: directory - mode: "{{ compose_dir_permissions }}" - owner: "{{ compose_owner }}" - group: "{{ compose_group }}" - -# https://codeutility.org/ansible-can-the-templates-module-handle-multiple-templates-directories-stack-overflow/ - - name: copy all directories recursively - ansible.builtin.file: - dest: "{{compose_dest_basedir}}/{{ item|replace(compose_src_basedir+'/', '') }}" - state: directory - mode: "{{ compose_dir_permissions }}" - owner: "{{ compose_owner }}" - group: "{{ compose_group }}" - with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type d').split('\n') }}" - - - name: copy all files recursively (can take a long time) - ansible.builtin.copy: - mode: "{{ compose_file_permissions }}" - owner: "{{ compose_owner }}" - group: "{{ compose_group }}" - src: "{{ item }}" - dest: "{{compose_dest_basedir}}/{{ item|replace(compose_src_basedir+'/', '') }}" - with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type f -not -name *.j2 ').split('\n') }}" - no_log: true - - - name: copy templates files recursively - ansible.builtin.template: - mode: "{{ compose_file_permissions }}" - owner: "{{ compose_owner }}" - group: "{{ compose_group }}" - src: "{{ item }}" - dest: "{{compose_dest_basedir}}/{{ item|replace(compose_src_basedir+'/', '')|replace('.j2', '') }}" - with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type f -name *.j2').split('\n') }}" - register: copy_template - no_log: true - -# - name: print $copy_template -# ansible.builtin.debug: -# var: copy_template - - - name: create networks - become: true - ansible.builtin.shell: "docker network create {{ item.network }}" # erstelle network - register: network_result # speichere ergebnis in var - changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 - ignore_errors: yes # ignoriere fehler - loop: "{{ compose_files }}" - when: - - item.state == "present" - - item.network is defined - - - name: (re)start container - become: true - ansible.builtin.shell: docker-compose up -d - args: - chdir: "{{ compose_dest_basedir }}/{{ item.name }}" - register: start_result # speichere ergebnis in var - changed_when: "start_result.rc == 0" # markiere tasks als changed when exit-code == 0 - loop: "{{ compose_files }}" - when: - - item.state == "present" - - copy_template is changed - - - name: stop old container - become: true - ansible.builtin.shell: docker-compose down - args: - chdir: "{{ compose_dest_basedir }}/{{ item.name }}" - loop: "{{ compose_files }}" - when: - - item.state == "absent" - ignore_errors: yes # ignoriere fehler - - - name: remove old networks - become: true - ansible.builtin.shell: "docker network remove {{ item.network }}" # erstelle network - register: network_result # speichere ergebnis in var - changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 - ignore_errors: yes # ignoriere fehler - loop: "{{ compose_files }}" - when: - - item.state == "absent" - - item.network is defined - - - name: remove old docker-compose files & directories - become: true - ansible.builtin.file: - path: "{{ compose_dest_basedir }}/{{ item.name }}/" - state: absent - loop: "{{ compose_files }}" - when: - - item.state == "absent" diff --git a/roles/mgrote.dokuwiki/defaults/main.yml b/roles/mgrote.dokuwiki/defaults/main.yml deleted file mode 100644 index cf83addb..00000000 --- a/roles/mgrote.dokuwiki/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - dokuwiki_install_path: /var/www/dokuwiki # wohin soll dokuwiki installiert werden - dokuwiki_download_url: https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz # wo soll dokuwiki heruntergeladen werden - dokuwiki_version_name: 2020-07-29 "Hogfather" # aus /var/www/dokuwiki/VERSION # welche Version, damit wird abgeglichen ob das Archiv heruntergeladen werden muss - dokuwiki_user: www-data # dokuwiki nutzer - dokuwiki_group: www-data # dokuwiki gruppe diff --git a/roles/mgrote.dokuwiki/handlers/main.yml b/roles/mgrote.dokuwiki/handlers/main.yml deleted file mode 100644 index b04ed67b..00000000 --- a/roles/mgrote.dokuwiki/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart_apache2 - become: yes - systemd: - name: apache2 - state: restarted - enabled: yes diff --git a/roles/mgrote.dokuwiki/meta/main.yml b/roles/mgrote.dokuwiki/meta/main.yml deleted file mode 100644 index 698c58af..00000000 --- a/roles/mgrote.dokuwiki/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - dependencies: - - role: mgrote.postfix diff --git a/roles/mgrote.dokuwiki/tasks/apache2.yml b/roles/mgrote.dokuwiki/tasks/apache2.yml deleted file mode 100644 index f3a07940..00000000 --- a/roles/mgrote.dokuwiki/tasks/apache2.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- - # aktiviert das module rewrite = a2enmod rewrite - - name: activate a2enmod rewrite - become: yes - ansible.builtin.apache2_module: - state: present - name: rewrite - - - name: copy default apache2.conf - become: yes - ansible.builtin.template: - src: "apache2.conf" - dest: "/etc/apache2/apache2.conf" - notify: restart_apache2 - - - name: copy 000-default.conf - become: yes - ansible.builtin.template: - src: "000-default.conf" - dest: "/etc/apache2/sites-enabled/000-default.conf" - notify: restart_apache2 diff --git a/roles/mgrote.dokuwiki/tasks/dokuwiki.yml b/roles/mgrote.dokuwiki/tasks/dokuwiki.yml deleted file mode 100644 index e34b4b09..00000000 --- a/roles/mgrote.dokuwiki/tasks/dokuwiki.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- - - name: create dokuwiki install path - become: yes - ansible.builtin.file: - path: "{{ dokuwiki_install_path }}" - state: directory - owner: "{{ dokuwiki_user }}" - group: "{{ dokuwiki_group }}" - - - name: check if dokuwiki is installed - become: yes - stat: - path: /var/www/dokuwiki/VERSION - register: dokuwiki_install_status - - - name: check if desired version is installed - become: yes - ignore_errors: yes - lineinfile: - path: /var/www/dokuwiki/VERSION - line: "{{ dokuwiki_version_name }}" - state: present - check_mode: yes - register: dokuwiki_desired_version - when: - - dokuwiki_install_status.stat.exists == true - # falls Dokuwiki schon installiert ist existiert var/www/dokuwiki/VERSION mit - # dem Inhalt der Version: z.B. 2020-07-29 "Hogfather" - # when die Version die selbe wie in der Variable ist - # ist der status ok, ist die Version unterschiedlich ist der status changed, die Datei - # selber wird aber nicht geändert weil check_mode gleich yes ist - # das Ergebnis wird in der Variable dokuwiki_desired_version gespeichert - # https://raymii.org/s/tutorials/Ansible_-_Only-do-something-if-another-action-changed.html - - - name: download latest dokuwiki archive & unarchive to {{ dokuwiki_install_path }} - become: yes - ansible.builtin.unarchive: - src: "{{ dokuwiki_download_url }}" - dest: "{{ dokuwiki_install_path }}" - remote_src: yes - extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives - owner: "{{ dokuwiki_user }}" - mode: 0744 - when: - - (dokuwiki_desired_version.changed) or - (dokuwiki_install_status.stat.exists == false) - # Dise Variable wird hier abgefragt, so wird das Paket nur heruntergeladen wenn die - # Version Unterschiedlich ist - - - name: Remove default plugins - become: yes - ansible.builtin.file: - path: '{{ dokuwiki_install_path }}/lib/plugins/{{ item }}' - state: absent - with_items: - - authpdo - - authmysql - - authpgsql - - authad - - - name: Change file ownership, group and permissions - become: yes - ansible.builtin.file: - path: "{{ dokuwiki_install_path }}" - owner: "{{ dokuwiki_user }}" - group: "{{ dokuwiki_group }}" - mode: 0744 - - - name: remove installer - file: - path: "{{ dokuwiki_install_path }}/install.php" - state: absent diff --git a/roles/mgrote.dokuwiki/tasks/install.yml b/roles/mgrote.dokuwiki/tasks/install.yml deleted file mode 100644 index 2894d09e..00000000 --- a/roles/mgrote.dokuwiki/tasks/install.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - php - - php-mbstring - - php-xml - - apache2 - - libapache2-mod-php - - php-xml - - php-gd - state: present diff --git a/roles/mgrote.dokuwiki/tasks/main.yml b/roles/mgrote.dokuwiki/tasks/main.yml deleted file mode 100644 index da2d69d1..00000000 --- a/roles/mgrote.dokuwiki/tasks/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: include install tasks - include_tasks: install.yml - - name: include apache2 tasks - include_tasks: apache2.yml - - name: include dokuwiki tasks - include_tasks: dokuwiki.yml diff --git a/roles/mgrote.dotfiles/defaults/main.yml b/roles/mgrote.dotfiles/defaults/main.yml deleted file mode 100644 index 2a50b1e6..00000000 --- a/roles/mgrote.dotfiles/defaults/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - dotfiles_repo_url: https://git.mgrote.net/mg/dotfiles # url zum repo - dotfiles_repo_path: /home/mg/dotfiles # wo soll das repo lokal gespeichert werden - dotfiles_repo_branch: master #default branch for checking out - dotfiles_files: # welche dateien sollen wohin verlinkt werden (ln -s) - - repo_path: "{{ dotfiles_repo_path}}/.vimrc" - local_path: "/home/mg/.vimrc" - dotfiles_dirs: # welche ordner sollen erstellt werden - - path: /home/mg/.config/i3 - - path: /home/mg/.config/polybar - dotfiles_owner: mg # chown diff --git a/roles/mgrote.dotfiles/tasks/main.yml b/roles/mgrote.dotfiles/tasks/main.yml deleted file mode 100644 index 2b758908..00000000 --- a/roles/mgrote.dotfiles/tasks/main.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- - - name: install acl package - become: yes - ansible.builtin.package: - name: acl - state: present - - - name: check if repo exists - stat: - path: "{{ dotfiles_repo_path }}" - register: repo_exists - - - name: set safe directory - become: true - ansible.builtin.shell: - cmd: git config --global --add safe.directory "{{ dotfiles_repo_path }}" - changed_when: false - - - name: stash changes - ansible.builtin.shell: git stash - args: - chdir: "{{ dotfiles_repo_path }}" - changed_when: false - when: repo_exists.stat.exists == true - - - name: Ensure dotfiles repository is cloned locally. - git: - repo: "{{ dotfiles_repo_url }}" - dest: "{{ dotfiles_repo_path }}" - depth: 1 - version: "{{ dotfiles_repo_branch }}" - register: git_clone - - - name: set owner recursive for repo - file: - path: "{{ dotfiles_repo_path }}" - owner: "{{ dotfiles_owner }}" - group: "{{ dotfiles_owner }}" - recurse: yes - when: (git_clone.changed == true) - - - name: Ensure needed dirs exist. - file: - path: "{{ item.path }}" - state: directory - with_items: "{{ dotfiles_dirs }}" - - - name: Link dotfiles into home folder - file: - src: "{{ item.repo_path }}" - dest: "{{ item.local_path }}" - state: link - force: yes - owner: "{{ dotfiles_owner }}" - group: "{{ dotfiles_owner }}" - with_items: "{{ dotfiles_files }}" - - - name: add .bash_extra to .bashrc - ansible.builtin.lineinfile: - path: /home/{{ dotfiles_owner }}/.bashrc - line: "source {{ dotfiles_repo_path }}/.bash_extra" - state: present diff --git a/roles/mgrote.exa/defaults/main.yml b/roles/mgrote.exa/defaults/main.yml deleted file mode 100644 index 2e025db5..00000000 --- a/roles/mgrote.exa/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - exa_url: https://github.com/ogham/exa/releases/download/v0.10.1/exa-linux-x86_64-v0.10.1.zip diff --git a/roles/mgrote.exa/tasks/main.yml b/roles/mgrote.exa/tasks/main.yml deleted file mode 100644 index cca33213..00000000 --- a/roles/mgrote.exa/tasks/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - - name: download & extract exa - become: true - ansible.builtin.unarchive: - src: "{{ exa_url }}" - dest: /usr/local/ - remote_src: yes - owner: root - group: root - mode: 0755 diff --git a/roles/mgrote.fail2ban/defaults/main.yml b/roles/mgrote.fail2ban/defaults/main.yml deleted file mode 100644 index 476f0c81..00000000 --- a/roles/mgrote.fail2ban/defaults/main.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - # Werte in Sekunden - f2b_bantime: 60 - f2b_findtime: 600 - f2b_maxretry: 5 - f2b_destemail: michael.grote@posteo.de - f2b_sender: info@mgrote.net - f2b_send_email_report: true diff --git a/roles/mgrote.fail2ban/handlers/main.yml b/roles/mgrote.fail2ban/handlers/main.yml deleted file mode 100644 index 33852c6b..00000000 --- a/roles/mgrote.fail2ban/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart_f2b - become: yes - systemd: - name: fail2ban - enabled: yes - state: restarted diff --git a/roles/mgrote.fail2ban/meta/main.yml b/roles/mgrote.fail2ban/meta/main.yml deleted file mode 100644 index 698c58af..00000000 --- a/roles/mgrote.fail2ban/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - dependencies: - - role: mgrote.postfix diff --git a/roles/mgrote.fail2ban/tasks/main.yml b/roles/mgrote.fail2ban/tasks/main.yml deleted file mode 100644 index 174a0bbc..00000000 --- a/roles/mgrote.fail2ban/tasks/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- - - name: install fail2ban-packages - become: yes - ansible.builtin.package: - name: fail2ban - state: present - - - name: copy jail.local - become: yes - ansible.builtin.template: - src: jail.local - dest: /etc/fail2ban/jail.local - mode: 0750 - notify: restart_f2b - - - name: copy sendmail-common.local - become: yes - ansible.builtin.template: - src: sendmail-common.local - dest: /etc/fail2ban/action.d/sendmail-common.local - mode: 0750 - notify: restart_f2b diff --git a/roles/mgrote.fileserver_smb/defaults/main.yml b/roles/mgrote.fileserver_smb/defaults/main.yml deleted file mode 100644 index 5c9932ea..00000000 --- a/roles/mgrote.fileserver_smb/defaults/main.yml +++ /dev/null @@ -1,107 +0,0 @@ ---- - # Global SMB options - ## "smb_global_options" = dict - ## -option: "smbd option name" <-- value - ## value: "smbd value" <-- value - ## neue Optionen konnen einfach angehangen werden bzw. alte entfernt werden - smb_global_options: - - option: min protocol - value: "SMB2_02" - - option: client min protocol - value: "SMB2_02" - - option: client max protocol - value: "SMB3_00" - - option: log level - value: "1" - - option: log file - value: "/var/log/samba/log" - - option: max log size - value: "1000" - - option: logging - value: "syslog" - - option: panic action - value: "/usr/share/samba/panic-action_%d" - - option: passdb backend - value: "tdbsam" - - option: obey pam restrictions - value: "no" - - option: unix password sync - value: "no" - - option: passwd program - value: "/usr/bin/passwd_%u" - - option: passwd chat - value: '*Enter\snew\s*\spassword:*_%n\n_*Retype\snew\s*\spassword:*_%n\n_*password\supdated\ssuccessfully*_.' - - option: pam password change - value: "yes" - - option: guest account - value: "nobody" - - option: load printers - value: "no" - - option: unix extensions - value: "yes" - - option: wide links - value: "no" - - option: create mask - value: "0777" - - option: directory mask - value: "0777" - - option: map to guest - value: "Bad User" - - option: use sendfile - value: "yes" - - option: aio read size - value: "16384" - - option: aio write size - value: "16384" - - option: local master - value: "yes" - - option: time server - value: "no" - - option: wins support - value: "no" - - option: acl allow execute always - value: "yes" - - option: force user - value: "root" - - option: force group - value: "users" - - option: workgroup - value: WORKGROUP - - option: server string - value: "%h_server" - - # packages - smb_packages: - - samba - - cifs-utils - - samba-common - - samba-common-bin - - samba-vfs-modules - - # zfs-snapshots einbinden - ## als \.zfs\snapshot einbinden - ## sorgt dafur das statt "A0KDC9~F" die Ordnernamen als "autosnap_2021-11-04_23÷59÷02_daily" angezeigt werden - ## https://www.samba.org/samba/docs/current/man-html/vfs_catia.8.html - # aktiv? - smb_enable_snapshots_dir: true - # welche Character/zeichen-Ersetzungen soll catia ausführen - smb_catia_mappings: "0x3a:0xf7" # ersetzt ":" durch "÷" - - # als Windows-Shattenkopien einbinden - ## https://www.samba.org/samba/docs/current/man-html/vfs_shadow_copy2.8.html - ## BUG: Windows sieht die Schattenkopien, kann die Ausgewählte Datei aber nicht öffnen wenn sie seit dem Snapshot gelöscht wurde, vmtl da Windows nicht den kompletten Snapshot-Pfad verwendet - ## Format ist passend fur sanoid-Snapshots - # aktiv? - smb_enable_snapshots_shadow: false - # wo liegen die Snapshots - smb_shadow_snapdir: ".zfs/snapshot" - # Sortierung - smb_shadow_sort: "desc" - # Datumsformat der Snapshots - smb_shadow_format: "_%Y-%m-%d_%H:%M:%S" - # Snapshot-Präfix - smb_shadow_snapprefix: "^autosnap" - # Snapshot-"Trenner" - smb_shadow_delimiter: "_" - # zeitformat Snapshots - smb_shadow_localtime: "no" diff --git a/roles/mgrote.fileserver_smb/handlers/main.yml b/roles/mgrote.fileserver_smb/handlers/main.yml deleted file mode 100644 index edebb285..00000000 --- a/roles/mgrote.fileserver_smb/handlers/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: restart smbd - become: yes - systemd: - name: smbd - enabled: yes - state: restarted - - - name: set samba passwords - become: yes - shell: "printf '{{ item.password }}\n{{ item.password }}\n' | smbpasswd -a {{ item.name }}" # noqa no-changed-when risky-shell-pipe - #pipefail: https://blog.christophersmart.com/2019/09/28/using-pipefail-with-shell-module-in-ansible/ - with_items: - - "{{ smb_users }}" - no_log: True diff --git a/roles/mgrote.fileserver_smb/tasks/main.yml b/roles/mgrote.fileserver_smb/tasks/main.yml deleted file mode 100644 index 0b808ce3..00000000 --- a/roles/mgrote.fileserver_smb/tasks/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - - name: include install tasks - include_tasks: packages.yml - - - name: include user tasks - include_tasks: users.yml - when: smb_users is defined - - - name: include share tasks - include_tasks: shares.yml - when: smb_shares is defined diff --git a/roles/mgrote.fileserver_smb/tasks/packages.yml b/roles/mgrote.fileserver_smb/tasks/packages.yml deleted file mode 100644 index a306a2ca..00000000 --- a/roles/mgrote.fileserver_smb/tasks/packages.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: ensure packages are installed - become: yes - ansible.builtin.package: - name: "{{ smb_packages }}" - state: present diff --git a/roles/mgrote.fileserver_smb/tasks/shares.yml b/roles/mgrote.fileserver_smb/tasks/shares.yml deleted file mode 100644 index 3ad48a1c..00000000 --- a/roles/mgrote.fileserver_smb/tasks/shares.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- - - name: ensure smb share directories exist - become: yes - ansible.builtin.file: - path: "{{ item.path }}" - state: directory - mode: 0777 - loop: "{{ smb_shares }}" - notify: set samba passwords - - - name: template share configuration - become: yes - ansible.builtin.template: - src: smb.conf.j2 - dest: /etc/samba/smb.conf - validate: 'testparm -s %s' - with_items: - - "{{ smb_shares }}" - notify: - - restart smbd - - set samba passwords diff --git a/roles/mgrote.fileserver_smb/tasks/users.yml b/roles/mgrote.fileserver_smb/tasks/users.yml deleted file mode 100644 index d20d81af..00000000 --- a/roles/mgrote.fileserver_smb/tasks/users.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - - name: ensure group exist - become: yes - ansible.builtin.group: - name: smb_users - state: present - - - name: configure linux-users - become: yes - ansible.builtin.user: - name: "{{ item.name }}" - group: smb_users - state: "{{ item.state | default('present') }}" - remove: "{{ item.remove_dir | default('false') }}" - create_home: no - loop: "{{ smb_users }}" - no_log: True - notify: set samba passwords diff --git a/roles/mgrote.fluxcd/defaults/main.yml b/roles/mgrote.fluxcd/defaults/main.yml deleted file mode 100644 index 98110d90..00000000 --- a/roles/mgrote.fluxcd/defaults/main.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - flux_repo_host: gitea.grote.lan - flux_repo_host_port: 2222 - flux_repo_branch: master - flux_repo_url_complete: "ssh://gitea@{{ flux_repo_host }}:{{ flux_repo_host_port }}/mg/manifests.git" - flux_install_host: k3s1.grote.lan - flux_homedir: /home/flux - flux_path_ssh_dir: /home/flux/.ssh - flux_user_group: flux - flux_user: flux - flux_download_url: https://github.com/fluxcd/flux2/releases/download/v0.35.0/flux_0.35.0_linux_amd64.tar.gz - flux_path_bin: /usr/local/sbin - flux_path_ssh_id_file: id_rsa - flux_ssh_key_format: ed25519 - kubeconfig: /etc/rancher/k3s/k3s.yaml - flux_sync_interval: 1m diff --git a/roles/mgrote.fluxcd/tasks/main.yml b/roles/mgrote.fluxcd/tasks/main.yml deleted file mode 100644 index 1a7c09e2..00000000 --- a/roles/mgrote.fluxcd/tasks/main.yml +++ /dev/null @@ -1,95 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: check if flux is installed - command: which flux - changed_when: false - failed_when: flux_installed.rc not in [0,1] - register: flux_installed - - - name: download flux binary - ansible.builtin.unarchive: - src: "{{ flux_download_url }}" - dest: "{{ flux_path_bin }}" - mode: 0755 - owner: "{{ flux_user }}" - group: "{{ flux_user_group }}" - remote_src: yes - creates: "{{ flux_path_bin }}/flux" - when: flux_installed.rc not in [ 0 ] - - - name: install bash-completion packages - become: yes - ansible.builtin.package: - name: bash-completion - state: present - - - name: activate autocompletion for flux - become: yes - ansible.builtin.shell: - cmd: "flux completion bash | sudo tee /etc/bash_completion.d/flux" - args: - creates: /etc/bash_completion.d/flux - - - name: install flux - block: - - name: ensure .ssh directory exists - ansible.builtin.file: - path: "{{ flux_path_ssh_dir }}" - owner: "{{ flux_user }}" - group: "{{ flux_user_group }}" - state: directory - - - name: check if OpenSSH keypair exists - stat: - path: "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}" - register: ssh_exist - - - name: generate SSH keypair - community.crypto.openssh_keypair: - path: "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}" - owner: "{{ flux_user }}" - group: "{{ flux_user_group }}" - type: "{{ flux_ssh_key_format }}" - when: ssh_exist.stat.exists == False - register: create_ssh_key - - - name: get publickey - ansible.builtin.command: cat "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}.pub" - when: create_ssh_key.changed - register: ssh_public_key - - - name: show publickey - debug: - msg: "{{ ssh_public_key.stdout }}" - when: create_ssh_key.changed - - - name: copy publickey to gitea as deploy-key WITH write-permissions! - ansible.builtin.pause: - prompt: "Make sure the key is saved!" - when: create_ssh_key.changed - - - name: set permissions for $kubeconfig - ansible.builtin.file: - path: "{{ kubeconfig }}" - owner: root - group: root - mode: '0644' - - - name: template bootstrap script - ansible.builtin.template: - src: bootstrap.sh - dest: "{{ flux_homedir }}/bootstrap.sh" - mode: 0544 - owner: "{{ flux_user }}" - group: "{{ flux_user_group }}" - register: bootstrap - - - name: flux install - ansible.builtin.shell: "{{ flux_homedir }}/bootstrap.sh" - become_user: "{{ flux_user }}" - when: bootstrap.changed - # der ganze block nur auf einem host - run_once: true - when: ansible_host == flux_install_host diff --git a/roles/mgrote.fluxcd/tasks/user.yml b/roles/mgrote.fluxcd/tasks/user.yml deleted file mode 100644 index 83c47487..00000000 --- a/roles/mgrote.fluxcd/tasks/user.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ flux_user_group }}" - state: present - when: - - flux_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ flux_user }}" - group: "{{ flux_user_group }}" - create_home: no - when: - - flux_user_group is defined - - flux_user is defined diff --git a/roles/mgrote.fwupd_settings/defaults/main.yml b/roles/mgrote.fwupd_settings/defaults/main.yml deleted file mode 100644 index 3ee85da2..00000000 --- a/roles/mgrote.fwupd_settings/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - fwupd_dynamic_user: false diff --git a/roles/mgrote.fwupd_settings/handlers/main.yml b/roles/mgrote.fwupd_settings/handlers/main.yml deleted file mode 100644 index 4d2e5c5f..00000000 --- a/roles/mgrote.fwupd_settings/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - state: restarted - daemon_reload: yes - name: fwupd-refresh.service diff --git a/roles/mgrote.fwupd_settings/tasks/main.yml b/roles/mgrote.fwupd_settings/tasks/main.yml deleted file mode 100644 index a43c5467..00000000 --- a/roles/mgrote.fwupd_settings/tasks/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - - name: gather service facts - service_facts: - - - name: set DynamicUser=no - ansible.builtin.blockinfile: - path: /etc/systemd/system/fwupd-refresh.service.d/override.conf - block: | - [Service] - DynamicUser=no - create: yes - when: - - "not fwupd_dynamic_user and 'fwupd-refresh.service' in services" - notify: systemctl daemon-reload diff --git a/roles/mgrote.i3/tasks/main.yml b/roles/mgrote.i3/tasks/main.yml deleted file mode 100644 index ad771e9a..00000000 --- a/roles/mgrote.i3/tasks/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - i3 - - i3lock - - arandr - - x11-xserver-utils # xrandr - - feh # wallpaper - - rofi - - xautolock #bildschirmsperre nach x min - - flameshot #screenshots - - dunst #notification daemon - state: present diff --git a/roles/mgrote.k8s_autocompletion/tasks/main.yml b/roles/mgrote.k8s_autocompletion/tasks/main.yml deleted file mode 100644 index 1502f9f5..00000000 --- a/roles/mgrote.k8s_autocompletion/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - - name: install bash-completion packages - become: yes - ansible.builtin.package: - name: bash-completion - state: present - - - name: activate autocompletion for kubectl - become: yes - ansible.builtin.shell: - cmd: "kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl" - args: - creates: /etc/bash_completion.d/kubectl diff --git a/roles/mgrote.k8s_misc/tasks/main.yml b/roles/mgrote.k8s_misc/tasks/main.yml deleted file mode 100644 index 9393cade..00000000 --- a/roles/mgrote.k8s_misc/tasks/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: set $KUBECONFIG for root - ansible.builtin.blockinfile: - path: /root/.bashrc - block: | - export KUBECONFIG=/etc/rancher/k3s/k3s.yaml - marker: "# {mark} ANSIBLE MANAGED BLOCK - K3S" diff --git a/roles/mgrote.minio/defaults/main.yml b/roles/mgrote.minio/defaults/main.yml deleted file mode 100644 index eb80b63f..00000000 --- a/roles/mgrote.minio/defaults/main.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- - minio_download_url: https://dl.min.io/server/minio/release/linux-amd64/minio # downloadlink - - minio_bin_path: /usr/local/bin # where to put the binary - minio_volumes_base_dir: /usr/local/share/minio/ # where to store the buckets - minio_config_dir: /etc/minio # where to store the config - - minio_fqdn: minio-test.grote.lan - minio_port: 9000 # s3 port - minio_console_port: 34081 # mgmt-gui port - - minio_root_user: minio # default web user - minio_root_password: miniostorage # defaut pass - - minio_user: minio-user # linux user - minio_group: minio-user # linux group - - minio_server_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html - - minio_browser_redirect_url: "" # see https://docs.min.io/minio/baremetal/reference/minio-server/minio-server.html diff --git a/roles/mgrote.minio/handlers/main.yml b/roles/mgrote.minio/handlers/main.yml deleted file mode 100644 index 7a274555..00000000 --- a/roles/mgrote.minio/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: (re)start service - become: yes - ansible.builtin.systemd: - name: minio - state: restarted diff --git a/roles/mgrote.minio/tasks/main.yml b/roles/mgrote.minio/tasks/main.yml deleted file mode 100644 index 22674944..00000000 --- a/roles/mgrote.minio/tasks/main.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- - - name: ensure group exists - ansible.builtin.group: - name: "{{ minio_group }}" - state: present - - - name: ensure user exists - ansible.builtin.user: - name: "{{ minio_user }}" - group: "{{ minio_group }}" - shell: /sbin/nologin - state: present - create_home: no - - - name: ensure needed directories are present - file: - path: "{{ item }}" - state: directory - owner: "{{ minio_user }}" - group: "{{ minio_user }}" - with_items: - - "{{ minio_volumes_base_dir }}" - - "{{ minio_config_dir }}" - - - name: download binary - get_url: - url: "{{ minio_download_url }}" - dest: "{{ minio_bin_path }}/minio" - mode: 0744 - owner: "{{ minio_user }}" - group: "{{ minio_user }}" - - - name: template default config - become: yes - ansible.builtin.template: - src: "default.j2" - dest: "/etc/default/minio" - owner: "{{ minio_user }}" - group: "{{ minio_user }}" - notify: (re)start service - no_log: true - - - name: template systemd-unit - become: yes - ansible.builtin.template: - src: "minio.service.j2" - dest: "/etc/systemd/system/minio.service" - mode: a+x - owner: "{{ minio_user }}" - group: "{{ minio_user }}" - notify: (re)start service - - - name: systemd daemon reload - become: yes - ansible.builtin.systemd: - daemon_reload: true - - - name: enable systemd service - become: yes - ansible.builtin.systemd: - name: minio - enabled: true diff --git a/roles/mgrote.motd/defaults/main.yml b/roles/mgrote.motd/defaults/main.yml deleted file mode 100644 index 34204f27..00000000 --- a/roles/mgrote.motd/defaults/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - motd_wetter_ort: "Magdeburg" - motd_wetter_aktiv: false - motd_fortune_aktiv: false - - managed_files: - - 00-ansible - - 05-fortune - - 10-wetter - - 20-facts - - 90-updates - - 91-reboot diff --git a/roles/mgrote.motd/handlers/main.yml b/roles/mgrote.motd/handlers/main.yml deleted file mode 100644 index c3eb3398..00000000 --- a/roles/mgrote.motd/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: restart_sshd - become: yes - systemd: - name: sshd - state: restarted diff --git a/roles/mgrote.motd/tasks/base.yml b/roles/mgrote.motd/tasks/base.yml deleted file mode 100644 index a0429a0e..00000000 --- a/roles/mgrote.motd/tasks/base.yml +++ /dev/null @@ -1,70 +0,0 @@ ---- -# - name: install packages -# become: yes -# ansible.builtin.package: -# name: -# - update-motd -# state: present -# when: "ansible_facts['distribution'] == 'Ubuntu'" - - - name: remove default packages - become: yes - ansible.builtin.package: - name: - - motd-news-config - state: absent - - - name: 'remove unwanted motd messages' - become: yes - ansible.builtin.file: - path: '/etc/update-motd.d/{{ item }}' - state: absent - with_items: - - 00-header - - 10-help-text - - 10-uname - - 50-motd-news - - 80-livepatch - - 50-landscape-sysinfo - - 51-cloudguest - - 99-esm - - 00-ansible - - 20-facts - - 90-updates - - 91-reboot - - 90-updates-available - - 91-release-upgrade - - - name: delete "no warranty" - Message - become: yes - ansible.builtin.file: - path: /etc/motd - state: absent - - - name: setup new motd - become: yes - ansible.builtin.template: - src: '{{ item }}' - dest: '/etc/update-motd.d/{{ item }}' - owner: root - group: root - mode: '755' - with_items: - - 00-ansible-mgrote - - 20-facts-mgrote - - 90-updates-mgrote - - 91-reboot-mgrote - - - name: delete fortune - become: yes - ansible.builtin.file: - path: /etc/update-motd.d/05-fortune-mgrote - state: absent - when: not motd_fortune_aktiv - - - name: delete Wetter - become: yes - ansible.builtin.file: - path: '/etc/update-motd.d/10-wetter-mgrote' - state: absent - when: not motd_wetter_aktiv diff --git a/roles/mgrote.motd/tasks/fortune.yml b/roles/mgrote.motd/tasks/fortune.yml deleted file mode 100644 index 3547f27b..00000000 --- a/roles/mgrote.motd/tasks/fortune.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - - name: install fortune - become: yes - ansible.builtin.package: - name: - - fortune - state: present - - - name: setup new motd - fortune - become: yes - ansible.builtin.template: - src: '05-fortune-mgrote' - dest: '/etc/update-motd.d/05-fortune-mgrote' - owner: root - group: root - mode: '755' diff --git a/roles/mgrote.motd/tasks/main.yml b/roles/mgrote.motd/tasks/main.yml deleted file mode 100644 index 493099ef..00000000 --- a/roles/mgrote.motd/tasks/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: include systemctl tasks - include_tasks: systemctl.yml - - - name: include base tasks - include_tasks: base.yml - - name: include fortune tasks - include_tasks: fortune.yml - when: - - motd_wetter_aktiv - - - name: include weather tasks - include_tasks: weather.yml - when: - - motd_wetter_aktiv diff --git a/roles/mgrote.motd/tasks/systemctl.yml b/roles/mgrote.motd/tasks/systemctl.yml deleted file mode 100644 index 36727804..00000000 --- a/roles/mgrote.motd/tasks/systemctl.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - - name: stop units - become: yes - ansible.builtin.systemd: - name: motd-news - masked: yes - state: stopped - enabled: no - daemon_reload: yes - ignore_errors: true diff --git a/roles/mgrote.motd/tasks/weather.yml b/roles/mgrote.motd/tasks/weather.yml deleted file mode 100644 index eea72ea6..00000000 --- a/roles/mgrote.motd/tasks/weather.yml +++ /dev/null @@ -1,8 +0,0 @@ - - name: setup new motd - wetter - become: yes - ansible.builtin.template: - src: '10-wetter-mgrote' - dest: '/etc/update-motd.d/10-wetter-mgrote' - owner: root - group: root - mode: '755' diff --git a/roles/mgrote.mount_cifs/defaults/main.yml b/roles/mgrote.mount_cifs/defaults/main.yml deleted file mode 100644 index 1acff73b..00000000 --- a/roles/mgrote.mount_cifs/defaults/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - cifs_mounts: - - name: pve_backup_mount_fileserver3 - type: cifs - state: absent - dest: /pve_backup_mount - src: //fileserver3.grote.lan/proxmox - user: pve - password: XXXXXXXXXXXXXXX - domain: grote.lan - uid: 1000 - gid: 1000 diff --git a/roles/mgrote.mount_cifs/handlers/main.yml b/roles/mgrote.mount_cifs/handlers/main.yml deleted file mode 100644 index 1ac62ba0..00000000 --- a/roles/mgrote.mount_cifs/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: reboot - become: true - reboot: - reboot_timeout: 120 diff --git a/roles/mgrote.mount_cifs/meta/main.yml b/roles/mgrote.mount_cifs/meta/main.yml deleted file mode 100644 index 083a97f6..00000000 --- a/roles/mgrote.mount_cifs/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - collections: - - ansible.posix diff --git a/roles/mgrote.mount_cifs/tasks/main.yml b/roles/mgrote.mount_cifs/tasks/main.yml deleted file mode 100644 index 4146d161..00000000 --- a/roles/mgrote.mount_cifs/tasks/main.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- - - name: install cifs-utils - become: yes - ansible.builtin.package: - name: cifs-utils - state: present - - - name: create mount directory - become: yes - ansible.builtin.file: - path: "{{ item.dest }}" - state: directory - mode: 0777 - loop: "{{ cifs_mounts }}" - no_log: true - - - name: create credential-file - become: yes - ansible.builtin.template: - src: smb_passwords - dest: /root/.smb_passwords_{{ item.name }} - owner: root - group: root - mode: '0400' - loop: "{{ cifs_mounts }}" - no_log: true - - - name: mount cifs volumes - become: yes - ansible.posix.mount: - src: "{{ item.src }}" - path: "{{ item.dest }}" - opts: credentials=/root/.smb_passwords_{{ item.name }},domain={{ item.domain }},uid={{ item.uid | default('1000') }},gid={{ item.gid | default('1000') }}" - state: "{{ item.state }}" - fstype: "{{ item.type }}" - backup: yes - dump: "0" - passno: "0" - loop: "{{ cifs_mounts }}" - no_log: true - notify: reboot diff --git a/roles/mgrote.munin-node/defaults/main.yml b/roles/mgrote.munin-node/defaults/main.yml deleted file mode 100644 index 2723ad8e..00000000 --- a/roles/mgrote.munin-node/defaults/main.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- - munin_user_group: root # group to which the user belongs - munin_node_log: /var/log/munin/munin-node.log - munin_node_pid: /var/run/munin/munin-node.pid - munin_node_plugin_timeout: 60 # in sec - munin_node_global_timeout: 900 # in sec - munin_node_host_name: '' # Set this if the client doesn't report the correct hostname - munin_node_allowed_ips: # A list of addresses that are allowed to connect Munin requires IPs be added as regular expressions. - - '^127\.0\.0\.1$' - - '^::1$' - munin_node_allowed_cidrs: [192.168.2.0/24] # A list of addresses that are allowed to connect - munin_node_denied_cidrs: [] # a list of addresses that are not allowed to connect - munin_node_bind_host: "0.0.0.0" # bind to interface - munin_node_bind_port: "4949" # bind to port - munin_node_log_level: 4 # Loglevel - - # Plugin configuration options (the key is the plugin heading, items within will - # be options for the plugin). - # Source and destination of munin plugins. - munin_plugin_src_path: /usr/share/munin/plugins/ - munin_plugin_dest_path: /etc/munin/plugins/ - munin_plugin_conf_dest_path: /etc/munin/plugin-conf.d/ -# munin_node_plugins: #plugins to install -# - name: docker_volumes # name -# src: https://git.mgrote.net/mg/mirror-munin-contrib/raw/branch/master/plugins/docker/docker_ #src -# config_file_name: /etc/munin/plugin-conf.d/docker # where to put plugin config - # content of config -# config: | -# user root -# env.DOCKER_HOST unix://run/docker.sock - -# munin_node_disabled_plugins: # remove plugins from running config -# - name: meminfo diff --git a/roles/mgrote.munin-node/handlers/main.yml b/roles/mgrote.munin-node/handlers/main.yml deleted file mode 100644 index 0b7f394e..00000000 --- a/roles/mgrote.munin-node/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- name: restart munin-node - service: - name: munin-node - state: restarted diff --git a/roles/mgrote.munin-node/tasks/additional.yml b/roles/mgrote.munin-node/tasks/additional.yml deleted file mode 100644 index de6ae4b5..00000000 --- a/roles/mgrote.munin-node/tasks/additional.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- - - name: download additional plugins - get_url: - url: "{{ item.src }}" - dest: "{{ munin_plugin_src_path }}{{ item.name }}" - mode: '0755' - loop: "{{ munin_node_plugins }}" - notify: restart munin-node - no_log: true - check_mode: no # damit werden auch im check-mode die Plugins heruntergeladen, sonst schlägt der nächste Task fehl - - - name: enable additional plugins - file: - src: "{{ munin_plugin_src_path }}{{ item.name }}" - dest: "{{ munin_plugin_dest_path }}{{ item.name }}" - state: link - notify: restart munin-node - loop: "{{ munin_node_plugins }}" - no_log: true - - - name: copy additional plugin-config - copy: - content: "{{ item.config }}" - dest: "{{ munin_plugin_conf_dest_path }}{{ item.name }}" - notify: restart munin-node - loop: "{{ munin_node_plugins }}" - when: item.config is defined - no_log: true - - - name: Ensure munin-node is running. - service: - name: munin-node - state: started - enabled: yes diff --git a/roles/mgrote.munin-node/tasks/install.yml b/roles/mgrote.munin-node/tasks/install.yml deleted file mode 100644 index 0efd0fa0..00000000 --- a/roles/mgrote.munin-node/tasks/install.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- - - name: install packages - apt: - name: munin-node - state: present - register: install - - - name: create directories - file: - path: "{{ item }}" - state: directory - loop: - - /etc/munin - - /etc/munin/plugin-conf.d - - /etc/munin/plugins - - - name: Copy munin-node configuration. - template: - src: munin-node.conf.j2 - dest: /etc/munin/munin-node.conf - owner: root - group: root - mode: 0644 - notify: restart munin-node - - - name: munin-node-configure --shell - ansible.builtin.shell: munin-node-configure --shell - register: output_conf - changed_when: "output_conf.rc != 0" - ignore_errors: yes # ignoriere fehler - when: install.changed - - - name: munin-node-configure --shell - 2 - ansible.builtin.shell: munin-node-configure --shell --families=contrib,auto | sh -x - ignore_errors: yes # ignoriere fehler - when: install.changed diff --git a/roles/mgrote.munin-node/tasks/main.yml b/roles/mgrote.munin-node/tasks/main.yml deleted file mode 100644 index b8074b34..00000000 --- a/roles/mgrote.munin-node/tasks/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - - name: include install-tasks - include_tasks: install.yml - - name: include user tasks - include_tasks: user.yml - - name: include plugin-tasks - include_tasks: additional.yml - when: munin_node_plugins is defined - - name: include remove-tasks - include_tasks: remove.yml - when: munin_node_disabled_plugins is defined diff --git a/roles/mgrote.munin-node/tasks/remove.yml b/roles/mgrote.munin-node/tasks/remove.yml deleted file mode 100644 index 356a1ce0..00000000 --- a/roles/mgrote.munin-node/tasks/remove.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - - name: remove unwanted plugins - file: - path: "{{ munin_plugin_dest_path }}{{ item.name }}" - state: absent - loop: "{{ munin_node_disabled_plugins }}" - notify: restart munin-node - when: munin_node_disabled_plugins is defined - - - name: remove additional plugin-config - file: - state: absent - dest: "{{ munin_plugin_conf_dest_path }}{{ item.name }}" - notify: restart munin-node - loop: "{{ munin_node_disabled_plugins }}" - when: munin_node_disabled_plugins is defined diff --git a/roles/mgrote.munin-node/tasks/user.yml b/roles/mgrote.munin-node/tasks/user.yml deleted file mode 100644 index e6b41fce..00000000 --- a/roles/mgrote.munin-node/tasks/user.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ munin_user_group }}" - state: present - - - name: ensure user exists - become: true - ansible.builtin.user: - name: munin - group: "{{ munin_user_group }}" - shell: /usr/sbin/nologin - create_home: no - - - name: add user to sudoers - become: true - ansible.builtin.blockinfile: - path: /etc/sudoers - state: present - block: | - munin ALL=(ALL) NOPASSWD:ALL - validate: '/usr/sbin/visudo -cf %s' - backup: yes - marker_begin: munin-sudoers BEGIN - marker_end: munin-sudoers END diff --git a/roles/mgrote.ntp_chrony_client/defaults/main.yml b/roles/mgrote.ntp_chrony_client/defaults/main.yml deleted file mode 100644 index 77b7c1c0..00000000 --- a/roles/mgrote.ntp_chrony_client/defaults/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- - ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet - ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile - ntp_chrony_servers: # welche Server sollen befragt werden - - address: ptbtime1.ptb.de - options: iburst #optionaler parameter - ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_logging: false diff --git a/roles/mgrote.ntp_chrony_client/handlers/main.yml b/roles/mgrote.ntp_chrony_client/handlers/main.yml deleted file mode 100644 index 89bbb0db..00000000 --- a/roles/mgrote.ntp_chrony_client/handlers/main.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - - name: restart_chrony - become: yes - systemd: - name: chrony - enabled: yes - masked: false - state: restarted diff --git a/roles/mgrote.ntp_chrony_client/tasks/main.yml b/roles/mgrote.ntp_chrony_client/tasks/main.yml deleted file mode 100644 index 76aa6763..00000000 --- a/roles/mgrote.ntp_chrony_client/tasks/main.yml +++ /dev/null @@ -1,67 +0,0 @@ ---- - - name: Check systemd-timesyncd status - become: true - shell: systemctl is-active --quiet systemd-timesyncd && echo "Active" || echo "Inactive" - register: timesyncd_status - changed_when: false - - - name: Disable systemd-timesyncd - become: true - ansible.builtin.systemd: - name: systemd-timesyncd - masked: yes - state: stopped - when: timesyncd_status.stdout == "Active" - - - name: gather package facts - become: yes - ansible.builtin.package_facts: - manager: auto - - - name: stop and mask ntp service - become: yes - systemd: - name: ntp - masked: yes - state: stopped - when: "'ntp' in ansible_facts.packages" - - - name: install chrony packages - become: yes - ansible.builtin.package: - name: - - chrony - state: present - notify: restart_chrony - - - name: copy chrony config - become: yes - ansible.builtin.template: - src: chrony.conf.j2 - dest: /etc/chrony/chrony.conf - mode: 0755 - notify: restart_chrony - - - name: copy logrotate config - become: yes - ansible.builtin.template: - src: logrotate_chrony - dest: /etc/logrotate.d/chrony - owner: root - group: root - mode: 0644 - - - name: Create chrony driftfile folder - become: yes - file: - state: directory - path: "{{ ntp_chrony_driftfile_directory }}" - mode: 0755 - owner: "{{ ntp_chrony_user }}" - group: "{{ ntp_chrony_group }}" - notify: restart_chrony - - - name: set timezone to {{ ntp_chrony_timezone }} - become: yes - community.general.timezone: - name: "{{ ntp_chrony_timezone }}" diff --git a/roles/mgrote.ntp_chrony_server/defaults/main.yml b/roles/mgrote.ntp_chrony_server/defaults/main.yml deleted file mode 100644 index b443e1d9..00000000 --- a/roles/mgrote.ntp_chrony_server/defaults/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet - ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile - ntp_chrony_servers: # welche Server sollen befragt werden - - address: ptbtime1.ptb.de - options: iburst #optionaler parameter - - address: ptbtime2.ptb.de - options: iburst - - address: ptbtime3.ptb.de - options: iburst - - address: time3.google.com - options: iburst - - address: ntp0.fau.de - options: iburst - ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst - ntp_chrony_logging: false # logging an/aus - ntp_chrony_subnet_allow: 192.168.2.0/24 # welche Netze dürfen den Server befragen diff --git a/roles/mgrote.ntp_chrony_server/handlers/main.yml b/roles/mgrote.ntp_chrony_server/handlers/main.yml deleted file mode 100644 index b0edc26f..00000000 --- a/roles/mgrote.ntp_chrony_server/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart_chrony - become: yes - systemd: - name: chrony - enabled: yes - state: restarted diff --git a/roles/mgrote.ntp_chrony_server/tasks/main.yml b/roles/mgrote.ntp_chrony_server/tasks/main.yml deleted file mode 100644 index 1c5420ca..00000000 --- a/roles/mgrote.ntp_chrony_server/tasks/main.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- - - name: mask systemd-timesyncd service - become: yes - systemd: - name: systemd-timesyncd - state: stopped - masked: yes - - - name: gather package facts - become: yes - ansible.builtin.package_facts: - manager: auto - - - name: stop and mask ntp service - become: yes - systemd: - name: ntp - masked: yes - state: stopped - when: "'ntp' in ansible_facts.packages" - - - name: install chrony packages - become: yes - ansible.builtin.package: - name: - - chrony - state: present - notify: restart_chrony - - - name: copy chrony config - become: yes - ansible.builtin.template: - src: chrony.conf.j2 - dest: /etc/chrony/chrony.conf - mode: 0755 - notify: restart_chrony - - - name: copy logrotate config - become: yes - ansible.builtin.template: - src: logrotate_chrony - dest: /etc/logrotate.d/chrony - owner: root - group: root - mode: 0644 - - name: Create chrony driftfile folder - become: yes - file: - state: directory - path: "{{ ntp_chrony_driftfile_directory }}" - mode: 0755 - owner: "{{ ntp_chrony_user }}" - group: "{{ ntp_chrony_group }}" - notify: restart_chrony - - - name: set timezone to {{ ntp_chrony_timezone }} - become: yes - community.general.timezone: - name: "{{ ntp_chrony_timezone }}" diff --git a/roles/mgrote.pbs_datastores/tasks/main.yml b/roles/mgrote.pbs_datastores/tasks/main.yml deleted file mode 100644 index 6136fbdc..00000000 --- a/roles/mgrote.pbs_datastores/tasks/main.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- - - name: check if datastores exist - become: yes - ansible.builtin.command: "proxmox-backup-manager datastore list --output-format json" - register: datastores - changed_when: false - - - name: ensure datastores exist - become: yes - ansible.builtin.command: "proxmox-backup-manager datastore create {{ item.name }} {{ item.path }}" - loop: "{{ pbs_datastores }}" - when: "item.name not in datastores.stdout" - - - name: ensure datastores are configured - become: yes - ansible.builtin.template: - src: datastores.j2 - dest: /etc/proxmox-backup/datastore.cfg - owner: root - group: backup - mode: "640" - backup: yes - - - name: ensure prune-jobs are configured - become: yes - ansible.builtin.template: - src: prune-jobs.j2 - dest: /etc/proxmox-backup/prune.cfg - owner: root - group: backup - mode: "640" - backup: yes - - - name: ensure permissions are configured - become: yes - ansible.builtin.template: - src: permissions.j2 - dest: /etc/proxmox-backup/acl.cfg - owner: root - group: backup - mode: "640" - backup: yes diff --git a/roles/mgrote.pbs_pve_integration/tasks/main.yml b/roles/mgrote.pbs_pve_integration/tasks/main.yml deleted file mode 100644 index 0425807e..00000000 --- a/roles/mgrote.pbs_pve_integration/tasks/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: check which storages exist - become: yes - ansible.builtin.shell: "pvesm status | awk '{ print $1}'" - register: storages - changed_when: false - - - name: ensure datastore exist - become: yes - ansible.builtin.command: "pvesm add pbs {{ item.name }} --server {{ item.server }} --datastore {{ item.datastore }} --username {{ item.username }} --password {{ item.password }} --fingerprint {{ item.fingerprint }}" - loop: "{{ pve_pbs_datastore }}" - when: "item.name not in storages.stdout" - - - name: ensure datastore is configured - become: yes - ansible.builtin.command: "pvesm set {{ item.name }} --username {{ item.username }} --password {{ item.password }}" - loop: "{{ pve_pbs_datastore }}" - when: "item.name in storages.stdout" - changed_when: false diff --git a/roles/mgrote.pbs_users/tasks/main.yml b/roles/mgrote.pbs_users/tasks/main.yml deleted file mode 100644 index a03788ae..00000000 --- a/roles/mgrote.pbs_users/tasks/main.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- - - name: check which users exist - become: yes - ansible.builtin.command: "proxmox-backup-manager user list --output-format json" - register: users - changed_when: false - - - name: ensure users exist - become: yes - ansible.builtin.command: "proxmox-backup-manager user create {{ item.name }}@{{ item.realm }}" - loop: "{{ pbs_users }}" - when: "item.name not in users.stdout" - - - name: check again which users exist - become: yes - ansible.builtin.command: "proxmox-backup-manager user list --output-format json" - register: users - changed_when: false - - - name: ensure user password - become: yes - ansible.builtin.command: "proxmox-backup-manager user update {{ item.name }}@{{ item.realm }} --password {{ item.password }} --expire 0" - loop: "{{ pbs_users }}" - when: "item.name in users.stdout" - changed_when: false - no_log: true diff --git a/roles/mgrote.polybar/defaults/main.yml b/roles/mgrote.polybar/defaults/main.yml deleted file mode 100644 index 7c48ef1b..00000000 --- a/roles/mgrote.polybar/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - polybar_siji_repo: https://github.com/stark/siji - polybar_siji_local: /home/mg/siji - polybar_siji_fonts_dir: /home/mg/.fonts diff --git a/roles/mgrote.polybar/tasks/main.yml b/roles/mgrote.polybar/tasks/main.yml deleted file mode 100644 index abeb740a..00000000 --- a/roles/mgrote.polybar/tasks/main.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - polybar - - lm-sensors - - brightnessctl - - inotify-tools - - yad # polybar popup-calendar - - xdotool # polybar popup-calendar - - wmctrl # für polybar windows-list # https://github.com/aroma1994/polybar-windows - state: present - - - name: checkout siji font - become: true - ansible.builtin.git: - repo: "{{ polybar_siji_repo }}" - dest: "{{ polybar_siji_local }}" - register: gitcheckout - - - name: create siji dir - become: true - ansible.builtin.file: - path: - - "{{ polybar_siji_fonts_dir }}" - state: directory - - - name: install siji-font - become: true - ansible.builtin.shell: "{{ polybar_siji_local }}/install.sh -d {{ polybar_siji_fonts_dir }}" - args: - chdir: "{{ polybar_siji_local }}" - creates: /home/mg/.fonts - when: gitcheckout.changed - - - name: remove bitmap-file - become: true - ansible.builtin.file: - path: /etc/fonts/conf.d/70-no-bitmaps.conf - state: absent - when: gitcheckout.changed - - - name: update fc-cache - become: true - ansible.builtin.shell: fc-cache - when: gitcheckout.changed diff --git a/roles/mgrote.postfix/defaults/main.yml b/roles/mgrote.postfix/defaults/main.yml deleted file mode 100644 index 01f79efd..00000000 --- a/roles/mgrote.postfix/defaults/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - postfix_mail_nach_cronjob: false - postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24" - postfix_smtp_server: smtp.strato.de - postfix_smtp_server_port: 587 - postfix_absender_mailadresse: info@mgrote.net - postfix_absender_passwort: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" - postfix_smtp_use_tls: "yes" - postfix_smtp_sasl_auth_enable: "yes" - postfix_smtp_tls_session_cache_timeout: 3600s - postfix_inet_protocols: ipv4 - postfix_append_dot_mydomain: "no" diff --git a/roles/mgrote.postfix/handlers/main.yml b/roles/mgrote.postfix/handlers/main.yml deleted file mode 100644 index 486e53a6..00000000 --- a/roles/mgrote.postfix/handlers/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: hash_sasl_passwd - become: yes - command: /usr/sbin/postmap hash:/etc/postfix/sasl_passwd - - - name: hash_sender_canonical - become: yes - command: /usr/sbin/postmap hash:/etc/postfix/sender_canonical - - - name: postfix_reload - become: yes - systemd: - name: postfix - enabled: yes - state: restarted - notify: postfix_testmail - - - name: postfix_testmail - shell: echo "postfix ist eingerichtet" | mail -s "{{ ansible_hostname }} - postfix" {{ empfaenger_mail }} diff --git a/roles/mgrote.postfix/tasks/main.yml b/roles/mgrote.postfix/tasks/main.yml deleted file mode 100644 index 2c88cabc..00000000 --- a/roles/mgrote.postfix/tasks/main.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- - ### postfix fuer gmail; http://dokuwiki2.grote.lan/artikel/technik/postfix_mit_gmail_fuer_benachrichtigungen_einrichten - - name: postfix + Hilfsprogramme installieren - become: yes - ansible.builtin.package: - name: - - postfix - - mailutils - - libsasl2-modules - state: present - - - name: kopiere sasl_passwd - become: yes - ansible.builtin.template: - src: sasl_passwd - dest: /etc/postfix/sasl_passwd - force: yes - notify: - - hash_sasl_passwd - - postfix_testmail - - - name: kopiere sender_canonical - become: yes - ansible.builtin.template: - src: sender_canonical - dest: /etc/postfix/sender_canonical - notify: - - hash_sender_canonical - - postfix_reload - - postfix_testmail - - - name: kopiere postfix_main.cf - become: yes - ansible.builtin.template: - src: main.cf - dest: /etc/postfix/main.cf - notify: - - postfix_reload - - postfix_testmail - - - name: Mail Cronjob - Anlegen - become: yes - when: postfix_mail_nach_cronjob # ohne parameter wird auf true geprueft https://www.buildahomelab.com/2018/11/12/using-ansible-when-statements/ - ansible.builtin.cron: - name: MAILTO - env: yes - job: "{{ empfaenger_mail }}" - notify: - - postfix_testmail - - - name: Mail Cronjob - Entfernen - become: yes - when: not postfix_mail_nach_cronjob - ansible.builtin.cron: - name: MAILTO - env: yes - job: "" diff --git a/roles/mgrote.proxmox_bind_mounts/defaults/main.yml b/roles/mgrote.proxmox_bind_mounts/defaults/main.yml deleted file mode 100644 index 8550860a..00000000 --- a/roles/mgrote.proxmox_bind_mounts/defaults/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - lists_merged: # Liste muss leer existieren damit sie "germerged" werden kann, für Liste welche VMs zu rebooten sind - - '' diff --git a/roles/mgrote.proxmox_bind_mounts/handlers/main.yml b/roles/mgrote.proxmox_bind_mounts/handlers/main.yml deleted file mode 100644 index f2cac94a..00000000 --- a/roles/mgrote.proxmox_bind_mounts/handlers/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - - name: restart lxc - become: true - command: "pct reboot {{ item }}" - failed_when: false - loop: "{{ lists_merged | unique }}" - # reboote den lxc wenn: - # - er in der Liste "Lists merged" vorhanden ist - # unique Filter sorgt dafür das es keine doppelten Elemente gibt - # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters - # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote.proxmox_bind_mounts/tasks/bm.yml b/roles/mgrote.proxmox_bind_mounts/tasks/bm.yml deleted file mode 100644 index 8fb403bb..00000000 --- a/roles/mgrote.proxmox_bind_mounts/tasks/bm.yml +++ /dev/null @@ -1,46 +0,0 @@ ---- - - name: read config - become: true - shell: "pct config {{ item.vmid }} | grep \"mp{{ item.mp_nr }}: {{ item.mp_path_host }},mp={{ item.mp_path_guest }}\"" - register: config - changed_when: false - failed_when: false - # prüfe ob bind mount schon vorhanden ist - # exit-code wird unten geprüft - -# - name: debug config -# ansible.builtin.debug: -# msg: "{{ config }}" - - - name: add bind mounts to container - become: true - command: "pct set {{ item.vmid }} -mp{{ item.mp_nr }} {{ item.mp_path_host }},mp={{ item.mp_path_guest }}" - register: restart - notify: restart lxc - # füge bind-mount hinzu falls er fehlt, also rc ungleich 0 - # pro bind-mount - when: - - not ansible_check_mode - - not config.rc == 0 - # überspringe wenn in check-mode - - # schreibe vm id in die Liste "reboot" - - name: set reboot list - set_fact: - reboot: - - "{{ item.vmid }}" - when: restart.changed - - # Füge die leere Liste "lists_merged" aus den defaults, mit der Liste "reboot" zusammen. Nur wenn auch etwas geändert wurde, daher "when:..." - - name: merge reboot lists - set_fact: - lists_merged: "{{ lists_merged + reboot }}" - when: restart.changed - # https://blog.crisp.se/2016/10/20/maxwenzin/how-to-append-to-lists-in-ansible - -# - name: debug config -# ansible.builtin.debug: -# msg: "{{ lists_merged | unique }}" - # unique Filter sorgt dafür das es keine doppelten Elemente gibt - # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters - # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote.proxmox_bind_mounts/tasks/main.yml b/roles/mgrote.proxmox_bind_mounts/tasks/main.yml deleted file mode 100644 index f2fff3f9..00000000 --- a/roles/mgrote.proxmox_bind_mounts/tasks/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: loop tasks - include_tasks: bm.yml - loop: "{{ pve_bind_mounts }}" - when: - - pve_bind_mounts is defined - # Loope durch jeden bind-mount diff --git a/roles/mgrote.proxmox_lxc_profiles/defaults/main.yml b/roles/mgrote.proxmox_lxc_profiles/defaults/main.yml deleted file mode 100644 index 60238daa..00000000 --- a/roles/mgrote.proxmox_lxc_profiles/defaults/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - lists_merged: # Liste muss leer existieren damit sie "germerged" werden kann, für Liste welche VMs zu rebooten sind - - '' - -# lxc_apparmor_profiles: -# - vmid: 555 -# apparmor_profile: unconfined diff --git a/roles/mgrote.proxmox_lxc_profiles/handlers/main.yml b/roles/mgrote.proxmox_lxc_profiles/handlers/main.yml deleted file mode 100644 index f2cac94a..00000000 --- a/roles/mgrote.proxmox_lxc_profiles/handlers/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - - name: restart lxc - become: true - command: "pct reboot {{ item }}" - failed_when: false - loop: "{{ lists_merged | unique }}" - # reboote den lxc wenn: - # - er in der Liste "Lists merged" vorhanden ist - # unique Filter sorgt dafür das es keine doppelten Elemente gibt - # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters - # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote.proxmox_lxc_profiles/tasks/main.yml b/roles/mgrote.proxmox_lxc_profiles/tasks/main.yml deleted file mode 100644 index af009edb..00000000 --- a/roles/mgrote.proxmox_lxc_profiles/tasks/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: loop tasks - include_tasks: profile.yml - loop: "{{ lxc_apparmor_profiles }}" - when: - - lxc_apparmor_profiles is defined - # Loope durch jeden bind-mount diff --git a/roles/mgrote.proxmox_lxc_profiles/tasks/profile.yml b/roles/mgrote.proxmox_lxc_profiles/tasks/profile.yml deleted file mode 100644 index b2362a34..00000000 --- a/roles/mgrote.proxmox_lxc_profiles/tasks/profile.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- - - name: set apparmor profile - become: true - ansible.builtin.lineinfile: - path: "/etc/pve/lxc/{{ item.vmid }}.conf" - line: "lxc.apparmor.profile: {{ item.apparmor_profile }}" - state: present - register: restart - - # schreibe vm id in die Liste "reboot" - - name: set reboot list - become: true - set_fact: - reboot: - - "{{ item.vmid }}" - when: restart.changed - - # Füge die leere Liste "lists_merged" aus den defaults, mit der Liste "reboot" zusammen. Nur wenn auch etwas geändert wurde, daher "when:..." - - name: merge reboot lists - become: true - set_fact: - lists_merged: "{{ lists_merged + reboot }}" - when: restart.changed - # https://blog.crisp.se/2016/10/20/maxwenzin/how-to-append-to-lists-in-ansible diff --git a/roles/mgrote.qemu_guest_agent/handlers/main.yml b/roles/mgrote.qemu_guest_agent/handlers/main.yml deleted file mode 100644 index 1ac62ba0..00000000 --- a/roles/mgrote.qemu_guest_agent/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: reboot - become: true - reboot: - reboot_timeout: 120 diff --git a/roles/mgrote.qemu_guest_agent/tasks/main.yml b/roles/mgrote.qemu_guest_agent/tasks/main.yml deleted file mode 100644 index d5d9f2c2..00000000 --- a/roles/mgrote.qemu_guest_agent/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - - name: update apt cache - become: yes - ansible.builtin.apt: - update_cache: yes - - - name: install packages - become: yes - ansible.builtin.package: - name: qemu-guest-agent - state: present - when: ansible_virtualization_role == 'guest' - notify: reboot diff --git a/roles/mgrote.r8152_kernel_module/LICENSE b/roles/mgrote.r8152_kernel_module/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.r8152_kernel_module/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.r8152_kernel_module/defaults/main.yml b/roles/mgrote.r8152_kernel_module/defaults/main.yml deleted file mode 100644 index 611fcbfd..00000000 --- a/roles/mgrote.r8152_kernel_module/defaults/main.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - r8152_module_needed: false # standardmäßig falsch - r8152_packages: - - pve-headers - - build-essential - - make - - dkms - r8152_safekeeping_reboot_delay: 12 # nach wieviel minuten wird der pc neugestartet, tasks wird am ende gelöscht wenn alles erfolgreich war - # damit ist sichergestellt das der pc wieder hochfährt falls etwas passiert - r8152_src_dir: /usr/src/r8125-9.004.01 # wo wird das entpackte archiv abgelegt - r8152_filename: r8125-dkms_9.004.01.tar.gz # wie ist der dateiname auf dem ansible controller - r8152_version: 9.004.01 # wie lautet die versuin diff --git a/roles/mgrote.r8152_kernel_module/meta/main.yml b/roles/mgrote.r8152_kernel_module/meta/main.yml deleted file mode 100644 index b4b6cedb..00000000 --- a/roles/mgrote.r8152_kernel_module/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - collections: - - community.general diff --git a/roles/mgrote.r8152_kernel_module/tasks/assert.yml b/roles/mgrote.r8152_kernel_module/tasks/assert.yml deleted file mode 100644 index 894272c4..00000000 --- a/roles/mgrote.r8152_kernel_module/tasks/assert.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- - - name: check if module is installed - folder - become: yes - stat: - path: "/lib/modules/r8152" - register: folder_exists - - - name: check if module is installed - lsmod - become: yes - ansible.builtin.shell: lsmod - register: module_in_lsmod - changed_when: False # sorgt dafür das der Task nie als "changed" angezeigt wird - - - name: include install-tasks - include_tasks: doing.yml - when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) - - - name: include dkms-tasks - include_tasks: dkms.yml - when: (module_in_lsmod.stdout.find('r8152') == -1) and (folder_exists.stat.exists == false) diff --git a/roles/mgrote.r8152_kernel_module/tasks/dkms.yml b/roles/mgrote.r8152_kernel_module/tasks/dkms.yml deleted file mode 100644 index 3ccd9110..00000000 --- a/roles/mgrote.r8152_kernel_module/tasks/dkms.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- - - name: dkms add - become: yes - ansible.builtin.shell: dkms add -m r8125 -v "{{ r8152_version }}" - args: - chdir: "{{ r8152_src_dir }}" - - - name: dkms build - become: yes - ansible.builtin.shell: dkms build -m r8125 -v "{{ r8152_version }}" - args: - chdir: "{{ r8152_src_dir }}" - - - name: dkms install - become: yes - ansible.builtin.shell: dkms install -m r8125 -v "{{ r8152_version }}" - args: - chdir: "{{ r8152_src_dir }}" - - - name: depmod -a - become: yes - ansible.builtin.shell: depmod -a - args: - chdir: "{{ r8152_src_dir }}" - - - name: update initramfs - become: yes - ansible.builtin.shell: update-initramfs -u - args: - chdir: "{{ r8152_src_dir }}" - - - name: reboot - ansible.builtin.reboot: - reboot_timeout: 120 diff --git a/roles/mgrote.r8152_kernel_module/tasks/doing.yml b/roles/mgrote.r8152_kernel_module/tasks/doing.yml deleted file mode 100644 index 6bc7d012..00000000 --- a/roles/mgrote.r8152_kernel_module/tasks/doing.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- - - name: install needed packages - become: yes - ansible.builtin.package: - name: "{{ r8152_packages }}" - state: present - - - name: add reboot(for safekeeping) - become: yes - ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" - - - name: update apt cache - become: yes - ansible.builtin.apt: - update_cache: yes - - - name: updated installed packages - become: yes - ansible.builtin.package: - upgrade: dist - - - name: create dirs - ansible.builtin.file: - path: "{{ item }}" - state: directory - loop: - - "{{ r8152_src_dir }}" - - - name: copy and extract archive - become: yes - ansible.builtin.unarchive: - src: "{{ r8152_filename }}" - dest: "{{ r8152_src_dir }}" - mode: a+x - extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives - remote_src: no #datei liegt also auf dem ansible-controller diff --git a/roles/mgrote.r8152_kernel_module/tasks/main.yml b/roles/mgrote.r8152_kernel_module/tasks/main.yml deleted file mode 100644 index 70c62e60..00000000 --- a/roles/mgrote.r8152_kernel_module/tasks/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - - name: include assert-tasks - include_tasks: assert.yml - when: r8152_module_needed == true diff --git a/roles/mgrote.r8152_kernel_module_on_off/LICENSE b/roles/mgrote.r8152_kernel_module_on_off/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.r8152_kernel_module_on_off/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.r8152_kernel_module_on_off/defaults/main.yml b/roles/mgrote.r8152_kernel_module_on_off/defaults/main.yml deleted file mode 100644 index d4f0dee8..00000000 --- a/roles/mgrote.r8152_kernel_module_on_off/defaults/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - r8152_filename: r8152.53.56-2.15.0 - r8152_packages: - - pve-headers - - build-essential - - make - r8152_reboot_timeout: 90 - r8152_pre_reboot_delay: 120 - r8152_post_reboot_delay: 60 - r8152_module_needed: false - r8152_safekeeping_reboot_delay: 12 diff --git a/roles/mgrote.r8152_kernel_module_on_off/meta/main.yml b/roles/mgrote.r8152_kernel_module_on_off/meta/main.yml deleted file mode 100644 index b4b6cedb..00000000 --- a/roles/mgrote.r8152_kernel_module_on_off/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - collections: - - community.general diff --git a/roles/mgrote.r8152_kernel_module_on_off/tasks/doing.yml b/roles/mgrote.r8152_kernel_module_on_off/tasks/doing.yml deleted file mode 100644 index 640f7baf..00000000 --- a/roles/mgrote.r8152_kernel_module_on_off/tasks/doing.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- - - name: install needed packages - become: yes - ansible.builtin.package: - name: "{{ r8152_packages }}" - state: present - register: aptp - - - - name: add reboot(for safekeeping) - become: yes - ansible.builtin.shell: shutdown -r "{{ r8152_safekeeping_reboot_delay }}" - - - name: update apt cache - become: yes - ansible.builtin.apt: - update_cache: yes - register: aptc - - - name: updated installed packages - become: yes - ansible.builtin.package: - upgrade: dist - register: apti - - - name: reboot - 1 - ansible.builtin.reboot: - reboot_timeout: "{{ r8152_reboot_timeout }}" - pre_reboot_delay: "{{ r8152_reboot_timeout }}" - post_reboot_delay: "{{ r8152_post_reboot_delay }}" - when: - - aptp.changed - - apti.changed - - aptc.changed - - - name: create dirs - ansible.builtin.file: - path: "{{ item }}" - state: directory - loop: - - "/tmp/r8152/" - - "/lib/modules/r8152/{{ r8152_filename }}" - - - name: copy archive - become: yes - ansible.builtin.copy: - src: "files/{{ r8152_filename }}.tar.bz2" - dest: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" - mode: '0775' - - - name: extract archive - become: yes - ansible.builtin.unarchive: - src: "/tmp/r8152/{{ r8152_filename }}.tar.bz2" - dest: "/lib/modules/r8152/{{ r8152_filename }}" - mode: a+x - extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives - remote_src: yes #datei liegt also auf dem zielsystem - - - name: make - community.general.make: - chdir: "/lib/modules/r8152/{{ r8152_filename }}" - become: yes - - - name: make install - community.general.make: - chdir: "/lib/modules/r8152/{{ r8152_filename }}" - target: install - become: yes - - - name: depmod -a - become: yes - ansible.builtin.shell: depmod -a - - - name: reboot - 2 - ansible.builtin.reboot: - reboot_timeout: "{{ r8152_reboot_timeout }}" - pre_reboot_delay: "{{ r8152_reboot_timeout }}" - post_reboot_delay: "{{ r8152_post_reboot_delay }}" - - - name: cancel reboot(for safekeeping) - become: yes - ansible.builtin.shell: shutdown -c diff --git a/roles/mgrote.r8152_kernel_module_on_off/tasks/main.yml b/roles/mgrote.r8152_kernel_module_on_off/tasks/main.yml deleted file mode 100644 index b2a23c31..00000000 --- a/roles/mgrote.r8152_kernel_module_on_off/tasks/main.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - - name: check if module is installed - folder - become: yes - stat: - path: "/lib/modules/r8152/{{ r8152_filename }}" - register: folder_exists - - - name: check if module is installed - lsmod - become: yes - ansible.builtin.shell: lsmod - register: module_in_lsmod - changed_when: False # sorgt dafür das der Task nie als "changed" angezeigt wird - - - name: include tasks (task get skipped if the folder or the module exists or r8152_module_needed == false) - include_tasks: doing.yml - when: ((folder_exists.stat.exists == False) or (module_in_lsmod.stdout.find('r8152') == -1)) and (r8152_module_needed == true) diff --git a/roles/mgrote.rclone/LICENSE b/roles/mgrote.rclone/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.rclone/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.rclone/README.md b/roles/mgrote.rclone/README.md deleted file mode 100644 index 9e750969..00000000 --- a/roles/mgrote.rclone/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## mgrote.rclone - -### Beschreibung -Installiert und konfiguriert rclone zur Datensicherung. - -### getestet auf -- [x] Ubuntu 20.04 (LXC) - -### Variablen + Defaults -- see [defaults](./defaults/main.yml) - -## Altes rclone Repository - -https://git.mgrote.net/mg/rclone diff --git a/roles/mgrote.rclone/defaults/main.yml b/roles/mgrote.rclone/defaults/main.yml deleted file mode 100644 index f5a7abdc..00000000 --- a/roles/mgrote.rclone/defaults/main.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- - -# rclone_config: "{{ lookup('keepass', 'rclone.conf', 'notes') }}" # rclone Config, use as Block - -# ### mgote.rclone -# rclone_jobs: # Array of Jobs -# - name: smb_musik_glacier # Jobname -# quelle: "/shares_music" # Source -# ziel: "scaleway-encrypt-glacier:/musik" # Destination -# timer: "*-*-* 23:15" # Timer -# loglevel: DEBUG # Optional: Loglevel -# state: true # true = present // false = remove -# bwlimit: 2M # Optional: Bandwidthlimit -# mode: "--size-only" # Optional: mode (https://rclone.org/s3/) -# transfers # Optional: Transfers -# checkers # Optional: Checkers -# retries # Optional: Retries diff --git a/roles/mgrote.rclone/handlers/main.yml b/roles/mgrote.rclone/handlers/main.yml deleted file mode 100644 index c73886d6..00000000 --- a/roles/mgrote.rclone/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes diff --git a/roles/mgrote.rclone/tasks/main.yml b/roles/mgrote.rclone/tasks/main.yml deleted file mode 100644 index 94f69a38..00000000 --- a/roles/mgrote.rclone/tasks/main.yml +++ /dev/null @@ -1,105 +0,0 @@ ---- - - name: Check if rclone is installed - command: which rclone - changed_when: false - failed_when: rclone_installed.rc not in [0,1] - register: rclone_installed - - - name: Install rclone first! - fail: - msg: "rclone is not installed, install it first" - when: rclone_installed.rc not in [ 0 ] - - - name: Create rclone Directory - become: true - ansible.builtin.file: - path: "/etc/rclone" - state: directory - owner: root - group: root - recurse: true - - - name: template rclone Configuration - become: true - ansible.builtin.blockinfile: - path: "/etc/rclone/rclone.conf" - block: "{{ rclone_config }}" - create: yes - owner: root - group: root - when: rclone_config is defined - no_log: true - - - name: template rclone services - become: yes - ansible.builtin.template: - src: "rclone.service.j2" - dest: "/etc/systemd/system/rclone_{{ item.name }}.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - with_items: - - "{{ rclone_jobs }}" - when: rclone_jobs is defined and item.state is true - - - name: template rclone timer - become: yes - ansible.builtin.template: - src: "rclone.timer.j2" - dest: "/etc/systemd/system/rclone_{{ item.name }}.timer" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - with_items: - - "{{ rclone_jobs }}" - when: rclone_jobs is defined and item.state is true - - - name: remove old rclone services - become: yes - ansible.builtin.file: - path: "/etc/systemd/system/rclone_{{ item.name }}.service" - state: absent - notify: - - systemctl daemon-reload - with_items: - - "{{ rclone_jobs }}" - when: rclone_jobs is defined and item.state is false - - - name: remove old rclone timers - become: yes - ansible.builtin.file: - path: "/etc/systemd/system/rclone_{{ item.name }}.timer" - state: absent - notify: - - systemctl daemon-reload - with_items: - - "{{ rclone_jobs }}" - when: rclone_jobs is defined and item.state is false - - - name: template rclone_mail@.service.j2 - become: yes - ansible.builtin.template: - src: "rclone_mail@.service.j2" - dest: "/etc/systemd/system/rclone_mail@.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: systemctl enable timer units - become: yes - ansible.builtin.systemd: - name: "rclone_{{ item.name }}.timer" - enabled: yes - masked: no - state: started - with_items: - - "{{ rclone_jobs }}" - when: rclone_jobs is defined and item.state is true - notify: - - systemctl daemon-reload diff --git a/roles/mgrote.rclone/templates/rclone.service.j2 b/roles/mgrote.rclone/templates/rclone.service.j2 deleted file mode 100644 index 557438a9..00000000 --- a/roles/mgrote.rclone/templates/rclone.service.j2 +++ /dev/null @@ -1,10 +0,0 @@ -{{ file_header | default () }} - -[Unit] -Description=Sync data with rclone. -OnFailure=rclone_mail@{{ item.name }}.service - - -[Service] -Type=simple -ExecStart=/usr/bin/rclone --config "/etc/rclone/rclone.conf" sync --log-level {{ item.loglevel | default ("INFO") }} --stats=5m --transfers {{ item.transfers | default ("8") }} --checkers {{ item.checkers | default ("8") }} --retries {{ item.retries | default ("5") }} --bwlimit {{ item.bwlimit | default ("0") }} {% if item.mode is defined %}{{ item.mode }}{% endif %} --delete-after "{{ item.quelle }}" "{{item.ziel }}" diff --git a/roles/mgrote.rclone/templates/rclone.timer.j2 b/roles/mgrote.rclone/templates/rclone.timer.j2 deleted file mode 100644 index fa2ba12a..00000000 --- a/roles/mgrote.rclone/templates/rclone.timer.j2 +++ /dev/null @@ -1,10 +0,0 @@ -{{ file_header | default () }} -[Unit] -Description=Timer for rclone syncs. - -[Timer] -OnCalendar={{ item.timer }} -RandomizedDelaySec=30 min - -[Install] -WantedBy=timers.target multi-user.target diff --git a/roles/mgrote.rclone/templates/rclone_mail@.service.j2 b/roles/mgrote.rclone/templates/rclone_mail@.service.j2 deleted file mode 100644 index c68413cf..00000000 --- a/roles/mgrote.rclone/templates/rclone_mail@.service.j2 +++ /dev/null @@ -1,8 +0,0 @@ -{{ file_header | default () }} - -[Unit] -Description=Send a Mail in case of an error in sanoid.service. - -[Service] -Type=oneshot -ExecStart=/bin/bash -c '/bin/systemctl status rclone_%i.service | mail -s "[ERROR] rclone - %i" {{ empfaenger_mail }}' diff --git a/roles/mgrote.remove_snapd/LICENSE b/roles/mgrote.remove_snapd/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.remove_snapd/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.remove_snapd/tasks/main.yml b/roles/mgrote.remove_snapd/tasks/main.yml deleted file mode 100644 index 48b6f938..00000000 --- a/roles/mgrote.remove_snapd/tasks/main.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - - name: remove snapd package - become: yes - ansible.builtin.package: - name: snapd - state: absent - purge: yes - - - name: remove /var/cache/snapd/ - become: true - ansible.builtin.file: - path: /var/cache/snapd/ - state: absent diff --git a/roles/mgrote.restic/LICENSE b/roles/mgrote.restic/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.restic/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.restic/defaults/main.yml b/roles/mgrote.restic/defaults/main.yml deleted file mode 100644 index f8032ac0..00000000 --- a/roles/mgrote.restic/defaults/main.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- - # restic user - restic_user: root - # restic group - restic_group: restic - # restic config directory - restic_conf_dir: /etc/restic - # was soll ausgeschlossen werden, siehe: https://github.com/restic/restic/issues/1005; https://forum.restic.net/t/exclude-syntax-confusion/1531/12 - restic_exclude: | - ._* - desktop.ini - .Trash-* - **/**cache***/** - **/**Cache***/** - **/**AppData***/** - # timeout for cifs mount; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") - restic_mount_timeout: "10 min" - # delay for restartung task; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") - restic_failure_delay: "30 s" - # when should restic run; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") - restic_schedule: "*:0/2" - # welche ordner sollen gesichert werden - restic_folders_to_backup: "/usr/local /etc /root /var/www /home" - # smb-share mit dem repository: z.B. "//fileserver3.grote.lan/restic" - restic_repository: "//fileserver.domain/restic" - # password für das repo - restic_repository_password: "{{ lookup('keepass', 'restic_repository_password', 'password') }}" - # nutzer für den share - restic_mount_user: restic - # passwort für den mount - restic_mount_password: "unsafe_password" - # where to send in case of an error - restic_fail_mail: x@y.de diff --git a/roles/mgrote.restic/handlers/main.yml b/roles/mgrote.restic/handlers/main.yml deleted file mode 100644 index dc2263e5..00000000 --- a/roles/mgrote.restic/handlers/main.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes - - - name: systemctl enable units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - enabled: yes - masked: no - with_items: - - media-restic.automount - - media-restic.mount - - restic.service - - restic.timer - - restic_mail.service - - - name: systemctl start units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - state: restarted - enabled: yes - with_items: - - restic.timer - notify: systemctl daemon-reload diff --git a/roles/mgrote.restic/tasks/main.yml b/roles/mgrote.restic/tasks/main.yml deleted file mode 100644 index b1ba785a..00000000 --- a/roles/mgrote.restic/tasks/main.yml +++ /dev/null @@ -1,117 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ restic_group }}" - state: present - - - name: install restic-packages - become: yes - ansible.builtin.package: - name: - - restic - state: present - - - name: create "{{ restic_conf_dir }}" - become: yes - ansible.builtin.file: - path: "{{ restic_conf_dir }}" - state: directory - owner: "{{ restic_user }}" - group: "{{ restic_group }}" - mode: 0755 - - - name: template smb.cred - become: yes - ansible.builtin.template: - src: "smb.cred.j2" - dest: "{{ restic_conf_dir }}/smb.cred" - owner: "{{ restic_user }}" - group: "{{ restic_group }}" - mode: 0600 - no_log: true - - - name: templates excludes - become: yes - ansible.builtin.blockinfile: - path: "{{ restic_conf_dir }}/excludes" - create: yes - block: "{{ restic_exclude }}" - mode: 0644 - owner: "{{ restic_user }}" - group: "{{ restic_group }}" - - - name: template restic.env - become: yes - ansible.builtin.template: - src: "restic.env.j2" - dest: "{{ restic_conf_dir }}/restic.env" - owner: root - group: root - mode: 0600 - no_log: true - - - name: template restic.mount - become: yes - ansible.builtin.template: - src: media-restic.mount.j2 - dest: /etc/systemd/system/media-restic.mount # media-restic == /media/restic - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - systemctl enable units - - - name: template restic.automount - become: yes - ansible.builtin.template: - src: media-restic.automount.j2 - dest: /etc/systemd/system/media-restic.automount - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - systemctl enable units - - systemctl start units - - - name: template restic.service - become: yes - ansible.builtin.template: - src: restic.service.j2 - dest: /etc/systemd/system/restic.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: template restic.timer - become: yes - ansible.builtin.template: - src: restic.timer.j2 - dest: /etc/systemd/system/restic.timer - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: template restic_mail.service - become: yes - ansible.builtin.template: - src: "restic_mail.service.j2" - dest: /etc/systemd/system/restic_mail.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: systemctl start restic.timer - become: yes - ansible.builtin.systemd: - name: restic.timer - state: started - enabled: yes diff --git a/roles/mgrote.sealed-secrets/LICENSE b/roles/mgrote.sealed-secrets/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.sealed-secrets/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.sealed-secrets/defaults/main.yml b/roles/mgrote.sealed-secrets/defaults/main.yml deleted file mode 100644 index 744d7859..00000000 --- a/roles/mgrote.sealed-secrets/defaults/main.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - sealed_secrets_homedir: /home/sealed_secrets - sealed_secrets_user_group: sealed_secrets - sealed_secrets_user: sealed_secrets - kubeseal_download_url: "https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.1/kubeseal-0.19.1-linux-amd64.tar.gz" - kubeseal_path_bin: /usr/local/sbin - kubeconfig: /etc/rancher/k3s/k3s.yaml - sealed_secrets_keepass_entry_name: "{{ lookup('keepass', 'k3s-sealed-secrets-private-key', 'notes') }}" # mit kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml >main.key holen diff --git a/roles/mgrote.sealed-secrets/tasks/import.yml b/roles/mgrote.sealed-secrets/tasks/import.yml deleted file mode 100644 index b4bffc93..00000000 --- a/roles/mgrote.sealed-secrets/tasks/import.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- - - name: check if private key exists - ansible.builtin.command: kubectl get secrets sealed-secrets-keytsq4k -n kube-system - register: key - ignore_errors: yes - changed_when: false - - - name: Template private key file - ansible.builtin.template: - src: private.key.j2 - dest: /root/private.key - owner: root - group: root - mode: '0400' - when: key.rc not in [ 0 ] - #no_log: True - - - name: apply private key - ansible.builtin.command: kubectl apply -f /root/private.key - when: key.rc not in [ 0 ] - - - name: remove old pod - ansible.builtin.command: kubectl delete pod -n kube-system -l name=sealed-secrets-controller - when: key.rc not in [ 0 ] - - - name: remove private key file - ansible.builtin.file: - path: /root/private.key - state: absent diff --git a/roles/mgrote.sealed-secrets/tasks/main.yml b/roles/mgrote.sealed-secrets/tasks/main.yml deleted file mode 100644 index 247adfe9..00000000 --- a/roles/mgrote.sealed-secrets/tasks/main.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: check if kubeseal is installed - command: which kubeseal - changed_when: false - failed_when: kubeseal_installed.rc not in [0,1] - register: kubeseal_installed - - - name: download sealed_secrets binary - ansible.builtin.unarchive: - src: "{{ kubeseal_download_url }}" - dest: "{{ kubeseal_path_bin }}" - mode: 0755 - owner: "{{ sealed_secrets_user }}" - group: "{{ sealed_secrets_user_group }}" - remote_src: yes - creates: "{{ kubeseal_path_bin }}/kubeseal" - when: kubeseal_installed.rc not in [ 0 ] - - - name: include import tasks - include_tasks: import.yml - # der ganze block nur auf enem host - run_once: true - when: ansible_host == flux_install_host diff --git a/roles/mgrote.sealed-secrets/tasks/user.yml b/roles/mgrote.sealed-secrets/tasks/user.yml deleted file mode 100644 index 73a30083..00000000 --- a/roles/mgrote.sealed-secrets/tasks/user.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ sealed_secrets_user_group }}" - state: present - when: - - sealed_secrets_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ sealed_secrets_user }}" - group: "{{ sealed_secrets_user_group }}" - create_home: no - when: - - sealed_secrets_user_group is defined - - sealed_secrets_user is defined diff --git a/roles/mgrote.set_permissions/LICENSE b/roles/mgrote.set_permissions/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.set_permissions/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.smart/LICENSE b/roles/mgrote.smart/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.smart/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.smart/defaults/main.yml b/roles/mgrote.smart/defaults/main.yml deleted file mode 100644 index e9b13e4f..00000000 --- a/roles/mgrote.smart/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - # path to smartctl - smart_smartctl_path: "/usr/sbin/smartctl" - # under which user the script is run - smart_user_group: "root" - smart_user: "smart" diff --git a/roles/mgrote.smart/handlers/main.yml b/roles/mgrote.smart/handlers/main.yml deleted file mode 100644 index f868b805..00000000 --- a/roles/mgrote.smart/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart smartmontools - become: yes - systemd: - name: smartmontools - state: restarted - enabled: yes diff --git a/roles/mgrote.smart/meta/main.yml b/roles/mgrote.smart/meta/main.yml deleted file mode 100644 index f2c70d58..00000000 --- a/roles/mgrote.smart/meta/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - dependencies: - - role: mgrote.postfix - galaxy_info: - author: mgrote - description: installs smartctl and configures it - min_ansible_version: 2.0 - license: GPLv3 - platforms: - - name: Ubuntu - versions: - - all - galaxy_tags: - - system diff --git a/roles/mgrote.smart/tasks/main.yml b/roles/mgrote.smart/tasks/main.yml deleted file mode 100644 index 485744d7..00000000 --- a/roles/mgrote.smart/tasks/main.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: ensure smartmontools are installed - become: yes - ansible.builtin.package: - name: smartmontools - state: present - - - name: template smartmontools config - become: yes - ansible.builtin.template: - src: "smartmontools" - dest: "/etc/default/smartmontools" - owner: "{{ smart_user }}" - group: "{{ smart_user_group }}" - notify: restart smartmontools - - - name: template smartd.conf - become: yes - ansible.builtin.template: - src: "smartd.conf" - dest: "/etc/smartd.conf" - owner: "{{ smart_user }}" - group: "{{ smart_user_group }}" - notify: restart smartmontools diff --git a/roles/mgrote.smart/tasks/user.yml b/roles/mgrote.smart/tasks/user.yml deleted file mode 100644 index 87a6f5a9..00000000 --- a/roles/mgrote.smart/tasks/user.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ smart_user_group }}" - state: present - when: - - smart_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ smart_user }}" - group: "{{ smart_user_group }}" - shell: /usr/sbin/nologin - create_home: no - when: - - smart_user_group is defined - - smart_user is defined diff --git a/roles/mgrote.ssh/LICENSE b/roles/mgrote.ssh/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.ssh/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.ssh/handlers/main.yml b/roles/mgrote.ssh/handlers/main.yml deleted file mode 100644 index aa01ea6d..00000000 --- a/roles/mgrote.ssh/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart sshd - become: yes - systemd: - name: sshd - enabled: yes - state: restarted diff --git a/roles/mgrote.ssh/tasks/main.yml b/roles/mgrote.ssh/tasks/main.yml deleted file mode 100644 index e21ad406..00000000 --- a/roles/mgrote.ssh/tasks/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- - - name: include ubuntu tasks (determined by "ansible_distribution") - include_tasks: ubuntu.yml - when: - - ansible_distribution == 'Ubuntu' - - - name: include proxmox tasks (determined by group) - include_tasks: pve.yml - when: - - "'proxmox' in group_names" diff --git a/roles/mgrote.ssh/tasks/pve.yml b/roles/mgrote.ssh/tasks/pve.yml deleted file mode 100644 index a049fd18..00000000 --- a/roles/mgrote.ssh/tasks/pve.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: source proxmox vars - include_vars: pve.yml - - - name: template sshd_config - become: true - ansible.builtin.template: - src: pve.j2 - dest: /etc/ssh/sshd_config - owner: root - group: root - mode: '0644' - validate: "/usr/sbin/sshd -T -f %s" - backup: true - notify: restart sshd diff --git a/roles/mgrote.ssh/tasks/ubuntu.yml b/roles/mgrote.ssh/tasks/ubuntu.yml deleted file mode 100644 index e3f19f97..00000000 --- a/roles/mgrote.ssh/tasks/ubuntu.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: source ubuntu vars - include_vars: ubuntu.yml - - - name: template sshd_config - become: true - ansible.builtin.template: - src: ubuntu.j2 - dest: /etc/ssh/sshd_config - owner: root - group: root - mode: '0644' - validate: "/usr/sbin/sshd -T -f %s" - backup: true - notify: restart sshd diff --git a/roles/mgrote.ssh/vars/pve.yml b/roles/mgrote.ssh/vars/pve.yml deleted file mode 100644 index 5a209de1..00000000 --- a/roles/mgrote.ssh/vars/pve.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - ssh_permit_root_login: "yes" - ssh_password_authentication: "yes" - ssh_print_motd: "no" - ssh_print_lastlog: "no" - ssh_listen_port: "22" diff --git a/roles/mgrote.ssh/vars/ubuntu.yml b/roles/mgrote.ssh/vars/ubuntu.yml deleted file mode 100644 index 3903358c..00000000 --- a/roles/mgrote.ssh/vars/ubuntu.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - ssh_permit_root_login: "no" - ssh_password_authentication: "no" - ssh_print_motd: "no" - ssh_print_lastlog: "no" - ssh_listen_port: "22" diff --git a/roles/mgrote.supermicro_fan_control/LICENSE b/roles/mgrote.supermicro_fan_control/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.supermicro_fan_control/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.supermicro_fan_control/handlers/main.yml b/roles/mgrote.supermicro_fan_control/handlers/main.yml deleted file mode 100644 index d3962c5e..00000000 --- a/roles/mgrote.supermicro_fan_control/handlers/main.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes - - - name: systemctl enable units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - enabled: yes - masked: no - with_items: - - sm_fan_control.service - - sm_fan_control.timer - - - name: systemctl start units - become: yes - ansible.builtin.systemd: - name: "{{ item }}" - state: restarted - enabled: yes - with_items: - - sm_fan_control.timer - notify: systemctl daemon-reload diff --git a/roles/mgrote.supermicro_fan_control/tasks/main.yml b/roles/mgrote.supermicro_fan_control/tasks/main.yml deleted file mode 100644 index 6bd1ff10..00000000 --- a/roles/mgrote.supermicro_fan_control/tasks/main.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - ipmitool - state: present - - - name: template sm_fan_control.service - become: yes - ansible.builtin.template: - src: sm_fan_control.service.j2 - dest: /etc/systemd/system/sm_fan_control.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: template sm_fan_control.timer - become: yes - ansible.builtin.template: - src: sm_fan_control.timer.j2 - dest: /etc/systemd/system/sm_fan_control.timer - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: systemctl start sm_fan_control.timer - become: yes - ansible.builtin.systemd: - name: sm_fan_control.timer - state: started - enabled: yes diff --git a/roles/mgrote.systemd-resolved/handlers/main.yml b/roles/mgrote.systemd-resolved/handlers/main.yml deleted file mode 100644 index f5ddad62..00000000 --- a/roles/mgrote.systemd-resolved/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: restart systemd-resolved - ansible.builtin.systemd: - state: restarted - name: systemd-resolved diff --git a/roles/mgrote.systemd-resolved/tasks/main.yml b/roles/mgrote.systemd-resolved/tasks/main.yml deleted file mode 100644 index 13d438fc..00000000 --- a/roles/mgrote.systemd-resolved/tasks/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- - - name: Make sure systemd-resolved is running - ansible.builtin.systemd: - state: started - masked: false - name: systemd-resolved - - - name: template /etc/systemd/resolved.conf - ansible.builtin.template: - src: resolved.conf.j2 - dest: /etc/systemd/resolved.conf - owner: root - group: root - mode: '0644' - notify: restart systemd-resolved - - - name: template /etc/resolv.conf - ansible.builtin.template: - src: resolv.conf.j2 - dest: /etc/resolv.conf - owner: root - group: root - mode: '0644' - notify: restart systemd-resolved diff --git a/roles/mgrote.systemd-timesyncd/LICENSE b/roles/mgrote.systemd-timesyncd/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.systemd-timesyncd/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.systemd-timesyncd/defaults/main.yml b/roles/mgrote.systemd-timesyncd/defaults/main.yml deleted file mode 100644 index fd42b51a..00000000 --- a/roles/mgrote.systemd-timesyncd/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - ntp_timesyncd_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet - ntp_timesyncd_servers: # welche Server sollen befragt werden - - ptbtime1.ptb.de diff --git a/roles/mgrote.systemd-timesyncd/handlers/main.yml b/roles/mgrote.systemd-timesyncd/handlers/main.yml deleted file mode 100644 index dd50d2a4..00000000 --- a/roles/mgrote.systemd-timesyncd/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart systemd-timesyncd.service - become: yes - systemd: - name: systemd-timesyncd - state: restarted - when: not ansible_facts['virtualization_type'] == "lxc" diff --git a/roles/mgrote.systemd-timesyncd/tasks/main.yml b/roles/mgrote.systemd-timesyncd/tasks/main.yml deleted file mode 100644 index effc42ef..00000000 --- a/roles/mgrote.systemd-timesyncd/tasks/main.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- - - - name: gather package facts - become: yes - ansible.builtin.package_facts: - manager: auto - - # deaktiviere andere ntp-implementationen - - name: stop and mask ntp service - become: yes - systemd: - name: ntp - masked: yes - state: stopped - enabled: no - when: "'ntp' in ansible_facts.packages" - - - name: stop and mask chrony service - become: yes - systemd: - name: chrony - masked: yes - state: stopped - enabled: no - when: "'chrony' in ansible_facts.packages" - - - name: install systemd-timesyncd - become: yes - ansible.builtin.package: - name: - - systemd-timesyncd - state: present - - - name: template systemd-timesyncd config - become: yes - ansible.builtin.template: - src: "timesyncd.conf.j2" - dest: "/etc/systemd/timesyncd.conf" - mode: 0644 - owner: root - group: root - notify: restart systemd-timesyncd.service - - - name: activate systemd-timesyncd service (not within containers like lxc) - become: yes - systemd: - name: systemd-timesyncd - masked: no - state: started - enabled: yes - when: not ansible_facts['virtualization_type'] == "lxc" - tags: test - - - name: set timezone to {{ ntp_timesyncd_timezone }} - become: yes - community.general.timezone: - name: "{{ ntp_timesyncd_timezone }}" diff --git a/roles/mgrote.timeshift/LICENSE b/roles/mgrote.timeshift/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.timeshift/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.timeshift/handlers/main.yml b/roles/mgrote.timeshift/handlers/main.yml deleted file mode 100644 index 6ed760d9..00000000 --- a/roles/mgrote.timeshift/handlers/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - - name: create snapshot - become: yes - ansible.builtin.shell: "/usr/bin/timeshift --scripted --create" diff --git a/roles/mgrote.timeshift/tasks/main.yml b/roles/mgrote.timeshift/tasks/main.yml deleted file mode 100644 index 52bd46c6..00000000 --- a/roles/mgrote.timeshift/tasks/main.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - timeshift - state: present - notify: create snapshot - - - name: copy timeshift config - become: yes - ansible.builtin.template: - src: "timeshift.json" - dest: "/etc/timeshift/timeshift.json" - - - name: create timeshift cronjob - become: yes - ansible.builtin.cron: - name: restic - state: present - job: "/usr/bin/timeshift --scripted --create" - minute: "7" - hour: "*/4" diff --git a/roles/mgrote.tor-node/LICENSE b/roles/mgrote.tor-node/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.tor-node/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.tor-node/defaults/main.yml b/roles/mgrote.tor-node/defaults/main.yml deleted file mode 100644 index ebb299b3..00000000 --- a/roles/mgrote.tor-node/defaults/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - # required - # [a-zA-Z0-9] - tor_relay_name: tor1name - tor_or_port: 443 - tor_socks_port: 0 - tor_control_socket: 0 - tor_contact_info: webmaster@domain.local - tor_control_port: 9051 - # optional - # tor_my_family: name - # tor_bandwidth_rate: - # tor_bandwidth_burst: - tor_mode: relay # OR bridge - tor_bridge_port: 5555 - - # use IPv6 - tor_ipv6: false diff --git a/roles/mgrote.tor-node/handlers/main.yml b/roles/mgrote.tor-node/handlers/main.yml deleted file mode 100644 index b22db5b7..00000000 --- a/roles/mgrote.tor-node/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: restart tor - become: yes - systemd: - name: tor - enabled: yes - state: restarted diff --git a/roles/mgrote.tor-node/tasks/bridge.yml b/roles/mgrote.tor-node/tasks/bridge.yml deleted file mode 100644 index 2fe5fc2c..00000000 --- a/roles/mgrote.tor-node/tasks/bridge.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- - - name: install obsf packages - become: yes - ansible.builtin.package: - name: - - obfs4proxy - state: present - notify: restart tor - - - name: templating torrc - become: yes - ansible.builtin.template: - src: "bridge_torrc" - dest: "/etc/tor/torrc" - notify: restart tor diff --git a/roles/mgrote.tor-node/tasks/main.yml b/roles/mgrote.tor-node/tasks/main.yml deleted file mode 100644 index 3e80c6f0..00000000 --- a/roles/mgrote.tor-node/tasks/main.yml +++ /dev/null @@ -1,39 +0,0 @@ ---- - - name: install dependencies - become: yes - ansible.builtin.package: - name: apt-transport-https - state: present - - - name: add tor repo key - ansible.builtin.apt_key: - url: https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc - state: present - - - name: add tor repo - ansible.builtin.apt_repository: - repo: deb https://deb.torproject.org/torproject.org {{ ansible_distribution_release }} main - state: present - filename: tor - - - name: install tor packages - become: yes - ansible.builtin.package: - name: - - tor - - deb.torproject.org-keyring - state: present - notify: restart tor - - - name: include bridge tasks - include_tasks: bridge.yml - when: - - tor_mode == 'bridge' - - - name: include relay tasks - include_tasks: relay.yml - when: - - tor_mode == 'relay' - - - name: include nyx tasks - include_tasks: nyx.yml diff --git a/roles/mgrote.tor-node/tasks/nyx.yml b/roles/mgrote.tor-node/tasks/nyx.yml deleted file mode 100644 index 67948f31..00000000 --- a/roles/mgrote.tor-node/tasks/nyx.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - - name: install nyx packages - become: yes - ansible.builtin.package: - name: - - nyx - state: present - notify: restart tor diff --git a/roles/mgrote.tor-node/tasks/relay.yml b/roles/mgrote.tor-node/tasks/relay.yml deleted file mode 100644 index 33532d3c..00000000 --- a/roles/mgrote.tor-node/tasks/relay.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - - name: templating torrc - become: yes - ansible.builtin.template: - src: "relay_torrc" - dest: "/etc/tor/torrc" - notify: restart tor diff --git a/roles/mgrote.users/LICENSE b/roles/mgrote.users/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.users/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.users/tasks/main.yml b/roles/mgrote.users/tasks/main.yml deleted file mode 100644 index a86c3121..00000000 --- a/roles/mgrote.users/tasks/main.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- - - name: set groups as list - ansible.builtin.set_fact: - groups_as_list: "{{ (groups_as_list|default([]) + item.groups.split(','))|map('trim')|list|sort|unique }}" - loop: '{{ users }}' - when: item.groups is defined - - - name: create groups - ansible.builtin.group: - name: "{{ item }}" - state: present - loop: "{{ groups_as_list }}" - when: groups_as_list is defined - - - name: create users - ansible.builtin.user: - name: "{{ item.username }}" - uid: "{{ item.uid | default(omit) }}" - shell: "{{ item.shell | default('/bin/bash') }}" - password: "{{ item.password }}" - update_password: "{{ item.update_password | default(omit) }}" - groups: "{{ item.groups | default(omit) }}" - createhome: "{{ item.createhome | default('yes') }}" - state: "{{ item.state | default('present') }}" - loop: '{{ users }}' - - - name: add ssh key - ansible.posix.authorized_key: - user: "{{ item.username }}" - key: "{{ item.public_ssh_key }}" - state: present - when: item.public_ssh_key is defined - loop: '{{ users }}' - - - name: add to sudoers - ansible.builtin.lineinfile: - dest: /etc/sudoers - state: present - regexp: '^{{ item.username }} ' - line: "{{ item.username }} ALL=(ALL) {{ 'NOPASSWD:' if ( item.allow_passwordless_sudo|d(false) ) else '' }}ALL" - validate: 'visudo -cf %s' - when: item.allow_sudo|default(false) == true and item.allow_sudo is defined - loop: '{{ users }}' diff --git a/roles/mgrote.vim/LICENSE b/roles/mgrote.vim/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.vim/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.vim/defaults/main.yml b/roles/mgrote.vim/defaults/main.yml deleted file mode 100644 index 88e992c7..00000000 --- a/roles/mgrote.vim/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- - vim_vundle_path: /home/mg/.vim/bundle/Vundle.vim - vim_vundle_repo_url: https://github.com/VundleVim/Vundle.vim.git - vim_homedir: /home/mg/.vim diff --git a/roles/mgrote.vim/tasks/main.yml b/roles/mgrote.vim/tasks/main.yml deleted file mode 100644 index a3571812..00000000 --- a/roles/mgrote.vim/tasks/main.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - vim - - ripgrep - state: present - - - name: check if vundle is installed - folder - become: yes - stat: - path: "{{ vim_vundle_path }}" - register: folder_exists - - - - name: set safe directory - become: true - ansible.builtin.shell: - cmd: git config --global --add safe.directory "{{ vim_vundle_path }}" - changed_when: false - - - name: Ensure repository is cloned locally. - git: - repo: "{{ vim_vundle_repo_url }}" - dest: "{{ vim_vundle_path }}" - depth: 1 - register: repo_cloned - - - name: set owner recursive for repo - file: - path: "{{ vim_homedir }}" - owner: mg - group: mg - recurse: yes - when: repo_cloned.changed == true - -# - name: Vundle - PluginInstall -# ansible.builtin.shell: yes | vim -c PluginInstall -c qall -# args: -# chdir: /home/mg -# when: -# - (folder_exists.stat.exists == False) and ("ansible_facts['distribution'] == 'Ubuntu'") -# become: yes -# become_user: mg diff --git a/roles/mgrote.xnview/LICENSE b/roles/mgrote.xnview/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.xnview/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.xnview/defaults/main.yml b/roles/mgrote.xnview/defaults/main.yml deleted file mode 100644 index 136aa1a7..00000000 --- a/roles/mgrote.xnview/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - xnview_deb_url: https://download.xnview.com/XnViewMP-linux-x64.deb diff --git a/roles/mgrote.xnview/tasks/main.yml b/roles/mgrote.xnview/tasks/main.yml deleted file mode 100644 index 61d6ec2c..00000000 --- a/roles/mgrote.xnview/tasks/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: download and install xnview - become: true - apt: - deb: "{{ xnview_deb_url }}" diff --git a/roles/mgrote.xrdp/LICENSE b/roles/mgrote.xrdp/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.xrdp/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.xrdp/tasks/main.yml b/roles/mgrote.xrdp/tasks/main.yml deleted file mode 100644 index bd28f48c..00000000 --- a/roles/mgrote.xrdp/tasks/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- - - name: install packages - become: yes - ansible.builtin.package: - name: - - xrdp - - xorgxrdp - state: present - - - name: create xsession config file - become: true - ansible.builtin.file: - path: "/home/{{ xrdp_user | default('mg') }}/.xsession" - state: touch - owner: "{{ xrdp_user | default('mg') }}" - modification_time: preserve - access_time: preserve - - - name: set xsession config - become: true - ansible.builtin.blockinfile: - path: "/home/{{ xrdp_user | default('mg') }}/.xsession" - block: | - env -u SESSION_MANAGER -u DBUS_SESSION_BUS_ADDRESS cinnamon-session diff --git a/roles/mgrote.youtubedl/LICENSE b/roles/mgrote.youtubedl/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.youtubedl/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.youtubedl/handlers/main.yml b/roles/mgrote.youtubedl/handlers/main.yml deleted file mode 100644 index c73886d6..00000000 --- a/roles/mgrote.youtubedl/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes diff --git a/roles/mgrote.youtubedl/tasks/main.yml b/roles/mgrote.youtubedl/tasks/main.yml deleted file mode 100644 index b159f3cd..00000000 --- a/roles/mgrote.youtubedl/tasks/main.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- - - name: download binary - become: yes - ansible.builtin.get_url: - url: "{{ ytdl_dl_url }}" - dest: /usr/local/bin/yt-dlp - mode: '0750' - - - name: install packages - become: yes - ansible.builtin.package: - name: - - ffmpeg - - brotli - - python3-mutagen - state: present - - - name: ensure dir exists - become: yes - ansible.builtin.file: - path: "{{ ytdl_conf_dir }}" - state: directory - - - name: template youtubedl config - become: yes - ansible.builtin.template: - src: "{{ item }}" - dest: "{{ ytdl_conf_dir }}/{{ item }}" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - loop: - - podcast.txt - - youtube.txt - - - name: template systemd services - become: yes - ansible.builtin.template: - src: "youtubedl.service.j2" - dest: "/etc/systemd/system/youtubedl.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: ytdl_active - - - name: template youtubedl timer - become: yes - ansible.builtin.template: - src: "youtubedl.timer.j2" - dest: "/etc/systemd/system/youtubedl.timer" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: ytdl_active - - - name: template youtube_mail.service.j2 - become: yes - ansible.builtin.template: - src: "youtubedl_mail.service.j2" - dest: "/etc/systemd/system/youtubedl_mail.service" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: ytdl_active - - - name: systemctl enable timer units - become: yes - ansible.builtin.systemd: - name: "youtubedl.timer" - enabled: yes - masked: no - state: started - notify: - - systemctl daemon-reload - when: ytdl_active diff --git a/roles/mgrote.zfs_arc_mem/LICENSE b/roles/mgrote.zfs_arc_mem/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_arc_mem/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_arc_mem/defaults/main.yml b/roles/mgrote.zfs_arc_mem/defaults/main.yml deleted file mode 100644 index 0fcfef08..00000000 --- a/roles/mgrote.zfs_arc_mem/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - zfs_extra_arc_max_size: "8589934592" #in Bytes diff --git a/roles/mgrote.zfs_arc_mem/tasks/main.yml b/roles/mgrote.zfs_arc_mem/tasks/main.yml deleted file mode 100644 index 2e3e4255..00000000 --- a/roles/mgrote.zfs_arc_mem/tasks/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: Limit ZFS Memory Usage - become: yes - ansible.builtin.copy: - dest: /etc/modprobe.d/zfs.conf - content: options zfs zfs_arc_max={{ zfs_extra_arc_max_size }} diff --git a/roles/mgrote.zfs_health/LICENSE b/roles/mgrote.zfs_health/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_health/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_health/defaults/main.yml b/roles/mgrote.zfs_health/defaults/main.yml deleted file mode 100644 index 49447bae..00000000 --- a/roles/mgrote.zfs_health/defaults/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - ### when should the script be run - zfs_extra_cron_minutes_zfs_health: "0,15,30,45" - zfs_extra_cron_hours_zfs_health: "*" - ### under which user the script is run - zfs_health_user_group: "root" - zfs_health_user: "zfs-health" diff --git a/roles/mgrote.zfs_health/tasks/main.yml b/roles/mgrote.zfs_health/tasks/main.yml deleted file mode 100644 index 383da670..00000000 --- a/roles/mgrote.zfs_health/tasks/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: template script - become: yes - ansible.builtin.template: - src: zfs-health.sh - dest: /usr/local/bin/zfs-health.sh - mode: 0744 - owner: "{{ zfs_health_user }}" - group: "{{ zfs_health_user_group }}" - - - name: ensure cronjob exists - become: yes - ansible.builtin.cron: - name: zfs_health - state: present - job: "/usr/local/bin/zfs-health.sh" - minute: "{{ zfs_extra_cron_minutes_zfs_health }}" - hour: "{{ zfs_extra_cron_hours_zfs_health }}" - user: "{{ zfs_health_user }}" diff --git a/roles/mgrote.zfs_health/tasks/user.yml b/roles/mgrote.zfs_health/tasks/user.yml deleted file mode 100644 index 7ab13eed..00000000 --- a/roles/mgrote.zfs_health/tasks/user.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ zfs_health_user_group }}" - state: present - when: - - zfs_health_user_group is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ zfs_health_user }}" - group: "{{ zfs_health_user_group }}" - shell: /usr/sbin/nologin - create_home: no - when: - - zfs_health_user_group is defined - - zfs_health_user is defined diff --git a/roles/mgrote.zfs_manage_datasets/LICENSE b/roles/mgrote.zfs_manage_datasets/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_manage_datasets/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_manage_datasets/meta/main.yml b/roles/mgrote.zfs_manage_datasets/meta/main.yml deleted file mode 100644 index b4b6cedb..00000000 --- a/roles/mgrote.zfs_manage_datasets/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - collections: - - community.general diff --git a/roles/mgrote.zfs_manage_datasets/tasks/main.yml b/roles/mgrote.zfs_manage_datasets/tasks/main.yml deleted file mode 100644 index d56d179c..00000000 --- a/roles/mgrote.zfs_manage_datasets/tasks/main.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- - - name: create datasets or set options - become: true - community.general.zfs: - name: "{{ item.dataset }}" - state: "{{ item.state | default('present') }}" - extra_zfs_properties: - quota: "{{ item.quota | default(omit) }}" - reservation: "{{ item.reservation | default(omit) }}" - recordsize: "{{ item.recordsize | default(omit) }}" - mountpoint: "{{ item.mountpoint | default(omit) }}" - sharenfs: "{{ item.sharenfs | default(omit) }}" - checksum: "{{ item.checksum | default(omit) }}" - compression: "{{ item.compression | default(omit) }}" - atime: "{{ item.atime | default(omit) }}" - devices: "{{ item.devices | default(omit) }}" - exec: "{{ item.exec | default(omit) }}" - setuid: "{{ item.setuid | default(omit) }}" - readonly: "{{ item.readonly | default(omit) }}" - zoned: "{{ item.zoned | default(omit) }}" - snapdir: "{{ item.snapdir | default(omit) }}" - aclmode: "{{ item.aclmode | default(omit) }}" - aclinherit: "{{ item.aclinherit | default(omit) }}" - canmount: "{{ item.canmount | default(omit) }}" - xattr: "{{ item.xattr | default(omit) }}" - copies: "{{ item.copies | default(omit) }}" - vscan: "{{ item.vscan | default(omit) }}" - nbmand: "{{ item.nbmand | default(omit) }}" - sharesmb: "{{ item.sharesmb | default(omit) }}" - refquota: "{{ item.refquota | default(omit) }}" - refreservation: "{{ item.refreservation | default(omit) }}" - primarycache: "{{ item.primarycache | default(omit) }}" - secondarycache: "{{ item.secondarycache | default(omit) }}" - logbias: "{{ item.logbias | default(omit) }}" - dedup: "{{ item.dedup | default(omit) }}" - mlslabel: "{{ item.mlslabel | default(omit) }}" - sync: "{{ item.sync | default(omit) }}" - dnodesize: "{{ item.dnodesize | default(omit) }}" - volmode: "{{ item.volmode | default(omit) }}" - filesystem_limit: "{{ item.filesystem_limit | default(omit) }}" - snapshot_limit: "{{ item.snapshot_limit | default(omit) }}" - filesystem_count: "{{ item.filesystem_count | default(omit) }}" - snapshot_count: "{{ item.snapshot_count | default(omit) }}" - snapdev: "{{ item.snapdev | default(omit) }}" - acltype: "{{ item.acltype | default(omit) }}" - context: "{{ item.context | default(omit) }}" - fscontext: "{{ item.fscontext | default(omit) }}" - defcontext: "{{ item.defcontext | default(omit) }}" - rootcontext: "{{ item.rootcontext | default(omit) }}" - relatime: "{{ item.relatime | default(omit) }}" - redundant_metadata: "{{ item.redundant_metadata | default(omit) }}" - overlay: "{{ item.overlay | default(omit) }}" - encryption: "{{ item.encryption | default(omit) }}" - keylocation: "{{ item.keylocation | default(omit) }}" - keyformat: "{{ item.keyformat | default(omit) }}" - pbkdf2iters: "{{ item.pbkdf2iters | default(omit) }}" - special_small_blocks: "{{ item.special_small_blocks | default(omit) }}" - loop: "{{ zfs_datasets }}" - when: zfs_datasets is defined # führe nur aus wenn die Variable gesetzt ist diff --git a/roles/mgrote.zfs_packages/LICENSE b/roles/mgrote.zfs_packages/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_packages/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_packages/tasks/main.yml b/roles/mgrote.zfs_packages/tasks/main.yml deleted file mode 100644 index cd1f585b..00000000 --- a/roles/mgrote.zfs_packages/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- - - name: install zfs-tools-packages - become: yes - ansible.builtin.package: - name: - - zfsutils - - zfs-initramfs - - zfs-zed - state: present diff --git a/roles/mgrote.zfs_sanoid/LICENSE b/roles/mgrote.zfs_sanoid/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_sanoid/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_sanoid/handlers/main.yml b/roles/mgrote.zfs_sanoid/handlers/main.yml deleted file mode 100644 index c73886d6..00000000 --- a/roles/mgrote.zfs_sanoid/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes diff --git a/roles/mgrote.zfs_sanoid/tasks/destination.yml b/roles/mgrote.zfs_sanoid/tasks/destination.yml deleted file mode 100644 index e0870e0d..00000000 --- a/roles/mgrote.zfs_sanoid/tasks/destination.yml +++ /dev/null @@ -1,77 +0,0 @@ ---- - - name: template ssh private key - become: true - ansible.builtin.copy: - content: "{{ sanoid_syncoid_ssh_privkey }}" - dest: "/etc/sanoid/.ssh/id_sanoid" - owner: "{{ sanoid_user }}" - group: "{{ sanoid_user_group }}" - mode: 0400 - no_log: true - when: - - sanoid_syncoid_destination_host - - - name: add user to sudoers - become: true - ansible.builtin.blockinfile: - path: /etc/sudoers - state: present - block: | - {{ sanoid_user }} ALL=(ALL) NOPASSWD:ALL - validate: '/usr/sbin/visudo -cf %s' - backup: yes - marker_begin: sanoid-sudoers BEGIN - marker_end: sanoid-sudoers END - when: - - sanoid_syncoid_destination_host - - - name: template syncoid.service - become: yes - ansible.builtin.template: - src: "syncoid.service.j2" - dest: /etc/systemd/system/syncoid.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: - - sanoid_syncoid_destination_host - - - name: template syncoid_mail.service - become: yes - ansible.builtin.template: - src: "syncoid_mail.service.j2" - dest: /etc/systemd/system/syncoid_mail.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: - - sanoid_syncoid_destination_host - - - name: template syncoid.timer - become: yes - ansible.builtin.template: - src: "syncoid.timer.j2" - dest: "/etc/systemd/system/syncoid.timer" - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - when: - - sanoid_syncoid_destination_host - - - name: enable syncoid.timer - become: yes - ansible.builtin.systemd: - name: "syncoid.timer" - enabled: yes - masked: no - state: started - notify: - - systemctl daemon-reload - when: - - sanoid_syncoid_destination_host diff --git a/roles/mgrote.zfs_sanoid/tasks/main.yml b/roles/mgrote.zfs_sanoid/tasks/main.yml deleted file mode 100644 index 9390048e..00000000 --- a/roles/mgrote.zfs_sanoid/tasks/main.yml +++ /dev/null @@ -1,64 +0,0 @@ ---- - - name: include user tasks - include_tasks: user.yml - - - name: install packages from repo - become: true - ansible.builtin.apt: - name: - - mbuffer - - lzop - - libcapture-tiny-perl - - pv - state: present - - - name: install packages from self-build - become: true - ansible.builtin.apt: - deb: "{{ sanoid_deb_url }}" - state: present - - - name: create sanoid directories - become: true - ansible.builtin.file: - path: "{{ item }}" - state: directory - owner: "{{ sanoid_user }}" - group: "{{ sanoid_user_group }}" - mode: 0700 - with_items: - - "/etc/sanoid" - - "/etc/sanoid/.ssh" - - - name: include snaps tasks - include_tasks: snaps.yml - when: - - sanoid_datasets is defined - - sanoid_templates is defined - - sanoid_snaps_enable is defined - - sanoid_snaps_enable - - - name: ensure service are started - become: true - ansible.builtin.systemd: - state: started - name: "{{ item }}" - daemon_reload: true - masked: false - enabled: yes - loop: - - sanoid.service - - sanoid-prune.service - - sanoid.timer - - - name: include source-host tasks - include_tasks: source.yml - when: - - sanoid_syncoid_source_host is defined and sanoid_syncoid_source_host is true - - sanoid_syncoid_ssh_pubkey is defined - - - name: include destination-host tasks - include_tasks: destination.yml - when: - - sanoid_syncoid_destination_host is defined and sanoid_syncoid_destination_host is true - - sanoid_syncoid_ssh_privkey is defined diff --git a/roles/mgrote.zfs_sanoid/tasks/snaps.yml b/roles/mgrote.zfs_sanoid/tasks/snaps.yml deleted file mode 100644 index 435a4b1c..00000000 --- a/roles/mgrote.zfs_sanoid/tasks/snaps.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - - name: Generate Sanoid Configuration - become: true - ansible.builtin.template: - src: sanoid.conf.j2 - dest: "/etc/sanoid/sanoid.conf" - owner: "{{ sanoid_user }}" - group: "{{ sanoid_user_group }}" - mode: 0400 - - - name: template sanoid_mail.service - become: yes - ansible.builtin.template: - src: "sanoid_mail.service.j2" - dest: /etc/systemd/system/sanoid_mail.service - owner: root - group: root - mode: 0644 - notify: - - systemctl daemon-reload - - - name: add sanoid_mail.service to sanoid.service - become: true - ansible.builtin.blockinfile: - create: yes - mode: 0644 - owner: root - group: root - path: /lib/systemd/system/sanoid.service.d/override.conf - block: | - [Unit] - OnFailure = sanoid_mail.service - notify: - - systemctl daemon-reload - - - name: set timer - become: true - ansible.builtin.blockinfile: - create: yes - mode: 0644 - owner: root - group: root - path: /lib/systemd/system/sanoid.timer.d/override.conf - block: | - [Timer] - OnCalendar = {{ sanoid_timer }} - when: sanoid_timer is defined - notify: - - systemctl daemon-reload diff --git a/roles/mgrote.zfs_sanoid/tasks/source.yml b/roles/mgrote.zfs_sanoid/tasks/source.yml deleted file mode 100644 index 6bb01030..00000000 --- a/roles/mgrote.zfs_sanoid/tasks/source.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- - - name: template ssh public key - become: true - ansible.posix.authorized_key: - user: "{{ sanoid_user }}" - key: "{{ sanoid_syncoid_ssh_pubkey }}" - state: present - when: - - sanoid_syncoid_source_host - - - name: add user to sudoers - become: true - ansible.builtin.blockinfile: - path: /etc/sudoers - state: present - block: | - {{ sanoid_user }} ALL=(ALL) NOPASSWD:ALL - validate: '/usr/sbin/visudo -cf %s' - backup: yes - marker_begin: sanoid-sudoers BEGIN - marker_end: sanoid-sudoers END - when: - - sanoid_syncoid_source_host diff --git a/roles/mgrote.zfs_sanoid/tasks/user.yml b/roles/mgrote.zfs_sanoid/tasks/user.yml deleted file mode 100644 index 80c02b23..00000000 --- a/roles/mgrote.zfs_sanoid/tasks/user.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- - - name: ensure group exists - become: true - ansible.builtin.group: - name: "{{ sanoid_user_group }}" - state: present - when: - - sanoid_user_group is defined - - sanoid_user is defined - - - name: ensure user exists - become: true - ansible.builtin.user: - name: "{{ sanoid_user }}" - group: "{{ sanoid_user_group }}" - create_home: yes - when: - - sanoid_user_group is defined - - sanoid_user is defined diff --git a/roles/mgrote.zfs_scrub/LICENSE b/roles/mgrote.zfs_scrub/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_scrub/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_scrub/defaults/main.yml b/roles/mgrote.zfs_scrub/defaults/main.yml deleted file mode 100644 index e453a8c3..00000000 --- a/roles/mgrote.zfs_scrub/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - zfs_extra_path_zpool: "/usr/sbin/zpool" diff --git a/roles/mgrote.zfs_scrub/tasks/main.yml b/roles/mgrote.zfs_scrub/tasks/main.yml deleted file mode 100644 index 8ab69285..00000000 --- a/roles/mgrote.zfs_scrub/tasks/main.yml +++ /dev/null @@ -1,84 +0,0 @@ ---- - - name: template unit-template - become: true - ansible.builtin.template: - src: zpool-scrub@.service.j2 - dest: /etc/systemd/system/zpool-scrub@.service - owner: root - group: root - mode: 0644 - register: template_unit - - - name: template timer - become: true - ansible.builtin.template: - src: zpool-scrub@.timer.j2 - dest: "/etc/systemd/system/zpool-scrub@{{ item.name }}.timer" - owner: root - group: root - mode: 0644 - loop: "{{ zfs_extra_zfs_pools }}" - register: template_timer - - - name: template mail.service - become: true - ansible.builtin.template: - src: zpool-scrub-mail.service.j2 - dest: "/etc/systemd/system/zpool-scrub-mail.service" - owner: root - group: root - mode: 0644 - register: template_mail - - - name: systemctl daemon-reload - become: yes - ansible.builtin.systemd: - daemon_reload: yes - when: - - template_unit.changed - - template_timer.changed - - - name: systemctl enable units - timer - become: yes - ansible.builtin.systemd: - name: "zpool-scrub@{{ item.name }}.timer" - enabled: yes - masked: no - loop: "{{ zfs_extra_zfs_pools }}" - when: - - template_unit.changed - - template_timer.changed - - - name: systemctl enable units - mail - become: yes - ansible.builtin.systemd: - name: "zpool-scrub-mail.service" - enabled: yes - masked: no - when: - - template_mail - - - name: systemctl start units - become: yes - ansible.builtin.systemd: - name: "zpool-scrub@{{ item.name }}.timer" - state: restarted - enabled: yes - loop: "{{ zfs_extra_zfs_pools }}" - when: - - template_unit.changed - - template_timer.changed - - - name: remove old cronjobs - become: yes - ansible.builtin.cron: - name: zfs-scrub - "{{ item.name }}" - state: absent - with_items: "{{ zfs_extra_zfs_pools }}" - - - name: remove proxmox system scrub job #https://forum.proxmox.com/threads/script-sequential-zfs-scrub-for-cron.25124/ - become: true - ansible.builtin.lineinfile: - path: /etc/cron.d/zfsutils-linux - state: absent - line: '24 0 8-14 * * root if [ $(date +\%w) -eq 0 ] && [ -x /usr/lib/zfs-linux/scrub ]; then /usr/lib/zfs-linux/scrub; fi' diff --git a/roles/mgrote.zfs_zed/LICENSE b/roles/mgrote.zfs_zed/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zfs_zed/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zfs_zed/handlers/main.yml b/roles/mgrote.zfs_zed/handlers/main.yml deleted file mode 100644 index b9dd0034..00000000 --- a/roles/mgrote.zfs_zed/handlers/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - - name: testmail - shell: echo "zed ist eingerichtet" | mail -s "{{ ansible_hostname }} - zed" {{ empfaenger_mail }} diff --git a/roles/mgrote.zfs_zed/tasks/main.yml b/roles/mgrote.zfs_zed/tasks/main.yml deleted file mode 100644 index bb8039f9..00000000 --- a/roles/mgrote.zfs_zed/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- - - name: kopiere zed.rc - become: yes - ansible.builtin.template: - owner: root - mode: 0600 - src: zed.rc - dest: /etc/zfs/zed.d/zed.rc - notify: testmail diff --git a/roles/mgrote.zswap/LICENSE b/roles/mgrote.zswap/LICENSE deleted file mode 100644 index e72bfdda..00000000 --- a/roles/mgrote.zswap/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/roles/mgrote.zswap/defaults/main.yml b/roles/mgrote.zswap/defaults/main.yml deleted file mode 100644 index d1879609..00000000 --- a/roles/mgrote.zswap/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- - zswap_path: "/sys/module/zswap/parameters/enabled" diff --git a/roles/mgrote.zswap/tasks/main.yml b/roles/mgrote.zswap/tasks/main.yml deleted file mode 100644 index ffe6ee93..00000000 --- a/roles/mgrote.zswap/tasks/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - - name: add zswap to crontab - ansible.builtin.cron: - name: "activate zswap" - special_time: reboot - job: "echo 1 > {{ zswap_path }}" diff --git a/roles/mgrote.apt_manage_packages/README.md b/roles/mgrote_apt_manage_packages/README.md similarity index 100% rename from roles/mgrote.apt_manage_packages/README.md rename to roles/mgrote_apt_manage_packages/README.md diff --git a/roles/mgrote_apt_manage_packages/defaults/main.yml b/roles/mgrote_apt_manage_packages/defaults/main.yml new file mode 100644 index 00000000..6afe8b53 --- /dev/null +++ b/roles/mgrote_apt_manage_packages/defaults/main.yml @@ -0,0 +1,35 @@ +--- +apt_packages_common: + - locales + - build-essential + - ntp + - htop + - git + - dnsutils + - nano + - mc + - cifs-utils + - netdiscover + - tree + - curl + - logrotate + - ncdu + - net-tools + - sysstat + - apt-transport-https + - neofetch + - ntpdate + - acl + - python3 + - vim +apt_packages_physical: + - hddtemp + - ipmitool + - powertop + - s-tui +apt_packages_vm: + - qemu-guest-agent + - open-vm-tools +apt_packages_extra: +apt_packages_absent: +apt_packages_internet: diff --git a/roles/mgrote_apt_manage_packages/tasks/main.yml b/roles/mgrote_apt_manage_packages/tasks/main.yml new file mode 100644 index 00000000..1dd66f7a --- /dev/null +++ b/roles/mgrote_apt_manage_packages/tasks/main.yml @@ -0,0 +1,41 @@ +--- +- name: install common-packages + become: true + ansible.builtin.package: + name: "{{ apt_packages_common }}" + state: present + +- name: install extra-packages + become: true + ansible.builtin.package: + name: "{{ apt_packages_extra }}" + state: present + when: apt_packages_extra is defined + +- name: install vm-packages + become: true + ansible.builtin.package: + name: "{{ apt_packages_vm }}" + state: present + when: ansible_virtualization_role == 'guest' + +- name: install physical-packages + become: true + ansible.builtin.package: + name: "{{ apt_packages_physical }}" + state: present + when: ansible_virtualization_role != 'guest' + +- name: install packages from the internet + become: true + ansible.builtin.apt: + deb: "{{ item }}" + state: present + when: apt_packages_internet is defined + loop: "{{ apt_packages_internet }}" + +- name: remove packages + become: true + ansible.builtin.package: + name: "{{ apt_packages_absent }}" + state: absent diff --git a/roles/mgrote.apt_manage_sources/README.md b/roles/mgrote_apt_manage_sources/README.md similarity index 100% rename from roles/mgrote.apt_manage_sources/README.md rename to roles/mgrote_apt_manage_sources/README.md diff --git a/roles/mgrote.apt_manage_sources/defaults/main.yml b/roles/mgrote_apt_manage_sources/defaults/main.yml similarity index 100% rename from roles/mgrote.apt_manage_sources/defaults/main.yml rename to roles/mgrote_apt_manage_sources/defaults/main.yml diff --git a/roles/mgrote_apt_manage_sources/handlers/main.yml b/roles/mgrote_apt_manage_sources/handlers/main.yml new file mode 100644 index 00000000..a720cc79 --- /dev/null +++ b/roles/mgrote_apt_manage_sources/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: update package lists # noqa no-handler + become: true + ansible.builtin.apt: + update_cache: true diff --git a/roles/mgrote.apt_manage_sources/tasks/main.yml b/roles/mgrote_apt_manage_sources/tasks/main.yml similarity index 96% rename from roles/mgrote.apt_manage_sources/tasks/main.yml rename to roles/mgrote_apt_manage_sources/tasks/main.yml index 1dca1032..7c7c6c7c 100644 --- a/roles/mgrote.apt_manage_sources/tasks/main.yml +++ b/roles/mgrote_apt_manage_sources/tasks/main.yml @@ -44,6 +44,9 @@ ansible.builtin.template: src: sources.j2 dest: "{{ repo_sources_file }}" + mode: "0644" + owner: root + group: root notify: update package lists when: - repos is defined diff --git a/roles/mgrote.apt_manage_sources/tasks/pbs.yml b/roles/mgrote_apt_manage_sources/tasks/pbs.yml similarity index 82% rename from roles/mgrote.apt_manage_sources/tasks/pbs.yml rename to roles/mgrote_apt_manage_sources/tasks/pbs.yml index 4de4f3ce..56d422b0 100644 --- a/roles/mgrote.apt_manage_sources/tasks/pbs.yml +++ b/roles/mgrote_apt_manage_sources/tasks/pbs.yml @@ -1,7 +1,7 @@ --- - name: check if pbs-no-subscription repo keys exists become: true - stat: + ansible.builtin.stat: path: "{{ manage_sources_pbs_apt_repo_key_path }}" register: pbs_no_subscription_repo_keys @@ -11,4 +11,4 @@ url: "{{ manage_sources_pbs_apt_repo_key_url }}" state: present notify: update package lists - when: pbs_no_subscription_repo_keys.stat.exists == false + when: not pbs_no_subscription_repo_keys.stat.exists diff --git a/roles/mgrote.apt_manage_sources/tasks/pve.yml b/roles/mgrote_apt_manage_sources/tasks/pve.yml similarity index 79% rename from roles/mgrote.apt_manage_sources/tasks/pve.yml rename to roles/mgrote_apt_manage_sources/tasks/pve.yml index f1da012a..e99c7b58 100644 --- a/roles/mgrote.apt_manage_sources/tasks/pve.yml +++ b/roles/mgrote_apt_manage_sources/tasks/pve.yml @@ -1,14 +1,14 @@ --- - name: check if pve-no-subscription repo keys exists become: true - stat: + ansible.builtin.stat: path: "{{ manage_sources_proxmox_apt_repo_key_path }}" register: pve_no_subscription_repo_keys - name: add pve-no-subscription repo keys - become: yes + become: true ansible.builtin.apt_key: url: "{{ manage_sources_proxmox_apt_repo_key_url }}" state: present notify: update package lists - when: pve_no_subscription_repo_keys.stat.exists == false + when: not pve_no_subscription_repo_keys.stat.exists diff --git a/roles/mgrote.apt_manage_sources/templates/sources.j2 b/roles/mgrote_apt_manage_sources/templates/sources.j2 similarity index 100% rename from roles/mgrote.apt_manage_sources/templates/sources.j2 rename to roles/mgrote_apt_manage_sources/templates/sources.j2 diff --git a/roles/mgrote.apt_manage_sources/vars/mint.yml b/roles/mgrote_apt_manage_sources/vars/mint.yml similarity index 100% rename from roles/mgrote.apt_manage_sources/vars/mint.yml rename to roles/mgrote_apt_manage_sources/vars/mint.yml diff --git a/roles/mgrote.apt_manage_sources/vars/pbs.yaml b/roles/mgrote_apt_manage_sources/vars/pbs.yaml similarity index 100% rename from roles/mgrote.apt_manage_sources/vars/pbs.yaml rename to roles/mgrote_apt_manage_sources/vars/pbs.yaml diff --git a/roles/mgrote.apt_manage_sources/vars/pve.yaml b/roles/mgrote_apt_manage_sources/vars/pve.yaml similarity index 100% rename from roles/mgrote.apt_manage_sources/vars/pve.yaml rename to roles/mgrote_apt_manage_sources/vars/pve.yaml diff --git a/roles/mgrote.apt_manage_sources/vars/ubuntu.yaml b/roles/mgrote_apt_manage_sources/vars/ubuntu.yaml similarity index 100% rename from roles/mgrote.apt_manage_sources/vars/ubuntu.yaml rename to roles/mgrote_apt_manage_sources/vars/ubuntu.yaml diff --git a/roles/mgrote.apt_update_packages/README.md b/roles/mgrote_apt_update_packages/README.md similarity index 100% rename from roles/mgrote.apt_update_packages/README.md rename to roles/mgrote_apt_update_packages/README.md diff --git a/roles/mgrote_apt_update_packages/tasks/main.yml b/roles/mgrote_apt_update_packages/tasks/main.yml new file mode 100644 index 00000000..6de8a546 --- /dev/null +++ b/roles/mgrote_apt_update_packages/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + +- name: update installed packages + become: true + ansible.builtin.package: + upgrade: dist diff --git a/roles/mgrote.cv4pve-autosnap/README.md b/roles/mgrote_cv4pve_autosnap/README.md similarity index 100% rename from roles/mgrote.cv4pve-autosnap/README.md rename to roles/mgrote_cv4pve_autosnap/README.md diff --git a/roles/mgrote_cv4pve_autosnap/defaults/main.yml b/roles/mgrote_cv4pve_autosnap/defaults/main.yml new file mode 100644 index 00000000..7445698c --- /dev/null +++ b/roles/mgrote_cv4pve_autosnap/defaults/main.yml @@ -0,0 +1,14 @@ +--- +# when should cv4pve be run +cv4pve_cron_minute: "39" +cv4pve_cron_hour: "5" +# proxmox api-token and user +cv4pve_api_token: "XXXXXXXXXXXXXXXXXXXXXX" +cv4pve_api_user: "root@pam!test2" +# which vm to snapshot +cv4pve_vmid: all +# how many snapshots to keep +cv4pve_keep_snapshots: 3 +# under which user the script is run +cv4pve_user_group: cv4pve +cv4pve_user: cv4pve diff --git a/roles/mgrote_cv4pve_autosnap/handlers/main.yml b/roles/mgrote_cv4pve_autosnap/handlers/main.yml new file mode 100644 index 00000000..1e4f40c0 --- /dev/null +++ b/roles/mgrote_cv4pve_autosnap/handlers/main.yml @@ -0,0 +1,26 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: systemctl enable units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + enabled: true + masked: false + with_items: + - cv4pve.service + - cv4pve_mail.service + - cv4pve.timer + +- name: systemctl start units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + state: restarted + enabled: true + with_items: + - cv4pve.timer + notify: systemctl daemon-reload diff --git a/roles/mgrote_cv4pve_autosnap/tasks/main.yml b/roles/mgrote_cv4pve_autosnap/tasks/main.yml new file mode 100644 index 00000000..9c9c6f6f --- /dev/null +++ b/roles/mgrote_cv4pve_autosnap/tasks/main.yml @@ -0,0 +1,75 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + + +- name: create directories + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ cv4pve_user }}" + group: "{{ cv4pve_user_group }}" + mode: "0644" + loop: + - '/tmp/cv4pve' + - '/usr/local/bin/cv4pve' + +- name: download archives + become: true + ansible.builtin.get_url: + url: "{{ cv4pve_dl_link }}" + dest: /tmp/cv4pve/cv4pve-autosnap-linux-x64.zip + mode: '0775' + owner: "{{ cv4pve_user }}" + group: "{{ cv4pve_user_group }}" + +- name: extract archives + become: true + ansible.builtin.unarchive: + src: /tmp/cv4pve/cv4pve-autosnap-linux-x64.zip + dest: /usr/local/bin/cv4pve + remote_src: true + mode: a+x + owner: "{{ cv4pve_user }}" + group: "{{ cv4pve_user_group }}" + +- name: template cv4pve.service + become: true + ansible.builtin.template: + src: cv4pve.service.j2 + dest: /etc/systemd/system/cv4pve.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: template cv4pve_mail.service + become: true + ansible.builtin.template: + src: cv4pve_mail.service.j2 + dest: /etc/systemd/system/cv4pve_mail.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: template cv4pve.timer + become: true + ansible.builtin.template: + src: cv4pve.timer.j2 + dest: /etc/systemd/system/cv4pve.timer + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: systemctl start cv4pve.timer + become: true + ansible.builtin.systemd: + name: cv4pve.timer + state: started + enabled: true diff --git a/roles/mgrote_cv4pve_autosnap/tasks/user.yml b/roles/mgrote_cv4pve_autosnap/tasks/user.yml new file mode 100644 index 00000000..f304dc92 --- /dev/null +++ b/roles/mgrote_cv4pve_autosnap/tasks/user.yml @@ -0,0 +1,19 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ cv4pve_user_group }}" + state: present + when: + - cv4pve_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ cv4pve_user }}" + group: "{{ cv4pve_user_group }}" + shell: /usr/sbin/nologin + create_home: false + when: + - cv4pve_user_group is defined + - cv4pve_user is defined diff --git a/roles/mgrote.cv4pve-autosnap/templates/cv4pve.service.j2 b/roles/mgrote_cv4pve_autosnap/templates/cv4pve.service.j2 similarity index 100% rename from roles/mgrote.cv4pve-autosnap/templates/cv4pve.service.j2 rename to roles/mgrote_cv4pve_autosnap/templates/cv4pve.service.j2 diff --git a/roles/mgrote.cv4pve-autosnap/templates/cv4pve.timer.j2 b/roles/mgrote_cv4pve_autosnap/templates/cv4pve.timer.j2 similarity index 100% rename from roles/mgrote.cv4pve-autosnap/templates/cv4pve.timer.j2 rename to roles/mgrote_cv4pve_autosnap/templates/cv4pve.timer.j2 diff --git a/roles/mgrote.cv4pve-autosnap/templates/cv4pve_mail.service.j2 b/roles/mgrote_cv4pve_autosnap/templates/cv4pve_mail.service.j2 similarity index 100% rename from roles/mgrote.cv4pve-autosnap/templates/cv4pve_mail.service.j2 rename to roles/mgrote_cv4pve_autosnap/templates/cv4pve_mail.service.j2 diff --git a/roles/mgrote_deactivate_caps/handlers/main.yml b/roles/mgrote_deactivate_caps/handlers/main.yml new file mode 100644 index 00000000..88170a60 --- /dev/null +++ b/roles/mgrote_deactivate_caps/handlers/main.yml @@ -0,0 +1,4 @@ +--- +- name: deactivate caps + become: true + ansible.builtin.command: setxkbmap -option caps:none # noqa no-changed-when diff --git a/roles/mgrote.deactivate_caps/readme.md b/roles/mgrote_deactivate_caps/readme.md similarity index 100% rename from roles/mgrote.deactivate_caps/readme.md rename to roles/mgrote_deactivate_caps/readme.md diff --git a/roles/mgrote_deactivate_caps/tasks/main.yml b/roles/mgrote_deactivate_caps/tasks/main.yml new file mode 100644 index 00000000..d94f611b --- /dev/null +++ b/roles/mgrote_deactivate_caps/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - x11-xkb-utils + state: present + notify: deactivate caps diff --git a/roles/mgrote.disable_oom_killer/README.md b/roles/mgrote_disable_oom_killer/README.md similarity index 100% rename from roles/mgrote.disable_oom_killer/README.md rename to roles/mgrote_disable_oom_killer/README.md diff --git a/roles/mgrote_disable_oom_killer/handlers/main.yml b/roles/mgrote_disable_oom_killer/handlers/main.yml new file mode 100644 index 00000000..c734b024 --- /dev/null +++ b/roles/mgrote_disable_oom_killer/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: disable oom-killer + become: true + ansible.builtin.command: echo 2 > /proc/sys/vm/overcommit_memory # noqa no-changed-when +... diff --git a/roles/mgrote_disable_oom_killer/tasks/main.yml b/roles/mgrote_disable_oom_killer/tasks/main.yml new file mode 100644 index 00000000..3f545dae --- /dev/null +++ b/roles/mgrote_disable_oom_killer/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- name: disable oom-killer in sysctl.conf (works after a reboot) + become: true + ansible.builtin.blockinfile: + path: /etc/sysctl.conf + block: | + vm.oom-kill = 0 + notify: disable oom-killer diff --git a/roles/mgrote.docker-compose-inline/README.md b/roles/mgrote_docker_compose_inline/README.md similarity index 100% rename from roles/mgrote.docker-compose-inline/README.md rename to roles/mgrote_docker_compose_inline/README.md diff --git a/roles/mgrote_docker_compose_inline/defaults/main.yml b/roles/mgrote_docker_compose_inline/defaults/main.yml new file mode 100644 index 00000000..d541a689 --- /dev/null +++ b/roles/mgrote_docker_compose_inline/defaults/main.yml @@ -0,0 +1,18 @@ +--- +# owner and group of all files and directories +compose_owner: "docker-user" +compose_group: "docker-user" +# default permissions for all files and directories +compose_file_permissions: "644" +compose_dir_permissions: "755" +# where to store the compose-files on the destination system +compose_dest_basedir: "/docker" # without trailing "/" +# where are the docker-compose-files located on the ansible controller +compose_src_basedir: "{{ inventory_dir }}/docker-compose" # without trailing "/" +# dict of compose-files to deploy +#compose_files: +# - name: hastebin # used for directory name; starting & stopping +# state: present +# #network: test_nw # external network (optional) +# - name: ara +# state: present diff --git a/roles/mgrote_docker_compose_inline/tasks/main.yml b/roles/mgrote_docker_compose_inline/tasks/main.yml new file mode 100644 index 00000000..8169c2d3 --- /dev/null +++ b/roles/mgrote_docker_compose_inline/tasks/main.yml @@ -0,0 +1,97 @@ +--- +- name: ensure basedir exists + become: true + ansible.builtin.file: + path: "{{ compose_dest_basedir }}" + state: directory + mode: "{{ compose_dir_permissions }}" + owner: "{{ compose_owner }}" + group: "{{ compose_group }}" + +# https://codeutility.org/ansible-can-the-templates-module-handle-multiple-templates-directories-stack-overflow/ +- name: copy all directories recursively + ansible.builtin.file: + dest: "{{ compose_dest_basedir }}/{{ item | replace(compose_src_basedir + '/', '') }}" + state: directory + mode: "{{ compose_dir_permissions }}" + owner: "{{ compose_owner }}" + group: "{{ compose_group }}" + with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type d').split('\n') }}" + +- name: copy all files recursively (can take a long time) + ansible.builtin.copy: + mode: "{{ compose_file_permissions }}" + owner: "{{ compose_owner }}" + group: "{{ compose_group }}" + src: "{{ item }}" + dest: "{{ compose_dest_basedir }}/{{ item | replace(compose_src_basedir + '/', '') }}" + with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type f -not -name *.j2 ').split('\n') }}" + no_log: true + +- name: copy templates files recursively + ansible.builtin.template: + mode: "{{ compose_file_permissions }}" + owner: "{{ compose_owner }}" + group: "{{ compose_group }}" + src: "{{ item }}" + dest: "{{ compose_dest_basedir }}/{{ item | replace(compose_src_basedir + '/', '') | replace('.j2', '') }}" + with_items: "{{ lookup('pipe', 'find '+ compose_src_basedir +'/ -type f -name *.j2').split('\n') }}" + register: copy_template + no_log: true + +# - name: print $copy_template +# ansible.builtin.debug: +# var: copy_template + +- name: create networks + become: true + ansible.builtin.command: "docker network create {{ item.network }}" # erstelle network + register: network_result # speichere ergebnis in var + changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 + ignore_errors: true # ignoriere fehler + loop: "{{ compose_files }}" + when: + - item.state == "present" + - item.network is defined + +- name: (re)start container + become: true + ansible.builtin.command: docker-compose up -d + args: + chdir: "{{ compose_dest_basedir }}/{{ item.name }}" + register: start_result # speichere ergebnis in var + changed_when: "start_result.rc == 0" # markiere tasks als changed when exit-code == 0 + loop: "{{ compose_files }}" + when: + - item.state == "present" + - copy_template is changed + +- name: stop old container + become: true + ansible.builtin.command: docker-compose down # noqa no-changed-when + args: + chdir: "{{ compose_dest_basedir }}/{{ item.name }}" + loop: "{{ compose_files }}" + when: + - item.state == "absent" + ignore_errors: true # noqa ignore-errors + +- name: remove old networks + become: true + ansible.builtin.command: "docker network remove {{ item.network }}" # erstelle network + register: network_result # speichere ergebnis in var + changed_when: "network_result.rc == 0" # markiere tasks als changed when exit-code == 0 + ignore_errors: true # noqa ignore-errors + loop: "{{ compose_files }}" + when: + - item.state == "absent" + - item.network is defined + +- name: remove old docker-compose files & directories + become: true + ansible.builtin.file: + path: "{{ compose_dest_basedir }}/{{ item.name }}/" + state: absent + loop: "{{ compose_files }}" + when: + - item.state == "absent" diff --git a/roles/mgrote.dokuwiki/README.md b/roles/mgrote_dokuwiki/README.md similarity index 100% rename from roles/mgrote.dokuwiki/README.md rename to roles/mgrote_dokuwiki/README.md diff --git a/roles/mgrote_dokuwiki/defaults/main.yml b/roles/mgrote_dokuwiki/defaults/main.yml new file mode 100644 index 00000000..7d2904f5 --- /dev/null +++ b/roles/mgrote_dokuwiki/defaults/main.yml @@ -0,0 +1,6 @@ +--- +dokuwiki_install_path: /var/www/dokuwiki # wohin soll dokuwiki installiert werden +dokuwiki_download_url: https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz # wo soll dokuwiki heruntergeladen werden +dokuwiki_version_name: 2020-07-29 "Hogfather" # aus /var/www/dokuwiki/VERSION # welche Version, damit wird abgeglichen ob das Archiv heruntergeladen werden muss +dokuwiki_user: www-data # dokuwiki nutzer +dokuwiki_group: www-data # dokuwiki gruppe diff --git a/roles/mgrote_dokuwiki/handlers/main.yml b/roles/mgrote_dokuwiki/handlers/main.yml new file mode 100644 index 00000000..f7086e0e --- /dev/null +++ b/roles/mgrote_dokuwiki/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart_apache2 + become: true + ansible.builtin.systemd: + name: apache2 + state: restarted + enabled: true diff --git a/roles/mgrote_dokuwiki/tasks/apache2.yml b/roles/mgrote_dokuwiki/tasks/apache2.yml new file mode 100644 index 00000000..cbe57965 --- /dev/null +++ b/roles/mgrote_dokuwiki/tasks/apache2.yml @@ -0,0 +1,27 @@ +--- +# aktiviert das module rewrite = a2enmod rewrite +- name: activate a2enmod rewrite + become: true + ansible.builtin.apache2_module: + state: present + name: rewrite + +- name: copy default apache2.conf + become: true + ansible.builtin.template: + src: "apache2.conf" + dest: "/etc/apache2/apache2.conf" + mode: "0644" + owner: root + group: root + notify: restart_apache2 + +- name: copy 000-default.conf + become: true + ansible.builtin.template: + src: "000-default.conf" + dest: "/etc/apache2/sites-enabled/000-default.conf" + mode: "0644" + owner: root + group: root + notify: restart_apache2 diff --git a/roles/mgrote_dokuwiki/tasks/dokuwiki.yml b/roles/mgrote_dokuwiki/tasks/dokuwiki.yml new file mode 100644 index 00000000..dd9d6306 --- /dev/null +++ b/roles/mgrote_dokuwiki/tasks/dokuwiki.yml @@ -0,0 +1,73 @@ +--- +- name: create dokuwiki install path + become: true + ansible.builtin.file: + path: "{{ dokuwiki_install_path }}" + state: directory + owner: "{{ dokuwiki_user }}" + group: "{{ dokuwiki_group }}" + mode: "0744" + +- name: check if dokuwiki is installed + become: true + ansible.builtin.stat: + path: /var/www/dokuwiki/VERSION + register: dokuwiki_install_status + +- name: check if desired version is installed + become: true + ignore_errors: true + ansible.builtin.lineinfile: + path: /var/www/dokuwiki/VERSION + line: "{{ dokuwiki_version_name }}" + state: present + check_mode: true + register: dokuwiki_desired_version + when: + - dokuwiki_install_status.stat.exists + # falls Dokuwiki schon installiert ist existiert var/www/dokuwiki/VERSION mit + # dem Inhalt der Version: z.B. 2020-07-29 "Hogfather" + # when die Version die selbe wie in der Variable ist + # ist der status ok, ist die Version unterschiedlich ist der status changed, die Datei + # selber wird aber nicht geändert weil check_mode gleich yes ist + # das Ergebnis wird in der Variable dokuwiki_desired_version gespeichert + # https://raymii.org/s/tutorials/Ansible_-_Only-do-something-if-another-action-changed.html + +- name: download latest dokuwiki archive & unarchive to {{ dokuwiki_install_path }} + become: true + ansible.builtin.unarchive: + src: "{{ dokuwiki_download_url }}" + dest: "{{ dokuwiki_install_path }}" + remote_src: true + extra_opts: [--strip-components=1] # entfernt die erste Ebene des Archives + owner: "{{ dokuwiki_user }}" + mode: "0744" + when: + - (dokuwiki_desired_version.changed) or + (not dokuwiki_install_status.stat.exists) + # Dise Variable wird hier abgefragt, so wird das Paket nur heruntergeladen wenn die + # Version Unterschiedlich ist + +- name: Remove default plugins + become: true + ansible.builtin.file: + path: '{{ dokuwiki_install_path }}/lib/plugins/{{ item }}' + state: absent + with_items: + - authpdo + - authmysql + - authpgsql + - authad + +- name: Change file ownership, group and permissions + become: true + ansible.builtin.file: + path: "{{ dokuwiki_install_path }}" + owner: "{{ dokuwiki_user }}" + group: "{{ dokuwiki_group }}" + mode: "0744" + +- name: remove installer + ansible.builtin.file: + path: "{{ dokuwiki_install_path }}/install.php" + state: absent diff --git a/roles/mgrote_dokuwiki/tasks/install.yml b/roles/mgrote_dokuwiki/tasks/install.yml new file mode 100644 index 00000000..0aa794bd --- /dev/null +++ b/roles/mgrote_dokuwiki/tasks/install.yml @@ -0,0 +1,13 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - php + - php-mbstring + - php-xml + - apache2 + - libapache2-mod-php + - php-xml + - php-gd + state: present diff --git a/roles/mgrote_dokuwiki/tasks/main.yml b/roles/mgrote_dokuwiki/tasks/main.yml new file mode 100644 index 00000000..247fb7bd --- /dev/null +++ b/roles/mgrote_dokuwiki/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: include install tasks + ansible.builtin.include_tasks: install.yml +- name: include apache2 tasks + ansible.builtin.include_tasks: apache2.yml +- name: include dokuwiki tasks + ansible.builtin.include_tasks: dokuwiki.yml diff --git a/roles/mgrote.dokuwiki/templates/000-default.conf b/roles/mgrote_dokuwiki/templates/000-default.conf similarity index 100% rename from roles/mgrote.dokuwiki/templates/000-default.conf rename to roles/mgrote_dokuwiki/templates/000-default.conf diff --git a/roles/mgrote.dokuwiki/templates/apache2.conf b/roles/mgrote_dokuwiki/templates/apache2.conf similarity index 100% rename from roles/mgrote.dokuwiki/templates/apache2.conf rename to roles/mgrote_dokuwiki/templates/apache2.conf diff --git a/roles/mgrote.dotfiles/README.md b/roles/mgrote_dotfiles/README.md similarity index 100% rename from roles/mgrote.dotfiles/README.md rename to roles/mgrote_dotfiles/README.md diff --git a/roles/mgrote_dotfiles/defaults/main.yml b/roles/mgrote_dotfiles/defaults/main.yml new file mode 100644 index 00000000..aa3594b7 --- /dev/null +++ b/roles/mgrote_dotfiles/defaults/main.yml @@ -0,0 +1,11 @@ +--- +dotfiles_repo_url: https://git.mgrote.net/mg/dotfiles # url zum repo +dotfiles_repo_path: /home/mg/dotfiles # wo soll das repo lokal gespeichert werden +dotfiles_repo_branch: master #default branch for checking out +dotfiles_files: # welche dateien sollen wohin verlinkt werden (ln -s) + - repo_path: "{{ dotfiles_repo_path }}/.vimrc" + local_path: "/home/mg/.vimrc" +dotfiles_dirs: # welche ordner sollen erstellt werden + - path: /home/mg/.config/i3 + - path: /home/mg/.config/polybar +dotfiles_owner: mg # chown diff --git a/roles/mgrote_dotfiles/handlers/main.yml b/roles/mgrote_dotfiles/handlers/main.yml new file mode 100644 index 00000000..ff6002c0 --- /dev/null +++ b/roles/mgrote_dotfiles/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: set owner recursive for repo + ansible.builtin.file: + path: "{{ dotfiles_repo_path }}" + owner: "{{ dotfiles_owner }}" + group: "{{ dotfiles_owner }}" + recurse: true +... diff --git a/roles/mgrote_dotfiles/tasks/main.yml b/roles/mgrote_dotfiles/tasks/main.yml new file mode 100644 index 00000000..df3e99fc --- /dev/null +++ b/roles/mgrote_dotfiles/tasks/main.yml @@ -0,0 +1,57 @@ +--- +- name: install acl package + become: true + ansible.builtin.package: + name: acl + state: present + +- name: check if repo exists + ansible.builtin.stat: + path: "{{ dotfiles_repo_path }}" + register: repo_exists + +- name: set safe directory + become: true + ansible.builtin.command: # noqa command-instead-of-module + cmd: git config --global --add safe.directory "{{ dotfiles_repo_path }}" + changed_when: false + +- name: stash changes + ansible.builtin.command: git stash # noqa command-instead-of-module no-handler + args: + chdir: "{{ dotfiles_repo_path }}" + changed_when: false + when: repo_exists.stat.exists + +- name: Ensure dotfiles repository is cloned locally. + ansible.builtin.git: + repo: "{{ dotfiles_repo_url }}" + dest: "{{ dotfiles_repo_path }}" + depth: 1 + version: "{{ dotfiles_repo_branch }}" + notify: set owner recursive for repo + +- name: Ensure needed dirs exist. + ansible.builtin.file: + path: "{{ item.path }}" + state: directory + owner: "{{ dotfiles_owner }}" + group: "{{ dotfiles_owner }}" + mode: "0644" + with_items: "{{ dotfiles_dirs }}" + +- name: Link dotfiles into home folder + ansible.builtin.file: + src: "{{ item.repo_path }}" + dest: "{{ item.local_path }}" + state: link + force: true + owner: "{{ dotfiles_owner }}" + group: "{{ dotfiles_owner }}" + with_items: "{{ dotfiles_files }}" + +- name: add .bash_extra to .bashrc + ansible.builtin.lineinfile: + path: /home/{{ dotfiles_owner }}/.bashrc + line: "source {{ dotfiles_repo_path }}/.bash_extra" + state: present diff --git a/roles/mgrote.exa/README.md b/roles/mgrote_exa/README.md similarity index 100% rename from roles/mgrote.exa/README.md rename to roles/mgrote_exa/README.md diff --git a/roles/mgrote_exa/defaults/main.yml b/roles/mgrote_exa/defaults/main.yml new file mode 100644 index 00000000..75810243 --- /dev/null +++ b/roles/mgrote_exa/defaults/main.yml @@ -0,0 +1,2 @@ +--- +exa_url: https://github.com/ogham/exa/releases/download/v0.10.1/exa-linux-x86_64-v0.10.1.zip diff --git a/roles/mgrote_exa/tasks/main.yml b/roles/mgrote_exa/tasks/main.yml new file mode 100644 index 00000000..9c1833e5 --- /dev/null +++ b/roles/mgrote_exa/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: download & extract exa + become: true + ansible.builtin.unarchive: + src: "{{ exa_url }}" + dest: /usr/local/ + remote_src: true + owner: root + group: root + mode: "0755" diff --git a/roles/mgrote.fail2ban/README.md b/roles/mgrote_fail2ban/README.md similarity index 100% rename from roles/mgrote.fail2ban/README.md rename to roles/mgrote_fail2ban/README.md diff --git a/roles/mgrote_fail2ban/defaults/main.yml b/roles/mgrote_fail2ban/defaults/main.yml new file mode 100644 index 00000000..bd8fed0e --- /dev/null +++ b/roles/mgrote_fail2ban/defaults/main.yml @@ -0,0 +1,8 @@ +--- +# Werte in Sekunden +f2b_bantime: 60 +f2b_findtime: 600 +f2b_maxretry: 5 +f2b_destemail: michael.grote@posteo.de +f2b_sender: info@mgrote.net +f2b_send_email_report: true diff --git a/roles/mgrote_fail2ban/handlers/main.yml b/roles/mgrote_fail2ban/handlers/main.yml new file mode 100644 index 00000000..54d4f134 --- /dev/null +++ b/roles/mgrote_fail2ban/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart_f2b + become: true + ansible.builtin.systemd: + name: fail2ban + enabled: true + state: restarted diff --git a/roles/mgrote_fail2ban/tasks/main.yml b/roles/mgrote_fail2ban/tasks/main.yml new file mode 100644 index 00000000..6c119612 --- /dev/null +++ b/roles/mgrote_fail2ban/tasks/main.yml @@ -0,0 +1,22 @@ +--- +- name: install fail2ban-packages + become: true + ansible.builtin.package: + name: fail2ban + state: present + +- name: copy jail.local + become: true + ansible.builtin.template: + src: jail.local + dest: /etc/fail2ban/jail.local + mode: "0750" + notify: restart_f2b + +- name: copy sendmail-common.local + become: true + ansible.builtin.template: + src: sendmail-common.local + dest: /etc/fail2ban/action.d/sendmail-common.local + mode: "0750" + notify: restart_f2b diff --git a/roles/mgrote.fail2ban/templates/jail.local b/roles/mgrote_fail2ban/templates/jail.local similarity index 100% rename from roles/mgrote.fail2ban/templates/jail.local rename to roles/mgrote_fail2ban/templates/jail.local diff --git a/roles/mgrote.fail2ban/templates/sendmail-common.local b/roles/mgrote_fail2ban/templates/sendmail-common.local similarity index 100% rename from roles/mgrote.fail2ban/templates/sendmail-common.local rename to roles/mgrote_fail2ban/templates/sendmail-common.local diff --git a/roles/mgrote.fileserver_smb/README.md b/roles/mgrote_fileserver_smb/README.md similarity index 100% rename from roles/mgrote.fileserver_smb/README.md rename to roles/mgrote_fileserver_smb/README.md diff --git a/roles/mgrote_fileserver_smb/defaults/main.yml b/roles/mgrote_fileserver_smb/defaults/main.yml new file mode 100644 index 00000000..166b4d02 --- /dev/null +++ b/roles/mgrote_fileserver_smb/defaults/main.yml @@ -0,0 +1,107 @@ +--- +# Global SMB options +## "smb_global_options" = dict +## -option: "smbd option name" <-- value +## value: "smbd value" <-- value +## neue Optionen konnen einfach angehangen werden bzw. alte entfernt werden +smb_global_options: + - option: min protocol + value: "SMB2_02" + - option: client min protocol + value: "SMB2_02" + - option: client max protocol + value: "SMB3_00" + - option: log level + value: "1" + - option: log file + value: "/var/log/samba/log" + - option: max log size + value: "1000" + - option: logging + value: "syslog" + - option: panic action + value: "/usr/share/samba/panic-action_%d" + - option: passdb backend + value: "tdbsam" + - option: obey pam restrictions + value: "no" + - option: unix password sync + value: "no" + - option: passwd program + value: "/usr/bin/passwd_%u" + - option: passwd chat + value: '*Enter\snew\s*\spassword:*_%n\n_*Retype\snew\s*\spassword:*_%n\n_*password\supdated\ssuccessfully*_.' + - option: pam password change + value: "yes" + - option: guest account + value: "nobody" + - option: load printers + value: "no" + - option: unix extensions + value: "yes" + - option: wide links + value: "no" + - option: create mask + value: "0777" + - option: directory mask + value: "0777" + - option: map to guest + value: "Bad User" + - option: use sendfile + value: "yes" + - option: aio read size + value: "16384" + - option: aio write size + value: "16384" + - option: local master + value: "yes" + - option: time server + value: "no" + - option: wins support + value: "no" + - option: acl allow execute always + value: "yes" + - option: force user + value: "root" + - option: force group + value: "users" + - option: workgroup + value: WORKGROUP + - option: server string + value: "%h_server" + +# packages +smb_packages: + - samba + - cifs-utils + - samba-common + - samba-common-bin + - samba-vfs-modules + +# zfs-snapshots einbinden +## als \.zfs\snapshot einbinden +## sorgt dafur das statt "A0KDC9~F" die Ordnernamen als "autosnap_2021-11-04_23÷59÷02_daily" angezeigt werden +## https://www.samba.org/samba/docs/current/man-html/vfs_catia.8.html +# aktiv? +smb_enable_snapshots_dir: true +# welche Character/zeichen-Ersetzungen soll catia ausführen +smb_catia_mappings: "0x3a:0xf7" # ersetzt ":" durch "÷" + +# als Windows-Shattenkopien einbinden +## https://www.samba.org/samba/docs/current/man-html/vfs_shadow_copy2.8.html +## BUG: Windows sieht die Schattenkopien, kann die Ausgewählte Datei aber nicht öffnen wenn sie seit dem Snapshot gelöscht wurde, vmtl da Windows nicht den kompletten Snapshot-Pfad verwendet +## Format ist passend fur sanoid-Snapshots +# aktiv? +smb_enable_snapshots_shadow: false +# wo liegen die Snapshots +smb_shadow_snapdir: ".zfs/snapshot" +# Sortierung +smb_shadow_sort: "desc" +# Datumsformat der Snapshots +smb_shadow_format: "_%Y-%m-%d_%H:%M:%S" +# Snapshot-Präfix +smb_shadow_snapprefix: "^autosnap" +# Snapshot-"Trenner" +smb_shadow_delimiter: "_" +# zeitformat Snapshots +smb_shadow_localtime: "no" diff --git a/roles/mgrote_fileserver_smb/handlers/main.yml b/roles/mgrote_fileserver_smb/handlers/main.yml new file mode 100644 index 00000000..d73e894c --- /dev/null +++ b/roles/mgrote_fileserver_smb/handlers/main.yml @@ -0,0 +1,15 @@ +--- +- name: restart smbd + become: true + ansible.builtin.systemd: + name: smbd + enabled: true + state: restarted + +- name: set samba passwords + become: true + ansible.builtin.shell: "printf '{{ item.password }}\n{{ item.password }}\n' | smbpasswd -a {{ item.name }}" # noqa no-changed-when risky-shell-pipe + #pipefail: https://blog.christophersmart.com/2019/09/28/using-pipefail-with-shell-module-in-ansible/ + with_items: + - "{{ smb_users }}" + no_log: true diff --git a/roles/mgrote_fileserver_smb/tasks/main.yml b/roles/mgrote_fileserver_smb/tasks/main.yml new file mode 100644 index 00000000..6efeb2da --- /dev/null +++ b/roles/mgrote_fileserver_smb/tasks/main.yml @@ -0,0 +1,11 @@ +--- +- name: include install tasks + ansible.builtin.include_tasks: packages.yml + +- name: include user tasks + ansible.builtin.include_tasks: users.yml + when: smb_users is defined + +- name: include share tasks + ansible.builtin.include_tasks: shares.yml + when: smb_shares is defined diff --git a/roles/mgrote_fileserver_smb/tasks/packages.yml b/roles/mgrote_fileserver_smb/tasks/packages.yml new file mode 100644 index 00000000..b518abba --- /dev/null +++ b/roles/mgrote_fileserver_smb/tasks/packages.yml @@ -0,0 +1,6 @@ +--- +- name: ensure packages are installed + become: true + ansible.builtin.package: + name: "{{ smb_packages }}" + state: present diff --git a/roles/mgrote_fileserver_smb/tasks/shares.yml b/roles/mgrote_fileserver_smb/tasks/shares.yml new file mode 100644 index 00000000..13e777e0 --- /dev/null +++ b/roles/mgrote_fileserver_smb/tasks/shares.yml @@ -0,0 +1,24 @@ +--- +- name: ensure smb share directories exist + become: true + ansible.builtin.file: + path: "{{ item.path }}" + state: directory + mode: "0777" + loop: "{{ smb_shares }}" + notify: set samba passwords + +- name: template share configuration + become: true + ansible.builtin.template: + src: smb.conf.j2 + dest: /etc/samba/smb.conf + validate: 'testparm -s %s' + mode: "0644" + owner: root + group: root + with_items: + - "{{ smb_shares }}" + notify: + - restart smbd + - set samba passwords diff --git a/roles/mgrote_fileserver_smb/tasks/users.yml b/roles/mgrote_fileserver_smb/tasks/users.yml new file mode 100644 index 00000000..2dafe2be --- /dev/null +++ b/roles/mgrote_fileserver_smb/tasks/users.yml @@ -0,0 +1,18 @@ +--- +- name: ensure group exist + become: true + ansible.builtin.group: + name: smb_users + state: present + +- name: configure linux-users + become: true + ansible.builtin.user: + name: "{{ item.name }}" + group: smb_users + state: "{{ item.state | default('present') }}" + remove: "{{ item.remove_dir | default('false') }}" + create_home: false + loop: "{{ smb_users }}" + no_log: true + notify: set samba passwords diff --git a/roles/mgrote.fileserver_smb/templates/smb.conf.j2 b/roles/mgrote_fileserver_smb/templates/smb.conf.j2 similarity index 100% rename from roles/mgrote.fileserver_smb/templates/smb.conf.j2 rename to roles/mgrote_fileserver_smb/templates/smb.conf.j2 diff --git a/roles/mgrote.fluxcd/README.md b/roles/mgrote_fluxcd/README.md similarity index 100% rename from roles/mgrote.fluxcd/README.md rename to roles/mgrote_fluxcd/README.md diff --git a/roles/mgrote_fluxcd/defaults/main.yml b/roles/mgrote_fluxcd/defaults/main.yml new file mode 100644 index 00000000..3625d9fc --- /dev/null +++ b/roles/mgrote_fluxcd/defaults/main.yml @@ -0,0 +1,16 @@ +--- +flux_repo_host: gitea.grote.lan +flux_repo_host_port: 2222 +flux_repo_branch: master +flux_repo_url_complete: "ssh://gitea@{{ flux_repo_host }}:{{ flux_repo_host_port }}/mg/manifests.git" +flux_install_host: k3s1.grote.lan +flux_homedir: /home/flux +flux_path_ssh_dir: /home/flux/.ssh +flux_user_group: flux +flux_user: flux +flux_download_url: https://github.com/fluxcd/flux2/releases/download/v0.35.0/flux_0.35.0_linux_amd64.tar.gz +flux_path_bin: /usr/local/sbin +flux_path_ssh_id_file: id_rsa +flux_ssh_key_format: ed25519 +kubeconfig: /etc/rancher/k3s/k3s.yaml +flux_sync_interval: 1m diff --git a/roles/mgrote_fluxcd/handlers/main.yml b/roles/mgrote_fluxcd/handlers/main.yml new file mode 100644 index 00000000..5c940470 --- /dev/null +++ b/roles/mgrote_fluxcd/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: flux install + ansible.builtin.command: "{{ flux_homedir }}/bootstrap.sh" # noqa no-changed-when + become_user: "{{ flux_user }}" + become: true +... diff --git a/roles/mgrote_fluxcd/tasks/main.yml b/roles/mgrote_fluxcd/tasks/main.yml new file mode 100644 index 00000000..d8379aef --- /dev/null +++ b/roles/mgrote_fluxcd/tasks/main.yml @@ -0,0 +1,93 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + +- name: check if flux is installed + ansible.builtin.command: which flux + changed_when: false + failed_when: flux_installed.rc not in [0,1] + register: flux_installed + +- name: download flux binary + ansible.builtin.unarchive: + src: "{{ flux_download_url }}" + dest: "{{ flux_path_bin }}" + mode: "0755" + owner: "{{ flux_user }}" + group: "{{ flux_user_group }}" + remote_src: true + creates: "{{ flux_path_bin }}/flux" + when: flux_installed.rc not in [ 0 ] + +- name: install bash-completion packages + become: true + ansible.builtin.package: + name: bash-completion + state: present + +- name: activate autocompletion for flux + become: true + ansible.builtin.shell: + cmd: "set -o pipefail && flux completion bash | sudo tee /etc/bash_completion.d/flux" + executable: /bin/bash + args: + creates: /etc/bash_completion.d/flux + +- name: install flux + # der ganze block nur auf einem host + run_once: true + when: ansible_host == flux_install_host + block: + - name: ensure .ssh directory exists + ansible.builtin.file: + path: "{{ flux_path_ssh_dir }}" + owner: "{{ flux_user }}" + group: "{{ flux_user_group }}" + mode: "0400" + state: directory + + - name: check if OpenSSH keypair exists + ansible.builtin.stat: + path: "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}" + register: ssh_exist + + - name: generate SSH keypair + community.crypto.openssh_keypair: + path: "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}" + owner: "{{ flux_user }}" + group: "{{ flux_user_group }}" + mode: "0400" + type: "{{ flux_ssh_key_format }}" + when: not ssh_exist.stat.exists + register: create_ssh_key + + - name: get publickey + ansible.builtin.command: cat "{{ flux_path_ssh_dir }}/{{ flux_path_ssh_id_file }}.pub" # noqa no-handler no-changed-when + when: create_ssh_key.changed + register: ssh_public_key + + - name: show publickey # noqa no-handler + ansible.builtin.debug: + msg: "{{ ssh_public_key.stdout }}" + when: create_ssh_key.changed + + - name: copy publickey to gitea as deploy-key WITH write-permissions! # noqa no-handler no-changed-when + ansible.builtin.pause: + prompt: "Make sure the key is saved!" + when: create_ssh_key.changed + + - name: set permissions for $kubeconfig + ansible.builtin.file: + path: "{{ kubeconfig }}" + owner: root + group: root + mode: "0640" + + - name: template bootstrap script + ansible.builtin.template: + src: bootstrap.sh + dest: "{{ flux_homedir }}/bootstrap.sh" + mode: "0544" + owner: "{{ flux_user }}" + group: "{{ flux_user_group }}" + notify: flux install diff --git a/roles/mgrote_fluxcd/tasks/user.yml b/roles/mgrote_fluxcd/tasks/user.yml new file mode 100644 index 00000000..656fd69f --- /dev/null +++ b/roles/mgrote_fluxcd/tasks/user.yml @@ -0,0 +1,18 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ flux_user_group }}" + state: present + when: + - flux_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ flux_user }}" + group: "{{ flux_user_group }}" + create_home: false + when: + - flux_user_group is defined + - flux_user is defined diff --git a/roles/mgrote.fluxcd/templates/bootstrap.sh b/roles/mgrote_fluxcd/templates/bootstrap.sh similarity index 100% rename from roles/mgrote.fluxcd/templates/bootstrap.sh rename to roles/mgrote_fluxcd/templates/bootstrap.sh diff --git a/roles/mgrote.fwupd_settings/README.md b/roles/mgrote_fwupd_settings/README.md similarity index 100% rename from roles/mgrote.fwupd_settings/README.md rename to roles/mgrote_fwupd_settings/README.md diff --git a/roles/mgrote_fwupd_settings/defaults/main.yml b/roles/mgrote_fwupd_settings/defaults/main.yml new file mode 100644 index 00000000..57b98e89 --- /dev/null +++ b/roles/mgrote_fwupd_settings/defaults/main.yml @@ -0,0 +1,2 @@ +--- +fwupd_dynamic_user: false diff --git a/roles/mgrote_fwupd_settings/handlers/main.yml b/roles/mgrote_fwupd_settings/handlers/main.yml new file mode 100644 index 00000000..efd7dfbc --- /dev/null +++ b/roles/mgrote_fwupd_settings/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + state: restarted + daemon_reload: true + name: fwupd-refresh.service diff --git a/roles/mgrote_fwupd_settings/tasks/main.yml b/roles/mgrote_fwupd_settings/tasks/main.yml new file mode 100644 index 00000000..04a428e5 --- /dev/null +++ b/roles/mgrote_fwupd_settings/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: gather service facts + ansible.builtin.service_facts: + +- name: set DynamicUser=no + ansible.builtin.blockinfile: + path: /etc/systemd/system/fwupd-refresh.service.d/override.conf + block: | + [Service] + DynamicUser=no + create: true + mode: "0644" + owner: root + group: root + when: + - "not fwupd_dynamic_user and 'fwupd-refresh.service' in services" + notify: systemctl daemon-reload diff --git a/roles/mgrote.k8s_autocompletion/README.md b/roles/mgrote_k8s_autocompletion/README.md similarity index 100% rename from roles/mgrote.k8s_autocompletion/README.md rename to roles/mgrote_k8s_autocompletion/README.md diff --git a/roles/mgrote_k8s_autocompletion/tasks/main.yml b/roles/mgrote_k8s_autocompletion/tasks/main.yml new file mode 100644 index 00000000..f170ab0d --- /dev/null +++ b/roles/mgrote_k8s_autocompletion/tasks/main.yml @@ -0,0 +1,14 @@ +--- +- name: install bash-completion packages + become: true + ansible.builtin.package: + name: bash-completion + state: present + +- name: activate autocompletion for kubectl + become: true + ansible.builtin.shell: + cmd: "set -o pipefail && kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl" + executable: /bin/bash + args: + creates: /etc/bash_completion.d/kubectl diff --git a/roles/mgrote.k8s_misc/README.md b/roles/mgrote_k8s_misc/README.md similarity index 100% rename from roles/mgrote.k8s_misc/README.md rename to roles/mgrote_k8s_misc/README.md diff --git a/roles/mgrote_k8s_misc/tasks/main.yml b/roles/mgrote_k8s_misc/tasks/main.yml new file mode 100644 index 00000000..5a8d2cc4 --- /dev/null +++ b/roles/mgrote_k8s_misc/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: set $KUBECONFIG for root + ansible.builtin.blockinfile: + path: /root/.bashrc + block: | + export KUBECONFIG=/etc/rancher/k3s/k3s.yaml + marker: "# {mark} ANSIBLE MANAGED BLOCK - K3S" diff --git a/roles/mgrote.mount_cifs/README.md b/roles/mgrote_mount_cifs/README.md similarity index 100% rename from roles/mgrote.mount_cifs/README.md rename to roles/mgrote_mount_cifs/README.md diff --git a/roles/mgrote_mount_cifs/defaults/main.yml b/roles/mgrote_mount_cifs/defaults/main.yml new file mode 100644 index 00000000..b43d1b55 --- /dev/null +++ b/roles/mgrote_mount_cifs/defaults/main.yml @@ -0,0 +1,12 @@ +--- +cifs_mounts: + - name: pve_backup_mount_fileserver3 + type: cifs + state: absent + dest: /pve_backup_mount + src: //fileserver3.grote.lan/proxmox + user: pve + password: XXXXXXXXXXXXXXX + domain: grote.lan + uid: 1000 + gid: 1000 diff --git a/roles/mgrote_mount_cifs/handlers/main.yml b/roles/mgrote_mount_cifs/handlers/main.yml new file mode 100644 index 00000000..c22b27fb --- /dev/null +++ b/roles/mgrote_mount_cifs/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: reboot + become: true + ansible.builtin.reboot: + reboot_timeout: 120 diff --git a/roles/mgrote_mount_cifs/meta/main.yml b/roles/mgrote_mount_cifs/meta/main.yml new file mode 100644 index 00000000..ad6b4c77 --- /dev/null +++ b/roles/mgrote_mount_cifs/meta/main.yml @@ -0,0 +1,3 @@ +--- +collections: + - ansible.posix diff --git a/roles/mgrote_mount_cifs/tasks/main.yml b/roles/mgrote_mount_cifs/tasks/main.yml new file mode 100644 index 00000000..3b8fa820 --- /dev/null +++ b/roles/mgrote_mount_cifs/tasks/main.yml @@ -0,0 +1,41 @@ +--- +- name: install cifs-utils + become: true + ansible.builtin.package: + name: cifs-utils + state: present + +- name: create mount directory + become: true + ansible.builtin.file: + path: "{{ item.dest }}" + state: directory + mode: "0777" + loop: "{{ cifs_mounts }}" + no_log: true + +- name: create credential-file + become: true + ansible.builtin.template: + src: smb_passwords + dest: /root/.smb_passwords_{{ item.name }} + owner: root + group: root + mode: '0400' + loop: "{{ cifs_mounts }}" + no_log: true + +- name: mount cifs volumes + become: true + ansible.posix.mount: + src: "{{ item.src }}" + path: "{{ item.dest }}" + opts: credentials=/root/.smb_passwords_{{ item.name }},domain={{ item.domain }},uid={{ item.uid | default('1000') }},gid={{ item.gid | default('1000') }}" + state: "{{ item.state }}" + fstype: "{{ item.type }}" + backup: true + dump: "0" + passno: "0" + loop: "{{ cifs_mounts }}" + no_log: true + notify: reboot diff --git a/roles/mgrote.mount_cifs/templates/smb_passwords b/roles/mgrote_mount_cifs/templates/smb_passwords similarity index 100% rename from roles/mgrote.mount_cifs/templates/smb_passwords rename to roles/mgrote_mount_cifs/templates/smb_passwords diff --git a/roles/mgrote.ntp_chrony_client/README.md b/roles/mgrote_ntp_chrony_client/README.md similarity index 100% rename from roles/mgrote.ntp_chrony_client/README.md rename to roles/mgrote_ntp_chrony_client/README.md diff --git a/roles/mgrote_ntp_chrony_client/defaults/main.yml b/roles/mgrote_ntp_chrony_client/defaults/main.yml new file mode 100644 index 00000000..6024d99a --- /dev/null +++ b/roles/mgrote_ntp_chrony_client/defaults/main.yml @@ -0,0 +1,9 @@ +--- +ntp_chrony_timezone: "Europe/Berlin" # Zeitzone in der sich der Computer befindet +ntp_chrony_driftfile_directory: "/var/lib/chrony" # Ordner für das driftfile +ntp_chrony_servers: # welche Server sollen befragt werden + - address: ptbtime1.ptb.de + options: iburst #optionaler parameter +ntp_chrony_user: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_group: _chrony # Nutzer + Gruppe für den Dienst +ntp_chrony_logging: false diff --git a/roles/mgrote_ntp_chrony_client/handlers/main.yml b/roles/mgrote_ntp_chrony_client/handlers/main.yml new file mode 100644 index 00000000..e8e46322 --- /dev/null +++ b/roles/mgrote_ntp_chrony_client/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: restart_chrony + become: true + ansible.builtin.systemd: + name: chrony + enabled: true + masked: false + state: restarted diff --git a/roles/mgrote_ntp_chrony_client/tasks/main.yml b/roles/mgrote_ntp_chrony_client/tasks/main.yml new file mode 100644 index 00000000..f3e405dc --- /dev/null +++ b/roles/mgrote_ntp_chrony_client/tasks/main.yml @@ -0,0 +1,69 @@ +--- +- name: Check systemd-timesyncd status # noqa command-instead-of-module + become: true + ansible.builtin.shell: + cmd: "set -o pipefail && systemctl is-active --quiet systemd-timesyncd && echo Active || echo Inactive" + executable: /bin/bash + register: timesyncd_status + changed_when: false + +- name: Disable systemd-timesyncd + become: true + ansible.builtin.systemd: + name: systemd-timesyncd + masked: true + state: stopped + when: timesyncd_status.stdout == "Active" + +- name: gather package facts + become: true + ansible.builtin.package_facts: + manager: auto + +- name: stop and mask ntp service + become: true + ansible.builtin.systemd: + name: ntp + masked: true + state: stopped + when: "'ntp' in ansible_facts.packages" + +- name: install chrony packages + become: true + ansible.builtin.package: + name: + - chrony + state: present + notify: restart_chrony + +- name: copy chrony config + become: true + ansible.builtin.template: + src: chrony.conf.j2 + dest: /etc/chrony/chrony.conf + mode: "0755" + notify: restart_chrony + +- name: copy logrotate config + become: true + ansible.builtin.template: + src: logrotate_chrony + dest: /etc/logrotate.d/chrony + owner: root + group: root + mode: "0644" + +- name: Create chrony driftfile folder + become: true + ansible.builtin.file: + state: directory + path: "{{ ntp_chrony_driftfile_directory }}" + mode: "0750" + owner: "{{ ntp_chrony_user }}" + group: "{{ ntp_chrony_group }}" + notify: restart_chrony + +- name: set timezone to {{ ntp_chrony_timezone }} + become: true + community.general.timezone: + name: "{{ ntp_chrony_timezone }}" diff --git a/roles/mgrote.ntp_chrony_client/templates/chrony.conf.j2 b/roles/mgrote_ntp_chrony_client/templates/chrony.conf.j2 similarity index 100% rename from roles/mgrote.ntp_chrony_client/templates/chrony.conf.j2 rename to roles/mgrote_ntp_chrony_client/templates/chrony.conf.j2 diff --git a/roles/mgrote_ntp_chrony_client/templates/logrotate_chrony b/roles/mgrote_ntp_chrony_client/templates/logrotate_chrony new file mode 100644 index 00000000..86e0c1f6 --- /dev/null +++ b/roles/mgrote_ntp_chrony_client/templates/logrotate_chrony @@ -0,0 +1,16 @@ +{{ file_header | default () }} +/var/log/chrony/*.log { + missingok + nocreate + rotate 4 + weekly + compress + missingok + notifempty + dateext + dateyesterday + sharedscripts + postrotate + /usr/bin/chronyc cyclelogs > /dev/null 2>&1 || true + endscript +} diff --git a/roles/mgrote.pbs_datastores/defaults/main.yml b/roles/mgrote_pbs_datastores/defaults/main.yml similarity index 100% rename from roles/mgrote.pbs_datastores/defaults/main.yml rename to roles/mgrote_pbs_datastores/defaults/main.yml diff --git a/roles/mgrote_pbs_datastores/tasks/main.yml b/roles/mgrote_pbs_datastores/tasks/main.yml new file mode 100644 index 00000000..0c787c4b --- /dev/null +++ b/roles/mgrote_pbs_datastores/tasks/main.yml @@ -0,0 +1,42 @@ +--- +- name: check if datastores exist # noqa no-changed-when + become: true + ansible.builtin.command: "proxmox-backup-manager datastore list --output-format json" + register: datastores + changed_when: false + +- name: ensure datastores exist # noqa no-changed-when + become: true + ansible.builtin.command: "proxmox-backup-manager datastore create {{ item.name }} {{ item.path }}" + loop: "{{ pbs_datastores }}" + when: "item.name not in datastores.stdout" + +- name: ensure datastores are configured + become: true + ansible.builtin.template: + src: datastores.j2 + dest: /etc/proxmox-backup/datastore.cfg + owner: root + group: backup + mode: "0640" + backup: true + +- name: ensure prune-jobs are configured + become: true + ansible.builtin.template: + src: prune-jobs.j2 + dest: /etc/proxmox-backup/prune.cfg + owner: root + group: backup + mode: "0640" + backup: true + +- name: ensure permissions are configured + become: true + ansible.builtin.template: + src: permissions.j2 + dest: /etc/proxmox-backup/acl.cfg + owner: root + group: backup + mode: "0640" + backup: true diff --git a/roles/mgrote.pbs_datastores/templates/datastores.j2 b/roles/mgrote_pbs_datastores/templates/datastores.j2 similarity index 100% rename from roles/mgrote.pbs_datastores/templates/datastores.j2 rename to roles/mgrote_pbs_datastores/templates/datastores.j2 diff --git a/roles/mgrote.pbs_datastores/templates/permissions.j2 b/roles/mgrote_pbs_datastores/templates/permissions.j2 similarity index 100% rename from roles/mgrote.pbs_datastores/templates/permissions.j2 rename to roles/mgrote_pbs_datastores/templates/permissions.j2 diff --git a/roles/mgrote.pbs_datastores/templates/prune-jobs.j2 b/roles/mgrote_pbs_datastores/templates/prune-jobs.j2 similarity index 100% rename from roles/mgrote.pbs_datastores/templates/prune-jobs.j2 rename to roles/mgrote_pbs_datastores/templates/prune-jobs.j2 diff --git a/roles/mgrote.pbs_pve_integration/defaults/main.yml b/roles/mgrote_pbs_pve_integration/defaults/main.yml similarity index 100% rename from roles/mgrote.pbs_pve_integration/defaults/main.yml rename to roles/mgrote_pbs_pve_integration/defaults/main.yml diff --git a/roles/mgrote_pbs_pve_integration/tasks/main.yml b/roles/mgrote_pbs_pve_integration/tasks/main.yml new file mode 100644 index 00000000..92c7b719 --- /dev/null +++ b/roles/mgrote_pbs_pve_integration/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: check which storages exists + become: true + ansible.builtin.shell: + cmd: "set -o pipefail && pvesm status | awk '{ print $1}'" + executable: /bin/bash + register: storages + changed_when: false + +- name: ensure datastore exist # noqa no-changed-when + become: true + ansible.builtin.command: "pvesm add pbs {{ item.name }} --server {{ item.server }} --datastore {{ item.datastore }} --username {{ item.username }} --password {{ item.password }} --fingerprint {{ item.fingerprint }}" + loop: "{{ pve_pbs_datastore }}" + when: "item.name not in storages.stdout" + +- name: ensure datastore is configured + become: true + ansible.builtin.command: "pvesm set {{ item.name }} --username {{ item.username }} --password {{ item.password }}" + loop: "{{ pve_pbs_datastore }}" + when: "item.name in storages.stdout" + changed_when: false diff --git a/roles/mgrote.pbs_users/defaults/main.yml b/roles/mgrote_pbs_users/defaults/main.yml similarity index 100% rename from roles/mgrote.pbs_users/defaults/main.yml rename to roles/mgrote_pbs_users/defaults/main.yml diff --git a/roles/mgrote_pbs_users/tasks/main.yml b/roles/mgrote_pbs_users/tasks/main.yml new file mode 100644 index 00000000..b92b30a6 --- /dev/null +++ b/roles/mgrote_pbs_users/tasks/main.yml @@ -0,0 +1,26 @@ +--- +- name: check which users exist + become: true + ansible.builtin.command: "proxmox-backup-manager user list --output-format json" + register: users + changed_when: false + +- name: ensure users exist # noqa no-changed-when + become: true + ansible.builtin.command: "proxmox-backup-manager user create {{ item.name }}@{{ item.realm }}" + loop: "{{ pbs_users }}" + when: "item.name not in users.stdout" + +- name: check again which users exist + become: true + ansible.builtin.command: "proxmox-backup-manager user list --output-format json" + register: users + changed_when: false + +- name: ensure user password + become: true + ansible.builtin.command: "proxmox-backup-manager user update {{ item.name }}@{{ item.realm }} --password {{ item.password }} --expire 0" + loop: "{{ pbs_users }}" + when: "item.name in users.stdout" + changed_when: false + no_log: true diff --git a/roles/mgrote.postfix/README.md b/roles/mgrote_postfix/README.md similarity index 100% rename from roles/mgrote.postfix/README.md rename to roles/mgrote_postfix/README.md diff --git a/roles/mgrote_postfix/defaults/main.yml b/roles/mgrote_postfix/defaults/main.yml new file mode 100644 index 00000000..44404ee6 --- /dev/null +++ b/roles/mgrote_postfix/defaults/main.yml @@ -0,0 +1,12 @@ +--- +postfix_mail_nach_cronjob: false +postfix_erlaubte_netzwerke: "127.0.0.0/8 192.168.2.0/24" +postfix_smtp_server: smtp.strato.de +postfix_smtp_server_port: 587 +postfix_absender_mailadresse: info@mgrote.net +postfix_absender_passwort: "{{ lookup('keepass', 'postfix_absender_passwort', 'password') }}" +postfix_smtp_use_tls: "yes" +postfix_smtp_sasl_auth_enable: "yes" +postfix_smtp_tls_session_cache_timeout: 3600s +postfix_inet_protocols: ipv4 +postfix_append_dot_mydomain: "no" diff --git a/roles/mgrote_postfix/handlers/main.yml b/roles/mgrote_postfix/handlers/main.yml new file mode 100644 index 00000000..08235cdb --- /dev/null +++ b/roles/mgrote_postfix/handlers/main.yml @@ -0,0 +1,21 @@ +--- +- name: hash_sasl_passwd # noqa no-changed-when + become: true + ansible.builtin.command: /usr/sbin/postmap hash:/etc/postfix/sasl_passwd + +- name: hash_sender_canonical # noqa no-changed-when + become: true + ansible.builtin.command: /usr/sbin/postmap hash:/etc/postfix/sender_canonical + +- name: postfix_reload + become: true + ansible.builtin.systemd: + name: postfix + enabled: true + state: restarted + notify: postfix_testmail + +- name: postfix_testmail # noqa no-changed-when + ansible.builtin.shell: + cmd: "set -o pipefail && echo 'postfix ist eingerichtet' | mail -s '{{ ansible_hostname }} - postfix' {{ empfaenger_mail }}" + executable: /bin/bash diff --git a/roles/mgrote_postfix/tasks/main.yml b/roles/mgrote_postfix/tasks/main.yml new file mode 100644 index 00000000..16b81dd6 --- /dev/null +++ b/roles/mgrote_postfix/tasks/main.yml @@ -0,0 +1,66 @@ +--- +### postfix fuer gmail; http://dokuwiki2.grote.lan/artikel/technik/postfix_mit_gmail_fuer_benachrichtigungen_einrichten +- name: postfix + Hilfsprogramme installieren + become: true + ansible.builtin.package: + name: + - postfix + - mailutils + - libsasl2-modules + state: present + +- name: kopiere sasl_passwd + become: true + ansible.builtin.template: + src: sasl_passwd + dest: /etc/postfix/sasl_passwd + force: true + owner: root + group: root + mode: "0644" + notify: + - hash_sasl_passwd + - postfix_testmail + +- name: kopiere sender_canonical + become: true + ansible.builtin.template: + src: sender_canonical + dest: /etc/postfix/sender_canonical + owner: root + group: root + mode: "0644" + notify: + - hash_sender_canonical + - postfix_reload + - postfix_testmail + +- name: kopiere postfix_main.cf + become: true + ansible.builtin.template: + src: main.cf + dest: /etc/postfix/main.cf + owner: root + group: root + mode: "0644" + notify: + - postfix_reload + - postfix_testmail + +- name: Mail Cronjob - Anlegen + become: true + when: postfix_mail_nach_cronjob # ohne parameter wird auf true geprueft https://www.buildahomelab.com/2018/11/12/using-ansible-when-statements/ + ansible.builtin.cron: + name: MAILTO + env: true + job: "{{ empfaenger_mail }}" + notify: + - postfix_testmail + +- name: Mail Cronjob - Entfernen + become: true + when: not postfix_mail_nach_cronjob + ansible.builtin.cron: + name: MAILTO + env: true + job: "" diff --git a/roles/mgrote.postfix/templates/main.cf b/roles/mgrote_postfix/templates/main.cf similarity index 100% rename from roles/mgrote.postfix/templates/main.cf rename to roles/mgrote_postfix/templates/main.cf diff --git a/roles/mgrote.postfix/templates/sasl_passwd b/roles/mgrote_postfix/templates/sasl_passwd similarity index 100% rename from roles/mgrote.postfix/templates/sasl_passwd rename to roles/mgrote_postfix/templates/sasl_passwd diff --git a/roles/mgrote.postfix/templates/sender_canonical b/roles/mgrote_postfix/templates/sender_canonical similarity index 100% rename from roles/mgrote.postfix/templates/sender_canonical rename to roles/mgrote_postfix/templates/sender_canonical diff --git a/roles/mgrote.proxmox_bind_mounts/README.md b/roles/mgrote_proxmox_bind_mounts/README.md similarity index 93% rename from roles/mgrote.proxmox_bind_mounts/README.md rename to roles/mgrote_proxmox_bind_mounts/README.md index 854efe9c..97c3f7df 100644 --- a/roles/mgrote.proxmox_bind_mounts/README.md +++ b/roles/mgrote_proxmox_bind_mounts/README.md @@ -8,7 +8,7 @@ Adds [bind-mounts](https://pve.proxmox.com/wiki/Linux_Container#pct_container_st ### Variablen + Defaults ``` -pve_bind_mounts: # Dictionary +pve_bind_mounts: # Dictionary - vmid: 105 # VMID for which the bind-mount should get created mp_nr: 1 # Number of the mountpoint mp_path_host: /rpool/test # Path on the Host diff --git a/roles/mgrote_proxmox_bind_mounts/defaults/main.yml b/roles/mgrote_proxmox_bind_mounts/defaults/main.yml new file mode 100644 index 00000000..232920a2 --- /dev/null +++ b/roles/mgrote_proxmox_bind_mounts/defaults/main.yml @@ -0,0 +1,3 @@ +--- +lists_merged: # Liste muss leer existieren damit sie "germerged" werden kann, für Liste welche VMs zu rebooten sind + - '' diff --git a/roles/mgrote_proxmox_bind_mounts/handlers/main.yml b/roles/mgrote_proxmox_bind_mounts/handlers/main.yml new file mode 100644 index 00000000..d41e4aef --- /dev/null +++ b/roles/mgrote_proxmox_bind_mounts/handlers/main.yml @@ -0,0 +1,11 @@ +--- +- name: restart lxc # noqa no-changed-when + become: true + ansible.builtin.command: "pct reboot {{ item }}" + failed_when: false + loop: "{{ lists_merged | unique }}" + # reboote den lxc wenn: + # - er in der Liste "Lists merged" vorhanden ist + # unique Filter sorgt dafür das es keine doppelten Elemente gibt + # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters + # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote_proxmox_bind_mounts/tasks/bm.yml b/roles/mgrote_proxmox_bind_mounts/tasks/bm.yml new file mode 100644 index 00000000..777c14de --- /dev/null +++ b/roles/mgrote_proxmox_bind_mounts/tasks/bm.yml @@ -0,0 +1,48 @@ +--- +- name: read config + become: true + ansible.builtin.shell: + cmd: "set -o pipefail && pct config {{ item.vmid }} | grep \"mp{{ item.mp_nr }}: {{ item.mp_path_host }},mp={{ item.mp_path_guest }}\"" + executable: /bin/bash + register: config + changed_when: false + failed_when: false + # prüfe ob bind mount schon vorhanden ist + # exit-code wird unten geprüft + +# - name: debug config +# ansible.builtin.debug: +# msg: "{{ config }}" + +- name: add bind mounts to container # noqa no-changed-when + become: true + ansible.builtin.command: "pct set {{ item.vmid }} -mp{{ item.mp_nr }} {{ item.mp_path_host }},mp={{ item.mp_path_guest }}" + register: restart + notify: restart lxc + # füge bind-mount hinzu falls er fehlt, also rc ungleich 0 + # pro bind-mount + when: + - not ansible_check_mode + - not config.rc == 0 + # überspringe wenn in check-mode + + # schreibe vm id in die Liste "reboot" +- name: set reboot list # noqa no-handler var-naming[pattern] + ansible.builtin.set_fact: + ansible.builtin.reboot: + - "{{ item.vmid }}" + when: restart.changed + + # Füge die leere Liste "lists_merged" aus den defaults, mit der Liste "reboot" zusammen. Nur wenn auch etwas geändert wurde, daher "when:..." +- name: merge reboot lists # noqa no-handler + ansible.builtin.set_fact: + lists_merged: "{{ lists_merged + reboot }}" + when: restart.changed + # https://blog.crisp.se/2016/10/20/maxwenzin/how-to-append-to-lists-in-ansible + +# - name: debug config +# ansible.builtin.debug: +# msg: "{{ lists_merged | unique }}" + # unique Filter sorgt dafür das es keine doppelten Elemente gibt + # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters + # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote_proxmox_bind_mounts/tasks/main.yml b/roles/mgrote_proxmox_bind_mounts/tasks/main.yml new file mode 100644 index 00000000..30d14877 --- /dev/null +++ b/roles/mgrote_proxmox_bind_mounts/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: loop tasks + ansible.builtin.include_tasks: bm.yml + loop: "{{ pve_bind_mounts }}" + when: + - pve_bind_mounts is defined + # Loope durch jeden bind-mount diff --git a/roles/mgrote.proxmox_lxc_profiles/README.md b/roles/mgrote_proxmox_lxc_profiles/README.md similarity index 93% rename from roles/mgrote.proxmox_lxc_profiles/README.md rename to roles/mgrote_proxmox_lxc_profiles/README.md index 854efe9c..97c3f7df 100644 --- a/roles/mgrote.proxmox_lxc_profiles/README.md +++ b/roles/mgrote_proxmox_lxc_profiles/README.md @@ -8,7 +8,7 @@ Adds [bind-mounts](https://pve.proxmox.com/wiki/Linux_Container#pct_container_st ### Variablen + Defaults ``` -pve_bind_mounts: # Dictionary +pve_bind_mounts: # Dictionary - vmid: 105 # VMID for which the bind-mount should get created mp_nr: 1 # Number of the mountpoint mp_path_host: /rpool/test # Path on the Host diff --git a/roles/mgrote_proxmox_lxc_profiles/defaults/main.yml b/roles/mgrote_proxmox_lxc_profiles/defaults/main.yml new file mode 100644 index 00000000..ac12ceed --- /dev/null +++ b/roles/mgrote_proxmox_lxc_profiles/defaults/main.yml @@ -0,0 +1,7 @@ +--- +lists_merged: # Liste muss leer existieren damit sie "germerged" werden kann, für Liste welche VMs zu rebooten sind + - '' + +# lxc_apparmor_profiles: +# - vmid: 555 +# apparmor_profile: unconfined diff --git a/roles/mgrote_proxmox_lxc_profiles/handlers/main.yml b/roles/mgrote_proxmox_lxc_profiles/handlers/main.yml new file mode 100644 index 00000000..d41e4aef --- /dev/null +++ b/roles/mgrote_proxmox_lxc_profiles/handlers/main.yml @@ -0,0 +1,11 @@ +--- +- name: restart lxc # noqa no-changed-when + become: true + ansible.builtin.command: "pct reboot {{ item }}" + failed_when: false + loop: "{{ lists_merged | unique }}" + # reboote den lxc wenn: + # - er in der Liste "Lists merged" vorhanden ist + # unique Filter sorgt dafür das es keine doppelten Elemente gibt + # https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters + # https://www.reddit.com/r/ansible/comments/8cp86c/how_do_i_remove_duplicate_items_from_a_variable/ diff --git a/roles/mgrote_proxmox_lxc_profiles/tasks/main.yml b/roles/mgrote_proxmox_lxc_profiles/tasks/main.yml new file mode 100644 index 00000000..58464587 --- /dev/null +++ b/roles/mgrote_proxmox_lxc_profiles/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: loop tasks + ansible.builtin.include_tasks: profile.yml + loop: "{{ lxc_apparmor_profiles }}" + when: + - lxc_apparmor_profiles is defined + # Loope durch jeden bind-mount diff --git a/roles/mgrote_proxmox_lxc_profiles/tasks/profile.yml b/roles/mgrote_proxmox_lxc_profiles/tasks/profile.yml new file mode 100644 index 00000000..d1054d7b --- /dev/null +++ b/roles/mgrote_proxmox_lxc_profiles/tasks/profile.yml @@ -0,0 +1,24 @@ +--- +- name: set apparmor profile + become: true + ansible.builtin.lineinfile: + path: "/etc/pve/lxc/{{ item.vmid }}.conf" + line: "lxc.apparmor.profile: {{ item.apparmor_profile }}" + state: present + register: restart + + # schreibe vm id in die Liste "reboot" +- name: set reboot list # noqa no-handler var-naming[pattern] + become: true + ansible.builtin.set_fact: + ansible.builtin.reboot: + - "{{ item.vmid }}" + when: restart.changed + + # Füge die leere Liste "lists_merged" aus den defaults, mit der Liste "reboot" zusammen. Nur wenn auch etwas geändert wurde, daher "when:..." +- name: merge reboot lists # noqa no-handler + become: true + ansible.builtin.set_fact: + lists_merged: "{{ lists_merged + reboot }}" + when: restart.changed + # https://blog.crisp.se/2016/10/20/maxwenzin/how-to-append-to-lists-in-ansible diff --git a/roles/mgrote.qemu_guest_agent/README.md b/roles/mgrote_qemu_guest_agent/README.md similarity index 100% rename from roles/mgrote.qemu_guest_agent/README.md rename to roles/mgrote_qemu_guest_agent/README.md diff --git a/roles/mgrote_qemu_guest_agent/handlers/main.yml b/roles/mgrote_qemu_guest_agent/handlers/main.yml new file mode 100644 index 00000000..c22b27fb --- /dev/null +++ b/roles/mgrote_qemu_guest_agent/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: reboot + become: true + ansible.builtin.reboot: + reboot_timeout: 120 diff --git a/roles/mgrote_qemu_guest_agent/tasks/main.yml b/roles/mgrote_qemu_guest_agent/tasks/main.yml new file mode 100644 index 00000000..0c5f3587 --- /dev/null +++ b/roles/mgrote_qemu_guest_agent/tasks/main.yml @@ -0,0 +1,13 @@ +--- +- name: update apt cache + become: true + ansible.builtin.apt: + update_cache: true + +- name: install packages + become: true + ansible.builtin.package: + name: qemu-guest-agent + state: present + when: ansible_virtualization_role == 'guest' + notify: reboot diff --git a/roles/mgrote.remove_snapd/README.md b/roles/mgrote_remove_snapd/README.md similarity index 100% rename from roles/mgrote.remove_snapd/README.md rename to roles/mgrote_remove_snapd/README.md diff --git a/roles/mgrote_remove_snapd/tasks/main.yml b/roles/mgrote_remove_snapd/tasks/main.yml new file mode 100644 index 00000000..e7272e0f --- /dev/null +++ b/roles/mgrote_remove_snapd/tasks/main.yml @@ -0,0 +1,13 @@ +--- +- name: remove snapd package + become: true + ansible.builtin.package: + name: snapd + state: absent + purge: true + +- name: remove /var/cache/snapd/ + become: true + ansible.builtin.file: + path: /var/cache/snapd/ + state: absent diff --git a/roles/mgrote.restic/README.md b/roles/mgrote_restic/README.md similarity index 100% rename from roles/mgrote.restic/README.md rename to roles/mgrote_restic/README.md diff --git a/roles/mgrote_restic/defaults/main.yml b/roles/mgrote_restic/defaults/main.yml new file mode 100644 index 00000000..000a455c --- /dev/null +++ b/roles/mgrote_restic/defaults/main.yml @@ -0,0 +1,33 @@ +--- +# restic user +restic_user: root +# restic group +restic_group: restic +# restic config directory +restic_conf_dir: /etc/restic +# was soll ausgeschlossen werden, siehe: https://github.com/restic/restic/issues/1005; https://forum.restic.net/t/exclude-syntax-confusion/1531/12 +restic_exclude: | + ._* + desktop.ini + .Trash-* + **/**cache***/** + **/**Cache***/** + **/**AppData***/** +# timeout for cifs mount; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") +restic_mount_timeout: "10 min" +# delay for restartung task; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") +restic_failure_delay: "30 s" +# when should restic run; systemd notation(systemd-analyze calendar "Sun *-0/2-* 23:00") +restic_schedule: "*:0/2" +# welche ordner sollen gesichert werden +restic_folders_to_backup: "/usr/local /etc /root /var/www /home" +# smb-share mit dem repository: z.B. "//fileserver3.grote.lan/restic" +restic_repository: "//fileserver.domain/restic" +# password für das repo +restic_repository_password: "{{ lookup('keepass', 'restic_repository_password', 'password') }}" +# nutzer für den share +restic_mount_user: restic +# passwort für den mount +restic_mount_password: "unsafe_password" +# where to send in case of an error +restic_fail_mail: x@y.de diff --git a/roles/mgrote_restic/handlers/main.yml b/roles/mgrote_restic/handlers/main.yml new file mode 100644 index 00000000..829c059b --- /dev/null +++ b/roles/mgrote_restic/handlers/main.yml @@ -0,0 +1,28 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true + +- name: systemctl enable units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + enabled: true + masked: false + with_items: + - media-restic.automount + - media-restic.mount + - restic.service + - restic.timer + - restic_mail.service + +- name: systemctl start units + become: true + ansible.builtin.systemd: + name: "{{ item }}" + state: restarted + enabled: true + with_items: + - restic.timer + notify: systemctl daemon-reload diff --git a/roles/mgrote_restic/tasks/main.yml b/roles/mgrote_restic/tasks/main.yml new file mode 100644 index 00000000..3e7b0450 --- /dev/null +++ b/roles/mgrote_restic/tasks/main.yml @@ -0,0 +1,117 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ restic_group }}" + state: present + +- name: install restic-packages + become: true + ansible.builtin.package: + name: + - restic + state: present + +- name: create "{{ restic_conf_dir }}" + become: true + ansible.builtin.file: + path: "{{ restic_conf_dir }}" + state: directory + owner: "{{ restic_user }}" + group: "{{ restic_group }}" + mode: "0755" + +- name: template smb.cred + become: true + ansible.builtin.template: + src: "smb.cred.j2" + dest: "{{ restic_conf_dir }}/smb.cred" + owner: "{{ restic_user }}" + group: "{{ restic_group }}" + mode: "0600" + no_log: true + +- name: templates excludes + become: true + ansible.builtin.blockinfile: + path: "{{ restic_conf_dir }}/excludes" + create: true + block: "{{ restic_exclude }}" + mode: "0644" + owner: "{{ restic_user }}" + group: "{{ restic_group }}" + +- name: template restic.env + become: true + ansible.builtin.template: + src: "restic.env.j2" + dest: "{{ restic_conf_dir }}/restic.env" + owner: root + group: root + mode: "0600" + no_log: true + +- name: template restic.mount + become: true + ansible.builtin.template: + src: media-restic.mount.j2 + dest: /etc/systemd/system/media-restic.mount # media-restic == /media/restic + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + - systemctl enable units + +- name: template restic.automount + become: true + ansible.builtin.template: + src: media-restic.automount.j2 + dest: /etc/systemd/system/media-restic.automount + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + - systemctl enable units + - systemctl start units + +- name: template restic.service + become: true + ansible.builtin.template: + src: restic.service.j2 + dest: /etc/systemd/system/restic.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: template restic.timer + become: true + ansible.builtin.template: + src: restic.timer.j2 + dest: /etc/systemd/system/restic.timer + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: template restic_mail.service + become: true + ansible.builtin.template: + src: "restic_mail.service.j2" + dest: /etc/systemd/system/restic_mail.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: systemctl start restic.timer + become: true + ansible.builtin.systemd: + name: restic.timer + state: started + enabled: true diff --git a/roles/mgrote.restic/templates/media-restic.automount.j2 b/roles/mgrote_restic/templates/media-restic.automount.j2 similarity index 100% rename from roles/mgrote.restic/templates/media-restic.automount.j2 rename to roles/mgrote_restic/templates/media-restic.automount.j2 diff --git a/roles/mgrote.restic/templates/media-restic.mount.j2 b/roles/mgrote_restic/templates/media-restic.mount.j2 similarity index 100% rename from roles/mgrote.restic/templates/media-restic.mount.j2 rename to roles/mgrote_restic/templates/media-restic.mount.j2 diff --git a/roles/mgrote.restic/templates/restic.env.j2 b/roles/mgrote_restic/templates/restic.env.j2 similarity index 100% rename from roles/mgrote.restic/templates/restic.env.j2 rename to roles/mgrote_restic/templates/restic.env.j2 diff --git a/roles/mgrote.restic/templates/restic.service.j2 b/roles/mgrote_restic/templates/restic.service.j2 similarity index 100% rename from roles/mgrote.restic/templates/restic.service.j2 rename to roles/mgrote_restic/templates/restic.service.j2 diff --git a/roles/mgrote.restic/templates/restic.timer.j2 b/roles/mgrote_restic/templates/restic.timer.j2 similarity index 100% rename from roles/mgrote.restic/templates/restic.timer.j2 rename to roles/mgrote_restic/templates/restic.timer.j2 diff --git a/roles/mgrote.restic/templates/restic_mail.service.j2 b/roles/mgrote_restic/templates/restic_mail.service.j2 similarity index 100% rename from roles/mgrote.restic/templates/restic_mail.service.j2 rename to roles/mgrote_restic/templates/restic_mail.service.j2 diff --git a/roles/mgrote.restic/templates/smb.cred.j2 b/roles/mgrote_restic/templates/smb.cred.j2 similarity index 100% rename from roles/mgrote.restic/templates/smb.cred.j2 rename to roles/mgrote_restic/templates/smb.cred.j2 diff --git a/roles/mgrote.sealed-secrets/README.md b/roles/mgrote_sealed_secrets/README.md similarity index 100% rename from roles/mgrote.sealed-secrets/README.md rename to roles/mgrote_sealed_secrets/README.md diff --git a/roles/mgrote_sealed_secrets/defaults/main.yml b/roles/mgrote_sealed_secrets/defaults/main.yml new file mode 100644 index 00000000..3219373b --- /dev/null +++ b/roles/mgrote_sealed_secrets/defaults/main.yml @@ -0,0 +1,8 @@ +--- +sealed_secrets_homedir: /home/sealed_secrets +sealed_secrets_user_group: sealed_secrets +sealed_secrets_user: sealed_secrets +kubeseal_download_url: "https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.1/kubeseal-0.19.1-linux-amd64.tar.gz" +kubeseal_path_bin: /usr/local/sbin +kubeconfig: /etc/rancher/k3s/k3s.yaml +sealed_secrets_keepass_entry_name: "{{ lookup('keepass', 'k3s-sealed-secrets-private-key', 'notes') }}" # mit kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml >main.key holen diff --git a/roles/mgrote_sealed_secrets/tasks/import.yml b/roles/mgrote_sealed_secrets/tasks/import.yml new file mode 100644 index 00000000..155cacda --- /dev/null +++ b/roles/mgrote_sealed_secrets/tasks/import.yml @@ -0,0 +1,29 @@ +--- +- name: check if private key exists + ansible.builtin.command: kubectl get secrets sealed-secrets-keytsq4k -n kube-system + register: key + ignore_errors: true + changed_when: false + +- name: Template private key file + ansible.builtin.template: + src: private.key.j2 + dest: /root/private.key + owner: root + group: root + mode: '0400' + when: key.rc not in [ 0 ] + no_log: true + +- name: apply private key # noqa no-changed-when + ansible.builtin.command: kubectl apply -f /root/private.key + when: key.rc not in [ 0 ] + +- name: remove old pod # noqa no-changed-when + ansible.builtin.command: kubectl delete pod -n kube-system -l name=sealed-secrets-controller + when: key.rc not in [ 0 ] + +- name: remove private key file + ansible.builtin.file: + path: /root/private.key + state: absent diff --git a/roles/mgrote_sealed_secrets/tasks/main.yml b/roles/mgrote_sealed_secrets/tasks/main.yml new file mode 100644 index 00000000..ef463a18 --- /dev/null +++ b/roles/mgrote_sealed_secrets/tasks/main.yml @@ -0,0 +1,26 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + +- name: check if kubeseal is installed + ansible.builtin.command: which kubeseal + changed_when: false + failed_when: kubeseal_installed.rc not in [0,1] + register: kubeseal_installed + +- name: download sealed_secrets binary + ansible.builtin.unarchive: + src: "{{ kubeseal_download_url }}" + dest: "{{ kubeseal_path_bin }}" + mode: "0755" + owner: "{{ sealed_secrets_user }}" + group: "{{ sealed_secrets_user_group }}" + remote_src: true + creates: "{{ kubeseal_path_bin }}/kubeseal" + when: kubeseal_installed.rc not in [ 0 ] + +- name: include import tasks + ansible.builtin.include_tasks: import.yml + # der ganze block nur auf enem host + run_once: true + when: ansible_host == flux_install_host diff --git a/roles/mgrote_sealed_secrets/tasks/user.yml b/roles/mgrote_sealed_secrets/tasks/user.yml new file mode 100644 index 00000000..6262fee4 --- /dev/null +++ b/roles/mgrote_sealed_secrets/tasks/user.yml @@ -0,0 +1,18 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ sealed_secrets_user_group }}" + state: present + when: + - sealed_secrets_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ sealed_secrets_user }}" + group: "{{ sealed_secrets_user_group }}" + create_home: false + when: + - sealed_secrets_user_group is defined + - sealed_secrets_user is defined diff --git a/roles/mgrote.sealed-secrets/templates/private.key.j2 b/roles/mgrote_sealed_secrets/templates/private.key.j2 similarity index 100% rename from roles/mgrote.sealed-secrets/templates/private.key.j2 rename to roles/mgrote_sealed_secrets/templates/private.key.j2 diff --git a/roles/mgrote.set_permissions/README.md b/roles/mgrote_set_permissions/README.md similarity index 100% rename from roles/mgrote.set_permissions/README.md rename to roles/mgrote_set_permissions/README.md diff --git a/roles/mgrote.set_permissions/tasks/main.yml b/roles/mgrote_set_permissions/tasks/main.yml similarity index 100% rename from roles/mgrote.set_permissions/tasks/main.yml rename to roles/mgrote_set_permissions/tasks/main.yml diff --git a/roles/mgrote.smart/README.md b/roles/mgrote_smart/README.md similarity index 100% rename from roles/mgrote.smart/README.md rename to roles/mgrote_smart/README.md diff --git a/roles/mgrote_smart/defaults/main.yml b/roles/mgrote_smart/defaults/main.yml new file mode 100644 index 00000000..2dd7a23a --- /dev/null +++ b/roles/mgrote_smart/defaults/main.yml @@ -0,0 +1,6 @@ +--- +# path to smartctl +smart_smartctl_path: "/usr/sbin/smartctl" +# under which user the script is run +smart_user_group: "root" +smart_user: "smart" diff --git a/roles/mgrote_smart/handlers/main.yml b/roles/mgrote_smart/handlers/main.yml new file mode 100644 index 00000000..cd285f29 --- /dev/null +++ b/roles/mgrote_smart/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart smartmontools + become: true + ansible.builtin.systemd: + name: smartmontools + state: restarted + enabled: true diff --git a/roles/mgrote_smart/tasks/main.yml b/roles/mgrote_smart/tasks/main.yml new file mode 100644 index 00000000..7d71293e --- /dev/null +++ b/roles/mgrote_smart/tasks/main.yml @@ -0,0 +1,29 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + +- name: ensure smartmontools are installed + become: true + ansible.builtin.package: + name: smartmontools + state: present + +- name: template smartmontools config + become: true + ansible.builtin.template: + src: "smartmontools" + dest: "/etc/default/smartmontools" + owner: "{{ smart_user }}" + group: "{{ smart_user_group }}" + mode: "0644" + notify: restart smartmontools + +- name: template smartd.conf + become: true + ansible.builtin.template: + src: "smartd.conf" + dest: "/etc/smartd.conf" + owner: "{{ smart_user }}" + group: "{{ smart_user_group }}" + mode: "0644" + notify: restart smartmontools diff --git a/roles/mgrote_smart/tasks/user.yml b/roles/mgrote_smart/tasks/user.yml new file mode 100644 index 00000000..961c6f87 --- /dev/null +++ b/roles/mgrote_smart/tasks/user.yml @@ -0,0 +1,19 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ smart_user_group }}" + state: present + when: + - smart_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ smart_user }}" + group: "{{ smart_user_group }}" + shell: /usr/sbin/nologin + create_home: false + when: + - smart_user_group is defined + - smart_user is defined diff --git a/roles/mgrote.smart/templates/smartd.conf b/roles/mgrote_smart/templates/smartd.conf similarity index 100% rename from roles/mgrote.smart/templates/smartd.conf rename to roles/mgrote_smart/templates/smartd.conf diff --git a/roles/mgrote.smart/templates/smartmontools b/roles/mgrote_smart/templates/smartmontools similarity index 100% rename from roles/mgrote.smart/templates/smartmontools rename to roles/mgrote_smart/templates/smartmontools diff --git a/roles/mgrote.ssh/README.md b/roles/mgrote_ssh/README.md similarity index 100% rename from roles/mgrote.ssh/README.md rename to roles/mgrote_ssh/README.md diff --git a/roles/mgrote_ssh/handlers/main.yml b/roles/mgrote_ssh/handlers/main.yml new file mode 100644 index 00000000..6b341078 --- /dev/null +++ b/roles/mgrote_ssh/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart sshd + become: true + ansible.builtin.systemd: + name: sshd + enabled: true + state: restarted diff --git a/roles/mgrote_ssh/tasks/main.yml b/roles/mgrote_ssh/tasks/main.yml new file mode 100644 index 00000000..7a3f1510 --- /dev/null +++ b/roles/mgrote_ssh/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- name: include ubuntu tasks (determined by "ansible_distribution") + ansible.builtin.include_tasks: ubuntu.yml + when: + - ansible_distribution == 'Ubuntu' + +- name: include proxmox tasks (determined by group) + ansible.builtin.include_tasks: pve.yml + when: + - "'proxmox' in group_names" diff --git a/roles/mgrote_ssh/tasks/pve.yml b/roles/mgrote_ssh/tasks/pve.yml new file mode 100644 index 00000000..bebfd968 --- /dev/null +++ b/roles/mgrote_ssh/tasks/pve.yml @@ -0,0 +1,15 @@ +--- +- name: source proxmox vars + ansible.builtin.include_vars: pve.yml + +- name: template sshd_config + become: true + ansible.builtin.template: + src: pve.j2 + dest: /etc/ssh/sshd_config + owner: root + group: root + mode: "0644" + validate: "/usr/sbin/sshd -T -f %s" + backup: true + notify: restart sshd diff --git a/roles/mgrote_ssh/tasks/ubuntu.yml b/roles/mgrote_ssh/tasks/ubuntu.yml new file mode 100644 index 00000000..1b58fa4d --- /dev/null +++ b/roles/mgrote_ssh/tasks/ubuntu.yml @@ -0,0 +1,15 @@ +--- +- name: source ubuntu vars + ansible.builtin.include_vars: ubuntu.yml + +- name: template sshd_config + become: true + ansible.builtin.template: + src: ubuntu.j2 + dest: /etc/ssh/sshd_config + owner: root + group: root + mode: "0644" + validate: "/usr/sbin/sshd -T -f %s" + backup: true + notify: restart sshd diff --git a/roles/mgrote.ssh/templates/pve.j2 b/roles/mgrote_ssh/templates/pve.j2 similarity index 100% rename from roles/mgrote.ssh/templates/pve.j2 rename to roles/mgrote_ssh/templates/pve.j2 diff --git a/roles/mgrote.ssh/templates/ubuntu.j2 b/roles/mgrote_ssh/templates/ubuntu.j2 similarity index 100% rename from roles/mgrote.ssh/templates/ubuntu.j2 rename to roles/mgrote_ssh/templates/ubuntu.j2 diff --git a/roles/mgrote_ssh/vars/pve.yml b/roles/mgrote_ssh/vars/pve.yml new file mode 100644 index 00000000..d30ddaa2 --- /dev/null +++ b/roles/mgrote_ssh/vars/pve.yml @@ -0,0 +1,6 @@ +--- +ssh_permit_root_login: "yes" +ssh_password_authentication: "yes" +ssh_print_motd: "no" +ssh_print_lastlog: "no" +ssh_listen_port: "22" diff --git a/roles/mgrote_ssh/vars/ubuntu.yml b/roles/mgrote_ssh/vars/ubuntu.yml new file mode 100644 index 00000000..35f33646 --- /dev/null +++ b/roles/mgrote_ssh/vars/ubuntu.yml @@ -0,0 +1,6 @@ +--- +ssh_permit_root_login: "no" +ssh_password_authentication: "no" +ssh_print_motd: "no" +ssh_print_lastlog: "no" +ssh_listen_port: "22" diff --git a/roles/mgrote.systemd-resolved/README.md b/roles/mgrote_systemd_resolved/README.md similarity index 100% rename from roles/mgrote.systemd-resolved/README.md rename to roles/mgrote_systemd_resolved/README.md diff --git a/roles/mgrote.systemd-resolved/defaults/main.yml b/roles/mgrote_systemd_resolved/defaults/main.yml similarity index 85% rename from roles/mgrote.systemd-resolved/defaults/main.yml rename to roles/mgrote_systemd_resolved/defaults/main.yml index b8b25d65..3b8e7d76 100644 --- a/roles/mgrote.systemd-resolved/defaults/main.yml +++ b/roles/mgrote_systemd_resolved/defaults/main.yml @@ -1 +1,2 @@ +--- nameserver: 192.168.2.1 diff --git a/roles/mgrote_systemd_resolved/handlers/main.yml b/roles/mgrote_systemd_resolved/handlers/main.yml new file mode 100644 index 00000000..17d36c50 --- /dev/null +++ b/roles/mgrote_systemd_resolved/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart systemd-resolved + ansible.builtin.systemd: + state: restarted + name: systemd-resolved diff --git a/roles/mgrote_systemd_resolved/tasks/main.yml b/roles/mgrote_systemd_resolved/tasks/main.yml new file mode 100644 index 00000000..9b7654b7 --- /dev/null +++ b/roles/mgrote_systemd_resolved/tasks/main.yml @@ -0,0 +1,24 @@ +--- +- name: Make sure systemd-resolved is running + ansible.builtin.systemd: + state: started + masked: false + name: systemd-resolved + +- name: template /etc/systemd/resolved.conf + ansible.builtin.template: + src: resolved.conf.j2 + dest: /etc/systemd/resolved.conf + owner: root + group: root + mode: "0644" + notify: restart systemd-resolved + +- name: template /etc/resolv.conf + ansible.builtin.template: + src: resolv.conf.j2 + dest: /etc/resolv.conf + owner: root + group: root + mode: "0644" + notify: restart systemd-resolved diff --git a/roles/mgrote.systemd-resolved/templates/resolv.conf.j2 b/roles/mgrote_systemd_resolved/templates/resolv.conf.j2 similarity index 100% rename from roles/mgrote.systemd-resolved/templates/resolv.conf.j2 rename to roles/mgrote_systemd_resolved/templates/resolv.conf.j2 diff --git a/roles/mgrote.systemd-resolved/templates/resolved.conf.j2 b/roles/mgrote_systemd_resolved/templates/resolved.conf.j2 similarity index 100% rename from roles/mgrote.systemd-resolved/templates/resolved.conf.j2 rename to roles/mgrote_systemd_resolved/templates/resolved.conf.j2 diff --git a/roles/mgrote.users/README.md b/roles/mgrote_users/README.md similarity index 100% rename from roles/mgrote.users/README.md rename to roles/mgrote_users/README.md diff --git a/roles/mgrote_users/tasks/main.yml b/roles/mgrote_users/tasks/main.yml new file mode 100644 index 00000000..28c0d77a --- /dev/null +++ b/roles/mgrote_users/tasks/main.yml @@ -0,0 +1,43 @@ +--- +- name: set groups as list + ansible.builtin.set_fact: + groups_as_list: "{{ (groups_as_list | default([]) + item.groups.split(',')) | map('trim') | list | sort | unique }}" + loop: '{{ users }}' + when: item.groups is defined + +- name: create groups + ansible.builtin.group: + name: "{{ item }}" + state: present + loop: "{{ groups_as_list }}" + when: groups_as_list is defined + +- name: create users + ansible.builtin.user: + name: "{{ item.username }}" + uid: "{{ item.uid | default(omit) }}" + shell: "{{ item.shell | default('/bin/bash') }}" + password: "{{ item.password }}" + update_password: "{{ item.update_password | default(omit) }}" + groups: "{{ item.groups | default(omit) }}" + createhome: "{{ item.createhome | default('yes') }}" + state: "{{ item.state | default('present') }}" + loop: '{{ users }}' + +- name: add ssh key + ansible.posix.authorized_key: + user: "{{ item.username }}" + key: "{{ item.public_ssh_key }}" + state: present + when: item.public_ssh_key is defined + loop: '{{ users }}' + +- name: add to sudoers + ansible.builtin.lineinfile: + dest: /etc/sudoers + state: present + regexp: '^{{ item.username }} ' + line: "{{ item.username }} ALL=(ALL) {{ 'NOPASSWD:' if (item.allow_passwordless_sudo | d(false)) else '' }}ALL" + validate: 'visudo -cf %s' + when: item.allow_sudo|default(false) and item.allow_sudo is defined + loop: '{{ users }}' diff --git a/roles/mgrote_vim/defaults/main.yml b/roles/mgrote_vim/defaults/main.yml new file mode 100644 index 00000000..656da8bf --- /dev/null +++ b/roles/mgrote_vim/defaults/main.yml @@ -0,0 +1,4 @@ +--- +vim_vundle_path: /home/mg/.vim/bundle/Vundle.vim +vim_vundle_repo_url: https://github.com/VundleVim/Vundle.vim.git +vim_homedir: /home/mg/.vim diff --git a/roles/mgrote_vim/handlers/main.yml b/roles/mgrote_vim/handlers/main.yml new file mode 100644 index 00000000..0ffde0a8 --- /dev/null +++ b/roles/mgrote_vim/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: set owner recursive for repo + ansible.builtin.file: + path: "{{ vim_homedir }}" + owner: mg + group: mg + recurse: true diff --git a/roles/mgrote.vim/readme.md b/roles/mgrote_vim/readme.md similarity index 100% rename from roles/mgrote.vim/readme.md rename to roles/mgrote_vim/readme.md diff --git a/roles/mgrote_vim/tasks/main.yml b/roles/mgrote_vim/tasks/main.yml new file mode 100644 index 00000000..a49bc3e8 --- /dev/null +++ b/roles/mgrote_vim/tasks/main.yml @@ -0,0 +1,38 @@ +--- +- name: install packages + become: true + ansible.builtin.package: + name: + - vim + - ripgrep + state: present + +- name: check if vundle is installed - folder + become: true + ansible.builtin.stat: + path: "{{ vim_vundle_path }}" + register: folder_exists + + +- name: set safe directory # noqa command-instead-of-module + become: true + ansible.builtin.command: + cmd: git config --global --add safe.directory "{{ vim_vundle_path }}" + changed_when: false + +- name: Ensure repository is cloned locally. + ansible.builtin.git: + repo: "{{ vim_vundle_repo_url }}" + dest: "{{ vim_vundle_path }}" + depth: 1 + version: master + notify: set owner recursive for repo + +# - name: Vundle - PluginInstall +# ansible.builtin.shell: yes | vim -c PluginInstall -c qall +# args: +# chdir: /home/mg +# when: +# - (folder_exists.stat.exists == False) and ("ansible_facts['distribution'] == 'Ubuntu'") +# become: true +# become_user: mg diff --git a/roles/mgrote.youtubedl/README.md b/roles/mgrote_youtubedl/README.md similarity index 100% rename from roles/mgrote.youtubedl/README.md rename to roles/mgrote_youtubedl/README.md diff --git a/roles/mgrote.youtubedl/defaults/main.yml b/roles/mgrote_youtubedl/defaults/main.yml similarity index 100% rename from roles/mgrote.youtubedl/defaults/main.yml rename to roles/mgrote_youtubedl/defaults/main.yml diff --git a/roles/mgrote_youtubedl/handlers/main.yml b/roles/mgrote_youtubedl/handlers/main.yml new file mode 100644 index 00000000..ab3f5feb --- /dev/null +++ b/roles/mgrote_youtubedl/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true diff --git a/roles/mgrote_youtubedl/tasks/main.yml b/roles/mgrote_youtubedl/tasks/main.yml new file mode 100644 index 00000000..6d296e69 --- /dev/null +++ b/roles/mgrote_youtubedl/tasks/main.yml @@ -0,0 +1,86 @@ +--- +- name: download binary + become: true + ansible.builtin.get_url: + url: "{{ ytdl_dl_url }}" + dest: /usr/local/bin/yt-dlp + mode: "0750" + +- name: install packages + become: true + ansible.builtin.package: + name: + - ffmpeg + - brotli + - python3-mutagen + state: present + +- name: ensure dir exists + become: true + ansible.builtin.file: + path: "{{ ytdl_conf_dir }}" + state: directory + owner: root + group: root + mode: "0755" + +- name: template youtubedl config + become: true + ansible.builtin.template: + src: "{{ item }}" + dest: "{{ ytdl_conf_dir }}/{{ item }}" + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + loop: + - podcast.txt + - youtube.txt + +- name: template systemd services + become: true + ansible.builtin.template: + src: "youtubedl.service.j2" + dest: "/etc/systemd/system/youtubedl.service" + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: ytdl_active + +- name: template youtubedl timer + become: true + ansible.builtin.template: + src: "youtubedl.timer.j2" + dest: "/etc/systemd/system/youtubedl.timer" + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: ytdl_active + +- name: template youtube_mail.service.j2 + become: true + ansible.builtin.template: + src: "youtubedl_mail.service.j2" + dest: "/etc/systemd/system/youtubedl_mail.service" + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: ytdl_active + +- name: systemctl enable timer units + become: true + ansible.builtin.systemd: + name: "youtubedl.timer" + enabled: true + masked: false + state: started + notify: + - systemctl daemon-reload + when: ytdl_active diff --git a/roles/mgrote.youtubedl/templates/podcast.txt b/roles/mgrote_youtubedl/templates/podcast.txt similarity index 100% rename from roles/mgrote.youtubedl/templates/podcast.txt rename to roles/mgrote_youtubedl/templates/podcast.txt diff --git a/roles/mgrote.youtubedl/templates/youtube.txt b/roles/mgrote_youtubedl/templates/youtube.txt similarity index 100% rename from roles/mgrote.youtubedl/templates/youtube.txt rename to roles/mgrote_youtubedl/templates/youtube.txt diff --git a/roles/mgrote.youtubedl/templates/youtubedl.service.j2 b/roles/mgrote_youtubedl/templates/youtubedl.service.j2 similarity index 100% rename from roles/mgrote.youtubedl/templates/youtubedl.service.j2 rename to roles/mgrote_youtubedl/templates/youtubedl.service.j2 diff --git a/roles/mgrote.youtubedl/templates/youtubedl.timer.j2 b/roles/mgrote_youtubedl/templates/youtubedl.timer.j2 similarity index 100% rename from roles/mgrote.youtubedl/templates/youtubedl.timer.j2 rename to roles/mgrote_youtubedl/templates/youtubedl.timer.j2 diff --git a/roles/mgrote.youtubedl/templates/youtubedl_mail.service.j2 b/roles/mgrote_youtubedl/templates/youtubedl_mail.service.j2 similarity index 100% rename from roles/mgrote.youtubedl/templates/youtubedl_mail.service.j2 rename to roles/mgrote_youtubedl/templates/youtubedl_mail.service.j2 diff --git a/roles/mgrote.zfs_arc_mem/README.md b/roles/mgrote_zfs_arc_mem/README.md similarity index 100% rename from roles/mgrote.zfs_arc_mem/README.md rename to roles/mgrote_zfs_arc_mem/README.md diff --git a/roles/mgrote_zfs_arc_mem/defaults/main.yml b/roles/mgrote_zfs_arc_mem/defaults/main.yml new file mode 100644 index 00000000..a6e42f5d --- /dev/null +++ b/roles/mgrote_zfs_arc_mem/defaults/main.yml @@ -0,0 +1,2 @@ +--- +zfs_extra_arc_max_size: "8589934592" #in Bytes diff --git a/roles/mgrote_zfs_arc_mem/tasks/main.yml b/roles/mgrote_zfs_arc_mem/tasks/main.yml new file mode 100644 index 00000000..6360d795 --- /dev/null +++ b/roles/mgrote_zfs_arc_mem/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: Limit ZFS Memory Usage + become: true + ansible.builtin.copy: + dest: /etc/modprobe.d/zfs.conf + content: options zfs zfs_arc_max={{ zfs_extra_arc_max_size }} + owner: root + group: root + mode: "0644" diff --git a/roles/mgrote.zfs_health/README.md b/roles/mgrote_zfs_health/README.md similarity index 100% rename from roles/mgrote.zfs_health/README.md rename to roles/mgrote_zfs_health/README.md diff --git a/roles/mgrote_zfs_health/defaults/main.yml b/roles/mgrote_zfs_health/defaults/main.yml new file mode 100644 index 00000000..cb4c8dbf --- /dev/null +++ b/roles/mgrote_zfs_health/defaults/main.yml @@ -0,0 +1,7 @@ +--- +### when should the script be run +zfs_extra_cron_minutes_zfs_health: "0,15,30,45" +zfs_extra_cron_hours_zfs_health: "*" +### under which user the script is run +zfs_health_user_group: "root" +zfs_health_user: "zfs-health" diff --git a/roles/mgrote_zfs_health/tasks/main.yml b/roles/mgrote_zfs_health/tasks/main.yml new file mode 100644 index 00000000..55af11a5 --- /dev/null +++ b/roles/mgrote_zfs_health/tasks/main.yml @@ -0,0 +1,22 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + +- name: template script + become: true + ansible.builtin.template: + src: zfs-health.sh + dest: /usr/local/bin/zfs-health.sh + mode: "0744" + owner: "{{ zfs_health_user }}" + group: "{{ zfs_health_user_group }}" + +- name: ensure cronjob exists + become: true + ansible.builtin.cron: + name: zfs_health + state: present + job: "/usr/local/bin/zfs-health.sh" + minute: "{{ zfs_extra_cron_minutes_zfs_health }}" + hour: "{{ zfs_extra_cron_hours_zfs_health }}" + user: "{{ zfs_health_user }}" diff --git a/roles/mgrote_zfs_health/tasks/user.yml b/roles/mgrote_zfs_health/tasks/user.yml new file mode 100644 index 00000000..5d1bf383 --- /dev/null +++ b/roles/mgrote_zfs_health/tasks/user.yml @@ -0,0 +1,19 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ zfs_health_user_group }}" + state: present + when: + - zfs_health_user_group is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ zfs_health_user }}" + group: "{{ zfs_health_user_group }}" + shell: /usr/sbin/nologin + create_home: false + when: + - zfs_health_user_group is defined + - zfs_health_user is defined diff --git a/roles/mgrote.zfs_health/templates/zfs-health.sh b/roles/mgrote_zfs_health/templates/zfs-health.sh similarity index 100% rename from roles/mgrote.zfs_health/templates/zfs-health.sh rename to roles/mgrote_zfs_health/templates/zfs-health.sh diff --git a/roles/mgrote.zfs_manage_datasets/README.md b/roles/mgrote_zfs_manage_datasets/README.md similarity index 100% rename from roles/mgrote.zfs_manage_datasets/README.md rename to roles/mgrote_zfs_manage_datasets/README.md diff --git a/roles/mgrote_zfs_manage_datasets/tasks/main.yml b/roles/mgrote_zfs_manage_datasets/tasks/main.yml new file mode 100644 index 00000000..f21b3d25 --- /dev/null +++ b/roles/mgrote_zfs_manage_datasets/tasks/main.yml @@ -0,0 +1,59 @@ +--- +- name: create datasets or set options + become: true + community.general.zfs: + name: "{{ item.dataset }}" + state: "{{ item.state | default('present') }}" + extra_zfs_properties: + quota: "{{ item.quota | default(omit) }}" + reservation: "{{ item.reservation | default(omit) }}" + recordsize: "{{ item.recordsize | default(omit) }}" + mountpoint: "{{ item.mountpoint | default(omit) }}" + sharenfs: "{{ item.sharenfs | default(omit) }}" + checksum: "{{ item.checksum | default(omit) }}" + compression: "{{ item.compression | default(omit) }}" + atime: "{{ item.atime | default(omit) }}" + devices: "{{ item.devices | default(omit) }}" + exec: "{{ item.exec | default(omit) }}" + setuid: "{{ item.setuid | default(omit) }}" + readonly: "{{ item.readonly | default(omit) }}" + zoned: "{{ item.zoned | default(omit) }}" + snapdir: "{{ item.snapdir | default(omit) }}" + aclmode: "{{ item.aclmode | default(omit) }}" + aclinherit: "{{ item.aclinherit | default(omit) }}" + canmount: "{{ item.canmount | default(omit) }}" + xattr: "{{ item.xattr | default(omit) }}" + copies: "{{ item.copies | default(omit) }}" + vscan: "{{ item.vscan | default(omit) }}" + nbmand: "{{ item.nbmand | default(omit) }}" + sharesmb: "{{ item.sharesmb | default(omit) }}" + refquota: "{{ item.refquota | default(omit) }}" + refreservation: "{{ item.refreservation | default(omit) }}" + primarycache: "{{ item.primarycache | default(omit) }}" + secondarycache: "{{ item.secondarycache | default(omit) }}" + logbias: "{{ item.logbias | default(omit) }}" + dedup: "{{ item.dedup | default(omit) }}" + mlslabel: "{{ item.mlslabel | default(omit) }}" + sync: "{{ item.sync | default(omit) }}" + dnodesize: "{{ item.dnodesize | default(omit) }}" + volmode: "{{ item.volmode | default(omit) }}" + filesystem_limit: "{{ item.filesystem_limit | default(omit) }}" + snapshot_limit: "{{ item.snapshot_limit | default(omit) }}" + filesystem_count: "{{ item.filesystem_count | default(omit) }}" + snapshot_count: "{{ item.snapshot_count | default(omit) }}" + snapdev: "{{ item.snapdev | default(omit) }}" + acltype: "{{ item.acltype | default(omit) }}" + context: "{{ item.context | default(omit) }}" + fscontext: "{{ item.fscontext | default(omit) }}" + defcontext: "{{ item.defcontext | default(omit) }}" + rootcontext: "{{ item.rootcontext | default(omit) }}" + relatime: "{{ item.relatime | default(omit) }}" + redundant_metadata: "{{ item.redundant_metadata | default(omit) }}" + overlay: "{{ item.overlay | default(omit) }}" + encryption: "{{ item.encryption | default(omit) }}" + keylocation: "{{ item.keylocation | default(omit) }}" + keyformat: "{{ item.keyformat | default(omit) }}" + pbkdf2iters: "{{ item.pbkdf2iters | default(omit) }}" + special_small_blocks: "{{ item.special_small_blocks | default(omit) }}" + loop: "{{ zfs_datasets }}" + when: zfs_datasets is defined # führe nur aus wenn die Variable gesetzt ist diff --git a/roles/mgrote.zfs_packages/README.md b/roles/mgrote_zfs_packages/README.md similarity index 100% rename from roles/mgrote.zfs_packages/README.md rename to roles/mgrote_zfs_packages/README.md diff --git a/roles/mgrote_zfs_packages/tasks/main.yml b/roles/mgrote_zfs_packages/tasks/main.yml new file mode 100644 index 00000000..bef23d0c --- /dev/null +++ b/roles/mgrote_zfs_packages/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: install zfs-tools-packages + become: true + ansible.builtin.package: + name: + - zfsutils + - zfs-initramfs + - zfs-zed + state: present diff --git a/roles/mgrote.zfs_sanoid/README.md b/roles/mgrote_zfs_sanoid/README.md similarity index 98% rename from roles/mgrote.zfs_sanoid/README.md rename to roles/mgrote_zfs_sanoid/README.md index 629de03d..70b9f6cd 100644 --- a/roles/mgrote.zfs_sanoid/README.md +++ b/roles/mgrote_zfs_sanoid/README.md @@ -23,7 +23,7 @@ Es gibt 3 Funktionen: --- - hosts: host1,host2 roles: - - { role: mgrote.zfs_sanoid, tags: "sanoid" } + - { role: mgrote_zfs_sanoid, tags: "sanoid" } ``` ### Beispiel - Snapshots erstellen diff --git a/roles/mgrote.zfs_sanoid/defaults/main.yml b/roles/mgrote_zfs_sanoid/defaults/main.yml similarity index 50% rename from roles/mgrote.zfs_sanoid/defaults/main.yml rename to roles/mgrote_zfs_sanoid/defaults/main.yml index 97bd8f52..6c218b35 100644 --- a/roles/mgrote.zfs_sanoid/defaults/main.yml +++ b/roles/mgrote_zfs_sanoid/defaults/main.yml @@ -1,10 +1,10 @@ --- - ### when should sanoid be run (every 5 minutes) - sanoid_timer: '*-*-* *:00/5' - ### when should syncoid be run - sanoid_syncoid_timer: '*-*-* *:00:00' - ### where to download the package - sanoid_deb_url: http://docker10.grote.lan:3344/sanoid_3.0.0.deb +### when should sanoid be run (every 5 minutes) +sanoid_timer: '*-*-* *:00/5' +### when should syncoid be run +sanoid_syncoid_timer: '*-*-* *:00:00' +### where to download the package +sanoid_deb_url: http://docker10.grote.lan:3344/sanoid_3.0.0.deb # ### "Default" Datasets # sanoid_datasets: # dictionary @@ -27,26 +27,26 @@ # autosnap: 'yes' # Automatisches erstellen von Snapshots # autoprune: 'yes' - ### user and group for sanoid - sanoid_user: sanoid - sanoid_user_group: sanoid +### user and group for sanoid +sanoid_user: sanoid +sanoid_user_group: sanoid - ### enable/disable features - ## enable snapshotting - # sanoid_snaps_enable: true - ## enable sending snaps - # sanoid_syncoid_source_host: true - ## enable receiving snaps - # sanoid_syncoid_destination_host: true +### enable/disable features +## enable snapshotting +# sanoid_snaps_enable: true +## enable sending snaps +# sanoid_syncoid_source_host: true +## enable receiving snaps +# sanoid_syncoid_destination_host: true - # syncoid - #sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" - #sanoid_syncoid_ssh_pubkey: "{{ lookup('keepass', 'sanoid_syncoid_public_key', 'notes') }}" +# syncoid +#sanoid_syncoid_ssh_privkey: "{{ lookup('keepass', 'sanoid_syncoid_private_key', 'notes') }}" +#sanoid_syncoid_ssh_pubkey: "{{ lookup('keepass', 'sanoid_syncoid_public_key', 'notes') }}" - ### mgrote.sanoid - #sanoid_syncoid_datasets_sync: - # - source_host: pve5.grote.lan - # source_dataset: hdd_data_raidz/tmp - # destination_mount_check: hdd_data_raidz/tmp # zielpool - # destination_dataset: backup/pve5/tmp +### mgrote.sanoid +#sanoid_syncoid_datasets_sync: +# - source_host: pve5.grote.lan +# source_dataset: hdd_data_raidz/tmp +# destination_mount_check: hdd_data_raidz/tmp # zielpool +# destination_dataset: backup/pve5/tmp diff --git a/roles/mgrote_zfs_sanoid/handlers/main.yml b/roles/mgrote_zfs_sanoid/handlers/main.yml new file mode 100644 index 00000000..ab3f5feb --- /dev/null +++ b/roles/mgrote_zfs_sanoid/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true diff --git a/roles/mgrote_zfs_sanoid/tasks/destination.yml b/roles/mgrote_zfs_sanoid/tasks/destination.yml new file mode 100644 index 00000000..9cb40daf --- /dev/null +++ b/roles/mgrote_zfs_sanoid/tasks/destination.yml @@ -0,0 +1,77 @@ +--- +- name: template ssh private key + become: true + ansible.builtin.copy: + content: "{{ sanoid_syncoid_ssh_privkey }}" + dest: "/etc/sanoid/.ssh/id_sanoid" + owner: "{{ sanoid_user }}" + group: "{{ sanoid_user_group }}" + mode: "0400" + no_log: true + when: + - sanoid_syncoid_destination_host + +- name: add user to sudoers + become: true + ansible.builtin.blockinfile: + path: /etc/sudoers + state: present + block: | + {{ sanoid_user }} ALL=(ALL) NOPASSWD:ALL + validate: '/usr/sbin/visudo -cf %s' + backup: true + marker_begin: sanoid-sudoers BEGIN + marker_end: sanoid-sudoers END + when: + - sanoid_syncoid_destination_host + +- name: template syncoid.service + become: true + ansible.builtin.template: + src: "syncoid.service.j2" + dest: /etc/systemd/system/syncoid.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: + - sanoid_syncoid_destination_host + +- name: template syncoid_mail.service + become: true + ansible.builtin.template: + src: "syncoid_mail.service.j2" + dest: /etc/systemd/system/syncoid_mail.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: + - sanoid_syncoid_destination_host + +- name: template syncoid.timer + become: true + ansible.builtin.template: + src: "syncoid.timer.j2" + dest: "/etc/systemd/system/syncoid.timer" + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + when: + - sanoid_syncoid_destination_host + +- name: enable syncoid.timer + become: true + ansible.builtin.systemd: + name: "syncoid.timer" + enabled: true + masked: false + state: started + notify: + - systemctl daemon-reload + when: + - sanoid_syncoid_destination_host diff --git a/roles/mgrote_zfs_sanoid/tasks/main.yml b/roles/mgrote_zfs_sanoid/tasks/main.yml new file mode 100644 index 00000000..3379cf3b --- /dev/null +++ b/roles/mgrote_zfs_sanoid/tasks/main.yml @@ -0,0 +1,64 @@ +--- +- name: include user tasks + ansible.builtin.include_tasks: user.yml + +- name: install packages from repo + become: true + ansible.builtin.apt: + name: + - mbuffer + - lzop + - libcapture-tiny-perl + - pv + state: present + +- name: install packages from self-build + become: true + ansible.builtin.apt: + deb: "{{ sanoid_deb_url }}" + state: present + +- name: create sanoid directories + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ sanoid_user }}" + group: "{{ sanoid_user_group }}" + mode: "0700" + with_items: + - "/etc/sanoid" + - "/etc/sanoid/.ssh" + +- name: include snaps tasks + ansible.builtin.include_tasks: snaps.yml + when: + - sanoid_datasets is defined + - sanoid_templates is defined + - sanoid_snaps_enable is defined + - sanoid_snaps_enable + +- name: ensure service are started + become: true + ansible.builtin.systemd: + state: started + name: "{{ item }}" + daemon_reload: true + masked: false + enabled: true + loop: + - sanoid.service + - sanoid-prune.service + - sanoid.timer + +- name: include source-host tasks + ansible.builtin.include_tasks: source.yml + when: + - sanoid_syncoid_source_host is defined and sanoid_syncoid_source_host is true + - sanoid_syncoid_ssh_pubkey is defined + +- name: include destination-host tasks + ansible.builtin.include_tasks: destination.yml + when: + - sanoid_syncoid_destination_host is defined and sanoid_syncoid_destination_host is true + - sanoid_syncoid_ssh_privkey is defined diff --git a/roles/mgrote_zfs_sanoid/tasks/snaps.yml b/roles/mgrote_zfs_sanoid/tasks/snaps.yml new file mode 100644 index 00000000..86e3ab6f --- /dev/null +++ b/roles/mgrote_zfs_sanoid/tasks/snaps.yml @@ -0,0 +1,49 @@ +--- +- name: Generate Sanoid Configuration + become: true + ansible.builtin.template: + src: sanoid.conf.j2 + dest: "/etc/sanoid/sanoid.conf" + owner: "{{ sanoid_user }}" + group: "{{ sanoid_user_group }}" + mode: "0400" + +- name: template sanoid_mail.service + become: true + ansible.builtin.template: + src: "sanoid_mail.service.j2" + dest: /etc/systemd/system/sanoid_mail.service + owner: root + group: root + mode: "0644" + notify: + - systemctl daemon-reload + +- name: add sanoid_mail.service to sanoid.service + become: true + ansible.builtin.blockinfile: + create: true + mode: "0644" + owner: root + group: root + path: /lib/systemd/system/sanoid.service.d/override.conf + block: | + [Unit] + OnFailure = sanoid_mail.service + notify: + - systemctl daemon-reload + +- name: set timer + become: true + ansible.builtin.blockinfile: + create: true + mode: "0644" + owner: root + group: root + path: /lib/systemd/system/sanoid.timer.d/override.conf + block: | + [Timer] + OnCalendar = {{ sanoid_timer }} + when: sanoid_timer is defined + notify: + - systemctl daemon-reload diff --git a/roles/mgrote_zfs_sanoid/tasks/source.yml b/roles/mgrote_zfs_sanoid/tasks/source.yml new file mode 100644 index 00000000..1a769cd3 --- /dev/null +++ b/roles/mgrote_zfs_sanoid/tasks/source.yml @@ -0,0 +1,23 @@ +--- +- name: template ssh public key + become: true + ansible.posix.authorized_key: + user: "{{ sanoid_user }}" + key: "{{ sanoid_syncoid_ssh_pubkey }}" + state: present + when: + - sanoid_syncoid_source_host + +- name: add user to sudoers + become: true + ansible.builtin.blockinfile: + path: /etc/sudoers + state: present + block: | + {{ sanoid_user }} ALL=(ALL) NOPASSWD:ALL + validate: '/usr/sbin/visudo -cf %s' + backup: true + marker_begin: sanoid-sudoers BEGIN + marker_end: sanoid-sudoers END + when: + - sanoid_syncoid_source_host diff --git a/roles/mgrote_zfs_sanoid/tasks/user.yml b/roles/mgrote_zfs_sanoid/tasks/user.yml new file mode 100644 index 00000000..541c63a2 --- /dev/null +++ b/roles/mgrote_zfs_sanoid/tasks/user.yml @@ -0,0 +1,19 @@ +--- +- name: ensure group exists + become: true + ansible.builtin.group: + name: "{{ sanoid_user_group }}" + state: present + when: + - sanoid_user_group is defined + - sanoid_user is defined + +- name: ensure user exists + become: true + ansible.builtin.user: + name: "{{ sanoid_user }}" + group: "{{ sanoid_user_group }}" + create_home: true + when: + - sanoid_user_group is defined + - sanoid_user is defined diff --git a/roles/mgrote.zfs_sanoid/templates/sanoid.conf.j2 b/roles/mgrote_zfs_sanoid/templates/sanoid.conf.j2 similarity index 100% rename from roles/mgrote.zfs_sanoid/templates/sanoid.conf.j2 rename to roles/mgrote_zfs_sanoid/templates/sanoid.conf.j2 diff --git a/roles/mgrote.zfs_sanoid/templates/sanoid_mail.service.j2 b/roles/mgrote_zfs_sanoid/templates/sanoid_mail.service.j2 similarity index 100% rename from roles/mgrote.zfs_sanoid/templates/sanoid_mail.service.j2 rename to roles/mgrote_zfs_sanoid/templates/sanoid_mail.service.j2 diff --git a/roles/mgrote.zfs_sanoid/templates/syncoid.service.j2 b/roles/mgrote_zfs_sanoid/templates/syncoid.service.j2 similarity index 100% rename from roles/mgrote.zfs_sanoid/templates/syncoid.service.j2 rename to roles/mgrote_zfs_sanoid/templates/syncoid.service.j2 diff --git a/roles/mgrote.zfs_sanoid/templates/syncoid.timer.j2 b/roles/mgrote_zfs_sanoid/templates/syncoid.timer.j2 similarity index 100% rename from roles/mgrote.zfs_sanoid/templates/syncoid.timer.j2 rename to roles/mgrote_zfs_sanoid/templates/syncoid.timer.j2 diff --git a/roles/mgrote.zfs_sanoid/templates/syncoid_mail.service.j2 b/roles/mgrote_zfs_sanoid/templates/syncoid_mail.service.j2 similarity index 100% rename from roles/mgrote.zfs_sanoid/templates/syncoid_mail.service.j2 rename to roles/mgrote_zfs_sanoid/templates/syncoid_mail.service.j2 diff --git a/roles/mgrote.zfs_scrub/README.md b/roles/mgrote_zfs_scrub/README.md similarity index 100% rename from roles/mgrote.zfs_scrub/README.md rename to roles/mgrote_zfs_scrub/README.md diff --git a/roles/mgrote_zfs_scrub/defaults/main.yml b/roles/mgrote_zfs_scrub/defaults/main.yml new file mode 100644 index 00000000..31569546 --- /dev/null +++ b/roles/mgrote_zfs_scrub/defaults/main.yml @@ -0,0 +1,2 @@ +--- +zfs_extra_path_zpool: "/usr/sbin/zpool" diff --git a/roles/mgrote_zfs_scrub/tasks/main.yml b/roles/mgrote_zfs_scrub/tasks/main.yml new file mode 100644 index 00000000..bfe0fa72 --- /dev/null +++ b/roles/mgrote_zfs_scrub/tasks/main.yml @@ -0,0 +1,84 @@ +--- +- name: template unit-template + become: true + ansible.builtin.template: + src: zpool-scrub@.service.j2 + dest: /etc/systemd/system/zpool-scrub@.service + owner: root + group: root + mode: "0644" + register: template_unit + +- name: template timer + become: true + ansible.builtin.template: + src: zpool-scrub@.timer.j2 + dest: "/etc/systemd/system/zpool-scrub@{{ item.name }}.timer" + owner: root + group: root + mode: "0644" + loop: "{{ zfs_extra_zfs_pools }}" + register: template_timer + +- name: template mail.service + become: true + ansible.builtin.template: + src: zpool-scrub-mail.service.j2 + dest: "/etc/systemd/system/zpool-scrub-mail.service" + owner: root + group: root + mode: "0644" + register: template_mail + +- name: systemctl daemon-reload + become: true + ansible.builtin.systemd: + daemon_reload: true + when: + - template_unit.changed + - template_timer.changed + +- name: systemctl enable units - timer + become: true + ansible.builtin.systemd: + name: "zpool-scrub@{{ item.name }}.timer" + enabled: true + masked: false + loop: "{{ zfs_extra_zfs_pools }}" + when: + - template_unit.changed + - template_timer.changed + +- name: systemctl enable units - mail + become: true + ansible.builtin.systemd: + name: "zpool-scrub-mail.service" + enabled: true + masked: false + when: + - template_mail + +- name: systemctl start units + become: true + ansible.builtin.systemd: + name: "zpool-scrub@{{ item.name }}.timer" + state: restarted + enabled: true + loop: "{{ zfs_extra_zfs_pools }}" + when: + - template_unit.changed + - template_timer.changed + +- name: remove old cronjobs + become: true + ansible.builtin.cron: + name: zfs-scrub - "{{ item.name }}" + state: absent + with_items: "{{ zfs_extra_zfs_pools }}" + +- name: remove proxmox system scrub job #https://forum.proxmox.com/threads/script-sequential-zfs-scrub-for-cron.25124/ + become: true + ansible.builtin.lineinfile: + path: /etc/cron.d/zfsutils-linux + state: absent + line: '24 0 8-14 * * root if [ $(date +\%w) -eq 0 ] && [ -x /usr/lib/zfs-linux/scrub ]; then /usr/lib/zfs-linux/scrub; fi' diff --git a/roles/mgrote.zfs_scrub/templates/zpool-scrub-mail.service.j2 b/roles/mgrote_zfs_scrub/templates/zpool-scrub-mail.service.j2 similarity index 100% rename from roles/mgrote.zfs_scrub/templates/zpool-scrub-mail.service.j2 rename to roles/mgrote_zfs_scrub/templates/zpool-scrub-mail.service.j2 diff --git a/roles/mgrote.zfs_scrub/templates/zpool-scrub@.service.j2 b/roles/mgrote_zfs_scrub/templates/zpool-scrub@.service.j2 similarity index 100% rename from roles/mgrote.zfs_scrub/templates/zpool-scrub@.service.j2 rename to roles/mgrote_zfs_scrub/templates/zpool-scrub@.service.j2 diff --git a/roles/mgrote.zfs_scrub/templates/zpool-scrub@.timer.j2 b/roles/mgrote_zfs_scrub/templates/zpool-scrub@.timer.j2 similarity index 100% rename from roles/mgrote.zfs_scrub/templates/zpool-scrub@.timer.j2 rename to roles/mgrote_zfs_scrub/templates/zpool-scrub@.timer.j2 diff --git a/roles/mgrote.zfs_zed/README.md b/roles/mgrote_zfs_zed/README.md similarity index 100% rename from roles/mgrote.zfs_zed/README.md rename to roles/mgrote_zfs_zed/README.md diff --git a/roles/mgrote_zfs_zed/handlers/main.yml b/roles/mgrote_zfs_zed/handlers/main.yml new file mode 100644 index 00000000..e1fe92f7 --- /dev/null +++ b/roles/mgrote_zfs_zed/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: testmail # noqa no-changed-when + ansible.builtin.shell: + cmd: "set -o pipefail && echo 'zed ist eingerichtet' | mail -s '{{ ansible_hostname }} - zed' '{{ empfaenger_mail }}'" + executable: /bin/bash diff --git a/roles/mgrote_zfs_zed/tasks/main.yml b/roles/mgrote_zfs_zed/tasks/main.yml new file mode 100644 index 00000000..69e817df --- /dev/null +++ b/roles/mgrote_zfs_zed/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: kopiere zed.rc + become: true + ansible.builtin.template: + owner: root + mode: "0600" + src: zed.rc + dest: /etc/zfs/zed.d/zed.rc + notify: testmail diff --git a/roles/mgrote.zfs_zed/templates/zed.rc b/roles/mgrote_zfs_zed/templates/zed.rc similarity index 100% rename from roles/mgrote.zfs_zed/templates/zed.rc rename to roles/mgrote_zfs_zed/templates/zed.rc diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml index 119de5da..d84b3a1a 100644 --- a/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/default/converge.yml @@ -5,7 +5,7 @@ lvm_groups: - vgname: my_vg disks: - - /dev/sdb1 + - /dev/sdb1 create: true lvnames: - lvname: my_lv diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml index ab055c73..87ca2333 100644 --- a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvm/converge.yml @@ -5,7 +5,7 @@ lvm_groups: - vgname: my_vg disks: - - /dev/vdb + - /dev/vdb create: true lvnames: - lvname: my_lv diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml index be123c46..7842c033 100644 --- a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmonlyvg/converge.yml @@ -5,7 +5,7 @@ lvm_groups: - vgname: my_vg disks: - - /dev/vdb + - /dev/vdb create: true manage_lvm: true tasks: diff --git a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml index 09d88bd8..e87c325c 100644 --- a/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml +++ b/roles/mrlesmithjr.ansible-manage-lvm/molecule/kvmsinglelv/converge.yml @@ -5,7 +5,7 @@ lvm_groups: - vgname: my_vg disks: - - /dev/vdb + - /dev/vdb create: true lvnames: - lvname: my_lv diff --git a/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml b/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml index 6b69e5ae..93babde1 100644 --- a/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml +++ b/roles/mrlesmithjr.ansible-manage-lvm/playbook.yml @@ -4,8 +4,8 @@ lvm_groups: - vgname: test-vg disks: - - /dev/sdb - - /dev/sdc + - /dev/sdb + - /dev/sdc create: true lvnames: - lvname: test_1