#!/usr/bin/env python3
# The MIT License (MIT)
#
# Copyright (c) 2014-2018 <see AUTHORS.txt>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# Modules
# ------------------------------------------------
# std
import os
# emsm
import emsm
# Backward compatibility
# ------------------------------------------------
try:
FileExistsError
except NameError:
FileExistsError = OSError
# Data
# ------------------------------------------------
__all__ = [
"Pathsystem"
]
# Classes
# ------------------------------------------------
[docs]class Pathsystem(object):
"""
Manages the paths to the different files and directories of the
application.
The EMSM distinguishes two primary folders:
The *instance* folder, where the worlds, server, configuration and plugins
of the user are placed. The *instance* folder can actually be considered to
be the working directory of the EMSM.
On the other side is the EMSM installation directory. The *emsm* directory.
This directory is usually placed in Python's third party library folder
(site-packages) and contains the EMSM core application and the core plugins.
#. *emsm* directory:
.. code-block:: none
|- emsm
|- core
|- lib
|- ...
|- __init__.py
|- application.py
|- argparse_.py
|- base_plugin.py
|- ...
|- plugins
|- __init__.py
|- backups.py
|- emsm.py
|- guard.py
|- ...
|- __init__.py
#. *instance* folder:
.. code-block:: none
|- instance # usually /opt/minecraft
|- conf # the emsm configuration files
|- main.conf
|- server.conf
|- worlds.conf
|- plugins # the user's plugins.
|- __init__.py
|- myawesomeplugin.py
|- ...
|- plugins_data # data generated or needed by the plugins
|- backups
|- emsm
|- guard
|- ...
|- myawesomeplugin
|- ...
|- server # the server executables
|- minecraft_server.jar
|- craftbukkit.jar
|- ...
|- worlds # the data of the worlds (minecraft map, ...)
|- foo
|- server.properties
|- ...
|- bar
|- server.properties
|- ...
|- logs
|- emsm.log
|- emsm.log.1
|- ...
|- minecraft.py
"""
def __init__(self, instance_dir):
"""
"""
self._instance_dir = instance_dir
self._emsm_dir = os.path.dirname(emsm.__file__)
return None
[docs] def create(self):
"""
Creates the folders used by the EMSM Application.
This method should only be called, after the EMSM downgraded it's
priviliges.
"""
def make_dir(path):
"""
Creates the directory *path* if it does not exist or
returns silently, if it does.
"""
try:
os.makedirs(path, exist_ok=True)
except OSError:
pass
return None
make_dir(self.instance())
make_dir(self.conf())
make_dir(self.plugins())
make_dir(self.plugins_data())
make_dir(self.server())
make_dir(self.worlds())
make_dir(self.logs())
return None
# EMSM
[docs] def emsm(self):
"""
Returns the path to the *emsm* installation directory. This folder
is usually located in Python's ``site-packages`` directory.
"""
return self._emsm_dir
[docs] def emsm_core(self):
"""
Returns the path to the *emsm.core* directory.
"""
return os.path.join(self._emsm_dir, "core")
[docs] def emsm_plugins(self):
"""
Returns the path to the *emsm.plugins* directory. The directory contains
the core plugins like *worlds*, *server*, *backups*, ...
"""
return os.path.join(self._emsm_dir, "plugins")
# Instance
[docs] def instance(self):
"""
The *instance* folder contains all data generated by the EMSM
application and the minecraft worlds.
"""
return self._instance_dir
[docs] def conf(self):
"""
Contains the configuration files of the EMSM. **Not** the configuration
for the minecraft worlds. These are still located in the world folder.
The directory contains the *main.conf*, *server.conf* and
*worlds.conf* file.
The directory is located in the *instance* folder.
"""
return os.path.join(self._instance_dir, "conf")
[docs] def plugins(self):
"""
Contains all user plugins and plugin packages.
The directory is located in the *instance* folder.
.. seealso:: :meth:`emsm_plugins`
"""
return os.path.join(self._instance_dir, "plugins")
[docs] def plugins_data(self):
"""
The directory that contains the data generated or used by all plugins.
The directory is located in the *instance* folder.
.. seealso:: :meth:`plugin_data``
"""
return os.path.join(self._instance_dir, "plugins_data")
[docs] def plugin_data(self, plugin_name):
"""
This directory contains all data of the plugin with the name
*plugin_name*.
The directory is a subfolder of :meth:`plugins_data`.
"""
return os.path.join(self.plugins_data(), plugin_name)
[docs] def server(self):
"""
This directory contains all server executables specified in
the ``server.conf`` configuration file.
The directory is located in the *instance* folder.
.. seealso:: :meth:`server_`
"""
return os.path.join(self._instance_dir, "server")
[docs] def server_(self, server_name):
"""
This directory contains the server software for the server with the
name *server_name*.
The directory is located in the :meth:`server` folder.
.. todo::
* Try to find better names for *server* and *server_*. They are hard
to distinguish.
"""
return os.path.join(self.server(), server_name)
[docs] def worlds(self):
"""
Contains for each world in ``worlds.conf`` one folder that contains
the data generated by the minecraft server.
The directory is located in the *instance* folder.
.. seealso:: :meth:`world`
"""
return os.path.join(self._instance_dir, "worlds")
[docs] def world(self, world_name):
"""
This directory contains the data generated by the minecraft server
which powers the world *world_name*.
It contains among others those files:
* :file:`server.properties`
* :file:`ops.json`
* :file:`whitelist.json`
Furthermore, it is a child of :meth:`worlds`.
"""
return os.path.join(self.worlds(), world_name)
[docs] def logs(self):
"""
Contains the EMSM log files.
Note, that this is NOT the log directory of the minecraft server.
"""
return os.path.join(self._instance_dir, "log")