From c8227ef3c4bc042937913b4afade2dd15ef7912b Mon Sep 17 00:00:00 2001 From: Tim Moody Date: Wed, 6 Feb 2019 11:41:24 -0500 Subject: [PATCH] minetest for rpi initial checkin --- roles/minetest/defaults/main.yml | 10 ++ roles/minetest/tasks/calc_vars.yml | 13 +++ roles/minetest/tasks/main.yml | 95 +++++++++++++++++++ roles/minetest/tasks/minetest_install.yml | 76 +++++++++++++++ .../minetest/tasks/minetest_install_mods.yml | 28 ++++++ roles/minetest/tasks/rpi_minetest_install.yml | 71 ++++++++++++++ .../templates/minetest-serve.service.j2 | 14 +++ roles/minetest/templates/minetest.conf.j2 | 32 +++++++ 8 files changed, 339 insertions(+) create mode 100644 roles/minetest/defaults/main.yml create mode 100644 roles/minetest/tasks/calc_vars.yml create mode 100644 roles/minetest/tasks/main.yml create mode 100644 roles/minetest/tasks/minetest_install.yml create mode 100644 roles/minetest/tasks/minetest_install_mods.yml create mode 100644 roles/minetest/tasks/rpi_minetest_install.yml create mode 100644 roles/minetest/templates/minetest-serve.service.j2 create mode 100644 roles/minetest/templates/minetest.conf.j2 diff --git a/roles/minetest/defaults/main.yml b/roles/minetest/defaults/main.yml new file mode 100644 index 000000000..141df1bdc --- /dev/null +++ b/roles/minetest/defaults/main.yml @@ -0,0 +1,10 @@ +minetest_runas_user: minetest +minetest_runas_group: minetest + +minetest_port: 30000 +minetest_config_file: /etc/minetest/minetest.conf +minetest_server_admin: Admin + +# Installation Variables +minetest_install: False +minetest_enabled: False diff --git a/roles/minetest/tasks/calc_vars.yml b/roles/minetest/tasks/calc_vars.yml new file mode 100644 index 000000000..5720f6143 --- /dev/null +++ b/roles/minetest/tasks/calc_vars.yml @@ -0,0 +1,13 @@ +# For rpi installs + +- name: Set some facts for rpi + set_fact: + minetest_server_bin: /library/games/minetest/bin/minetestserver + minetest_world_dir: /library/games/minetest/worlds/world + minetest_game_dir: /library/games/minetest/games/minetest_game +# only works if server run as root + minetest_runas_user: root + minetest_runas_group: root + when: is_rpi + +# For other installs TBD diff --git a/roles/minetest/tasks/main.yml b/roles/minetest/tasks/main.yml new file mode 100644 index 000000000..8bd190481 --- /dev/null +++ b/roles/minetest/tasks/main.yml @@ -0,0 +1,95 @@ +# Give message and end play for unsupported platforms +# For now only support rpi + +- name: No install except Raspberry Pi for now + debug: + msg: "No install except Raspberry Pi for now." + when: not is_rpi + +- name: Terminate play + meta: end_play + when: not is_rpi + +- include_tasks: calc_vars.yml + +- name: Ensure group minetest exists + group: + name: "{{ minetest_runas_group }}" + state: present + when: minetest_runas_user != 'root' + +- name: Create minetest user + user: + name: "{{ minetest_runas_user }}" + groups: "{{ minetest_runas_group }}" + state: present + createhome: no + shell: /bin/false + when: minetest_runas_user != 'root' + +- name: Check for minetest world file + stat: + path: "{{ minetest_world_dir }}/world.mt" + register: minetest_world + +# rpi only +- include_tasks: rpi_minetest_install.yml + when: minetest_install and not minetest_world.stat.exists and is_rpi + +# not rpi +- include_tasks: minetest_install.yml + when: minetest_install and not minetest_world.stat.exists and not is_rp + +# Install mods +- include: minetest_install_mods.yml + with_items: + - name: moreblocks + url: https://github.com/minetest-mods/moreblocks/archive/master.zip + - name: moreores + url: https://github.com/Calinou/moreores/archive/master.zip + - name: basic_materials + url: https://gitlab.com/VanessaE/basic_materials/-/archive/master/basic_materials-master.zip + - name: mesecons + url: https://github.com/minetest-mods/mesecons/archive/master.zip + - name: digilines + url: https://github.com/minetest-mods/digilines/archive/master.zip + - name: pipeworks + url: https://github.com/minetest-mods/pipeworks/archive/master.zip + - name: Minetest-WorldEdit + url: https://github.com/Uberi/Minetest-WorldEdit/archive/master.zip + when: minetest_install + +# enable or disable +- name: Enable & Restart 'minetest-serve' service + service: + name: minetest-serve + enabled: yes + state: restarted + when: minetest_install and minetest_enabled + +- name: Disable 'minetest-serve' service + service: + name: minetest-serve + enabled: no + state: stopped + when: minetest_install and not minetest_enabled + +- name: Add 'minetest' variable values to {{ iiab_ini_file }} + ini_file: + path: "{{ iiab_ini_file }}" + section: minetest + option: "{{ item.option }}" + value: "{{ item.value }}" + with_items: + - option: name + value: Minetest Server + - option: description + value: '"Well known game Minetest."' + - option: minetest_world_dir + value: "{{ minetest_world_dir }}" + - option: minetest_port + value: "{{ minetest_port }}" + - option: minetest_enabled + value: "{{ minetest_enabled }}" + - option: minetest_world_dir + value: "{{ minetest_world_dir }}" \ No newline at end of file diff --git a/roles/minetest/tasks/minetest_install.yml b/roles/minetest/tasks/minetest_install.yml new file mode 100644 index 000000000..e9de426ba --- /dev/null +++ b/roles/minetest/tasks/minetest_install.yml @@ -0,0 +1,76 @@ +# For non-rpi installs +# Still a work in progress + +- name: Set some facts + set_fact: + minetest_server_bin: /usr/lib/minetest/minetestserver +# minetest_world_dir: /var/games/minetest-server/.minetest/worlds/world/ should be in library + minetest_mods_dir: /usr/share/games/minetest_game/mods/ + +- name: Ensure group minetest exists + group: + name: "{{ minetest_runas_group }}" + state: present + +- name: Create minetest user + user: + name: "{{ minetest_runas_user }}" + groups: "{{ minetest_runas_group }}" + state: present + createhome: no + +- name: Create minetest world directory + file: path={{ item }} + mode=0755 + owner={{ minetest_runas_user }} + group={{ minetest_runas_group }} + state=directory + with_items: + - "{{ minetest_world_dir }}" + +- name: Install minetest package + debug: + msg: "No install except Raspberry Pi for now." + when: not is_rpi + +- name: Download minetest if not package + get_url: + url: "{{ rpi_src_url }}" + dest: "{{ downloads_dir }}/{{ rpi_src }}" + timeout: "{{ download_timeout }}" + when: is_rpi + +- name: Install minetest if not package + debug: + msg: "placeholder." + when: is_rpi + +- name: Create /etc/minetest + file: path={{ item }} + mode=0755 + owner=root + group=root + state=directory + with_items: + - /etc/minetest + +# - name: move files to world dir + +- name: Change binary name if not rpi + set_fact: + minetest_server_bin: /usr/bin/minetest-server + when: not is_rpi + +- name: Create minetest-server service and minetest.conf file + template: + backup: no + src: "{{ item.src }}" + dest: "{{ item.dest }}" + owner: root + group: root + mode: "{{ item.mode }}" + with_items: + - { src: 'minetest.conf.j2', dest: '/etc/minetest/minetest.conf', mode: '0644'} + - { src: 'minetest-serve.service.j2', dest: '/etc/systemd/system/minetest-serve.service', mode: '0644'} + +# - name: Start minetest diff --git a/roles/minetest/tasks/minetest_install_mods.yml b/roles/minetest/tasks/minetest_install_mods.yml new file mode 100644 index 000000000..83b925244 --- /dev/null +++ b/roles/minetest/tasks/minetest_install_mods.yml @@ -0,0 +1,28 @@ +- name: Check if mod already installed + stat: + path: "{{ minetest_game_dir }}/mods/{{ item.name }}" + register: minetest_mod + +- name: Download one minetest mod + get_url: + url: "{{item.url}}" + dest: "{{ downloads_dir }}/{{ item.name }}.zip" + mode: 0440 + when: not minetest_mod.stat.exists + +- name: Extract mod into mods of current game + unarchive: + src: "{{ downloads_dir }}/{{ item.name }}.zip" + dest: "{{ minetest_game_dir }}/mods" + owner: "{{ minetest_runas_user }}" + group: "{{ minetest_runas_group }}" + when: not minetest_mod.stat.exists + +- name: Check if mod name has 'master' in it + stat: + path: "{{ minetest_game_dir }}/mods/{{ item.name }}-master" + register: minetest_mod_master + +- name: Rename mod to canonical name if has '-master' in name + command: mv "{{ minetest_game_dir }}/mods/{{ item.name }}-master" "{{ minetest_game_dir }}/mods/{{ item.name }}" + when: minetest_mod_master.stat.exists diff --git a/roles/minetest/tasks/rpi_minetest_install.yml b/roles/minetest/tasks/rpi_minetest_install.yml new file mode 100644 index 000000000..1f466fc09 --- /dev/null +++ b/roles/minetest/tasks/rpi_minetest_install.yml @@ -0,0 +1,71 @@ +# For rpi installs + +- name: Set some facts + set_fact: + rpi_src_url: http://www.nathansalapat.com/downloads/0.4.17.1.tar.gz + rpi_src: minetest-0.4.17.1.tar.gz + +- name: Install packages for minetest + package: + name: "{{ item }}" + state: present + with_items: + - libhiredis-dev + +#- name: Minetest already installed - terminate play +# meta: end_play +# when: minetest_world.stat.exists + +- name: Download minetest for rpi + get_url: + url: "{{ rpi_src_url }}" + dest: "{{ downloads_dir }}/{{ rpi_src }}" + timeout: "{{ download_timeout }}" + +- name: Create /etc/minetest and /library/games directories + file: + path: "{{ item }}" + mode: 0755 + owner: root + group: root + state: directory + with_items: + - /etc/minetest + - /library/games + +- name: Create /var/log/minetest directory + file: + path: "{{ item }}" + mode: 0755 + owner: "{{ minetest_runas_user }}" + group: "{{ minetest_runas_group }}" + state: directory + with_items: + - /var/log/minetest + +- name: Extract minetest into /library/games + unarchive: + src: "{{ downloads_dir }}/{{ rpi_src }}" + dest: /library/games + owner: "{{ minetest_runas_user }}" + group: "{{ minetest_runas_group }}" + +- name: Create symbolic link + file: + src: /library/games/0.4.17.1 + dest: /library/games/minetest + owner: "{{ minetest_runas_user }}" + group: "{{ minetest_runas_group }}" + state: link + +- name: Create minetest-server service and minetest.conf file + template: + backup: no + src: "{{ item.src }}" + dest: "{{ item.dest }}" + owner: root + group: root + mode: "{{ item.mode }}" + with_items: + - { src: 'minetest.conf.j2', dest: '/etc/minetest/minetest.conf', mode: '0644'} + - { src: 'minetest-serve.service.j2', dest: '/etc/systemd/system/minetest-serve.service', mode: '0644'} diff --git a/roles/minetest/templates/minetest-serve.service.j2 b/roles/minetest/templates/minetest-serve.service.j2 new file mode 100644 index 000000000..6a65e047e --- /dev/null +++ b/roles/minetest/templates/minetest-serve.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=Minetest Server +After=network.target + +[Service] +Type=simple +User={{ minetest_runas_user }} +Group={{ minetest_runas_group }} +WorkingDirectory=/library/games/minetest +ExecStart={{ minetest_server_bin }} --port {{ minetest_port }} --config {{ minetest_config_file }} --logfile /var/log/minetest/minetest.log --world {{ minetest_world_dir }} +Restart=on-abort + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/roles/minetest/templates/minetest.conf.j2 b/roles/minetest/templates/minetest.conf.j2 new file mode 100644 index 000000000..13cdffa5c --- /dev/null +++ b/roles/minetest/templates/minetest.conf.j2 @@ -0,0 +1,32 @@ +# Admin name +name = {{ minetest_server_admin }} + +# Name of server +server_name = Internet in a Box Minetest Server + +# Automaticaly report to masterserver +# set to true for public servers +server_announce = false + +# Default game (default when creating a new world) +default_game = minetest + +# Maximum number of players connected simultaneously +max_users = 15 + +# Whether to enable players killing each other +enable_pvp = false + +# Set to true to enable creative mode (unlimited inventory) +creative_mode = true + +# Enable players getting damage and dying +enable_damage = true + +# Available privileges: interact, shout, teleport, settime, privs, ... +# See /privs in game for a full list on your server and mod configuration. +default_privs = interact, shout, teleport, settime, privs + +# For mods +spawn_friendly_mobs = true +spawn_hostile_mobs = false \ No newline at end of file