diff --git a/roles/9-local-addons/tasks/main.yml b/roles/9-local-addons/tasks/main.yml index 674245bc6..fa65a7f2f 100644 --- a/roles/9-local-addons/tasks/main.yml +++ b/roles/9-local-addons/tasks/main.yml @@ -15,6 +15,12 @@ when: calibreweb_install tags: calibre-web +- name: MINETEST + include_role: + name: minetest + when: minetest_install + tags: minetest + - name: Recording STAGE 9 HAS COMPLETED ==================== lineinfile: dest: "{{ iiab_env_file }}" diff --git a/roles/minetest/README.rst b/roles/minetest/README.rst new file mode 100644 index 000000000..556830359 --- /dev/null +++ b/roles/minetest/README.rst @@ -0,0 +1,19 @@ +=============== +Minetest README +=============== + +For the first release the minetest server can only be installed in a Raspberry Pi. + +You will need a minetest client app for your device in order to connect to the server. + +The port is nominally the standard 30000 but can be changed using the variable minetest_port and +the admin user is the usual Admin. Note that no password is required. + +Please note that the initial configuration is for creative mode and there are a number of mods installed. +(see the list in tasks/main.yml) + +Locations on the Raspberry Pi +----------------------------- + +- The config file is /etc/minetest/minetest.conf +- The rest of the files are a normal layout based in /library/games/minetest 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..10863b140 --- /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_rpi + +# 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 diff --git a/roles/network/templates/gateway/iiab-gen-iptables b/roles/network/templates/gateway/iiab-gen-iptables index 37e10452c..a9c215803 100755 --- a/roles/network/templates/gateway/iiab-gen-iptables +++ b/roles/network/templates/gateway/iiab-gen-iptables @@ -65,6 +65,7 @@ transmission_peer_port={{ transmission_peer_port }} sugarizer_port={{ sugarizer_port }} nodered_port={{ nodered_port }} mosquitto_port={{ mosquitto_port }} +minetest_port={{ minetest_port }} block_DNS={{ block_DNS }} echo "LAN is $lan and WAN is $wan" @@ -104,6 +105,7 @@ if [ "$services_externally_visible" == "True" ]; then $IPTABLES -A INPUT -p tcp --dport $mosquitto_port -m state --state NEW -i $wan -j ACCEPT $IPTABLES -A INPUT -p tcp --dport $transmission_http_port -m state --state NEW -i $wan -j ACCEPT $IPTABLES -A INPUT -p tcp --dport $transmission_peer_port -m state --state NEW -i $wan -j ACCEPT + $IPTABLES -A INPUT -p udp --dport $minetest_port -m state --state NEW -i $wan -j ACCEPT fi if [ "$iiab_gateway_enabled" == "True" ]; then diff --git a/vars/default_vars.yml b/vars/default_vars.yml index 5d038ad21..0865ca5d5 100644 --- a/vars/default_vars.yml +++ b/vars/default_vars.yml @@ -436,6 +436,11 @@ calibreweb_port: 8083 # PORT VARIABLE HAS NO EFFECT (as of January 2019) calibreweb_url: /books calibreweb_home: "{{ content_base }}/calibre-web" # /library/calibre-web +# Minetest +minetest_install: False +minetest_enabled: False + +minetest_port: 30000 # CONSIDER THESE 2 NEW OPENSTREETMAP (OSM) APPROACHES INSTEAD, AS OF 2018: # - http://download.iiab.io/content/OSM/vector-tiles/