Modul admin

Dieses Modul implementiert ein graphisches Administrations-Interface für SmartHomeNG. Das ermöglicht die vollständige Konfiguration von SmartHomeNG.

Das Modul implementiert eine Reihe von REST Interfaces, die vom „Web Interface“, einer Angular Applikation genutzt werden um die Daten im Browser anzuzeigen bzw. zu manipulieren. Das Web Interface wird über das http Modul bereit gestellt, wie es auch bei den Web Interfaces der Plugins der Fall ist.

API des Moduls

Im folgenden werden die einzelnen APIs des Moduls beschrieben.

API des Moduls admin.rest

RESTResource ist die Grundlegende Klasse um REST Interfaces über das im http Modul verwendete CherryPy zur Verfügung zu stellen.

class modules.admin.rest.RESTResource[Quellcode]

REST Resource

cherrypy controller mixin to make it easy to build REST applications.

handles nested resources and method-based dispatching.

here’s a rough sample of what a controller would look like using this:

cherrypy.root = MainController() cherrypy.root.user = UserController()

class PostController(RESTResource):
def index(self,post):

return post.as_html()

index.expose_resource = True

def delete(self,post):

post.destroySelf() return „ok“

delete.expose_resource = True

def update(self,post,title=““,body=““):

post.title = title post.body = body return „ok“

update.expose_resource = True

def add(self, post, title=““, body=““)

post.title = title post.body = body return „ok“

update.expose_resource = True

def REST_instantiate(self, slug):
try:

return Post.select(Post.q.slug == slug, Post.q.userID = self.parent.id)[0]

except:

return None

def REST_create(self, slug):

return Post(slug=slug,user=self.parent)

class UserController(RESTResource):

REST_children = {‚posts‘ : PostController()}

def index(self,user):

return user.as_html()

index.expose_resource = True

def delete(self,user):

user.destroySelf() return „ok“

delete.expose_resource = True

def update(self,user,fullname=““,email=““):

user.fullname = fullname user.email = email return „ok“

update.expose_resource = True

def add(self, user, fullname=““, email=““):

user.fullname = fullname user.email = email return „ok“

add.expose_resource = True

def extra_action(self,user):

# do something else

extra_action.expose_resource = True

def REST_instantiate(self, username):
try:

return User.byUsername(username)

except:

return None

def REST_create(self, username):

return User(username=username)

then, the site would have urls like:

/user/bob /user/bob/posts/my-first-post /user/bob/posts/my-second-post

which represent REST resources. calling ‚GET /usr/bob‘ would call the index() method on UserController for the user bob. ‚PUT /usr/joe‘ would create a new user with username ‚joe‘. ‚DELETE /usr/joe‘ would delete that user. ‚GET /usr/bob/posts/my-first-post‘ would call index() on the Post Controller with the post with the slug ‚my-first-post‘ that is owned by bob.


API des Moduls api_plugins

class modules.admin.api_plugins.PluginsController(module)[Quellcode]

Bases: RESTResource

read(id=None)[Quellcode]

Handle GET requests for threads API

return an object with type info about all installed plugins

class modules.admin.api_plugins.PluginsInstalledController(module)[Quellcode]

Bases: RESTResource

read(id=None)[Quellcode]

return an object with data about all installed plugins

class modules.admin.api_plugins.PluginsConfigController(module)[Quellcode]

Bases: RESTResource

read(id=None)[Quellcode]

return an object with data about all configured plugins

class modules.admin.api_plugins.PluginsInfoController(module, shng_url_root)[Quellcode]

Bases: RESTResource

blog_urls = {}
stop()[Quellcode]

If the Controller has started threads or uses python modules that created threads, put cleanup code here.

read(id=None)[Quellcode]

return a list of all configured plugin instances

class modules.admin.api_plugins.PluginsAPIController(module)[Quellcode]

Bases: RESTResource

read(id=None)[Quellcode]

return a list of all configured plugin instances

class modules.admin.api_plugins.PluginsLogicParametersController(module)[Quellcode]

Bases: RESTResource

read(id=None)[Quellcode]

return an object with data about the logic parameters of all configured plugins


API des Moduls api_plugin

class modules.admin.api_plugin.PluginController(module, jwt_secret=False)[Quellcode]

Bases: RESTResource

get_body()[Quellcode]

Get content body of received request header

Rückgabe:

test_for_old_config(config_filename)[Quellcode]
get_config_filename()[Quellcode]
read(id=None)[Quellcode]

return an object with type info about all installed plugins

add(id=None)[Quellcode]
handle_plugin_action(id, action)[Quellcode]
update(id='', action='')[Quellcode]
delete(id=None)[Quellcode]

API des Moduls (WebApi)

class modules.admin.WebApi(webif_dir, module, shng_url_root, url_root)[Quellcode]

Bases: RESTResource

Parameter:
  • webif_dir (str) – Directory where the files of the web interface (shngadmin) are stored

  • module (object) – Instance of the webif object

  • shng_url_root (str) –

  • url_root (str) –


README

README
# Module admin (README)

This module implements the administration interface for SmartHomeNG.


## Requirements

This module is running under SmmartHomeNG versions beyond develop version v1.5d. It requires Python >= 3.4 as well as ... . You can install the libraries (python modules) with:

```
(sudo apt-get install ...)
sudo pip3 install ...
```

And please pay attention that the lib(s) are installed for Python3 and not an older Python 2.7 that is probably installed on your system. Be carefull to use `pip3` and nor `pip`.

> Note: This module needs the module handling in SmartHomeNG to be activated. Make sure, that `use_modules`in `etc/smarthome.yaml` is **not** set to False!


## Configuration

### etc/module.yaml


```yaml
# etc/module.yaml
admin:
    module_name: admin
```


## API des Moduls admin

Im folgenden sind die einzelnen Teile des REST APIs beschrieben, 
welches das admin Modul zur Verfügung stellt und intern nutzt.

Wenn zur Nutzung des einzelen APIs eine Authentifizierung notwendig 
ist, ist dieses erwähnt.


### AUTH API -  Authentification for clients

#### POST /api/auth/
Authentifiziert den Client bei SmartHomeNG und erhält einen
Token (JWT) bei erfolgreicher Authentifizierung.


### CONFIG API - Get and update information about the core's configuration

#### GET /api/config
liefert die Konfiguration des Core von SmartHomeNG

#### GET /api/config/\<module (or 'common')>
liefert die Konfiguration der Modules oder des allgemeinen 
(common) Teils von SmartHomeNG

#### PUT /api/config/\<module (or 'common')>
Macht ein Update auf den entsprechenden Teil der Konfiguration

-> authentication_needed = True


### LOGICS API - xxx

#### ???


### LOGS API - Get information about logs and get log content

#### GET /api/logs
liefert die Liste der vorhandenen logs

#### GET /api/logs/\<logname>
liefert den Inhalt einer log-Datei


### PLUGINS API - Get information about installed or configured plugins

#### GET /api/plugins
liefert die Liste der installierten Plugins

#### GET /api/plugins/config
liefert die gesamte config


## PLUGIN API  -  Handle a single plugin configuration

#### POST /api/plugin/config/\<neu> 
legt eine neue Confic-section Namens ‚\<neu>‘ an

-> authentication_needed = True

#### PUT /api/plugin/config/\<plgsection>
Macht ein Update auf die Section ‚\<plgsection>‘

-> authentication_needed = True

#### DELETE /api/plugin/config/\<plgsection> 
Löscht die Section ‚\<plgsection>‘

-> authentication_needed = True


## SCENES API  -  Get information about configured scenes

####GET /api/scenes
liefert die Liste der konfigurierten Szenen


## SCHEDULER API  -  Get information about configured schedulers

####GET /api/sched
liefert die Liste der konfigurierten Scheduler


## SCHEDULER API  -  Get information about the SmartHomeNG server configuration

####GET /api/serverinfo
liefert Informationen über die Konfiguration des SmartHomeNG Servers


## THREADS API  -  Get information about running threads

####GET /api/threads
liefert die Liste der laufenden Threads


## STATUS API  -  Get running status of the SmartHomeNG server instance

####GET /api/status
liefert den aktuellen Status von SmartHomeNG


## RESTART API  -  Restart the SmartHomeNG server instance

####GET /api/restart
Startet die SmartHomeNG Server Instanz neu


##


### Test if module admin is loaded

`admin` is a loadlable module. Therefore there is no guarantiee that it is present in every system. Before you can use this module, you have to make sure ist is loaded. You can do it by calling a method of the main smarthome object. Do it like this:

```
self.classname = self.__class__.__name__

try:
    self.mod_admin = self._sh.get_module('admin')
except:
    self.mod_admin = None
    
if self.mod_admin == None:
    # Do what is necessary if you can't use the admin interface
    # for your plugin. For example:
    self.logger.error('{}: Module ''admin'' not loaded - Abort loading of plugin {0}'.format(self.classname))
    return
```

Metadaten

Auskommentierte Parameter in den Metadaten sind noch nicht implementiert. Die Implementierung dieser Parameter wird im Rahmen der Weiterentwicklung von SmartHomeNG erfolgen:

module.yaml
# Metadata for the plugin
module:
    # Global module attributes
    classname: Admin
    version: 1.8.2
    sh_minversion: 1.7.2c
#    sh_maxversion: 1.3             # maximum shNG version to use this plugin (leave empty if latest)
    description:
        de: 'Dieses Modul implementiert das Administrationinterface von SmartHomeNG'
        en: 'This module implements the administration interface for SmartHomeNG'
        fr: "Ce module implémente l'interface d'administration pour SmartHomeNG"

parameters:
    login_expiration:
        type: num
        default: 48
        description:
            de: 'Ablaufdauer des Logins in Stunden (ab Loginzeitpunkt)'
            en: 'Expiration time of the login in hours (counting from time of login)'
            fr: "Temps d'expiration de l'identification en heures (à partir du moment de l'identification)"

    login_autorenew:
        type: bool
        gui_type: yes_no
        default: True
        description:
            de: 'Bestehendes Login-Token automatisch verlängern'
            en: 'Automatically extend an existing login-token'
#            fr: ""

    pypi_timeout:
        type: int
        default: 5
        description:
            de: 'Timeout bei der Abfrage der pypi Website'
            en: 'Timeout for getting data from the pypi website'
            fr: "Délai d'attente pour obtenir des données du site Web Pypi"

    itemtree_fullpath:
        type: bool
        gui_type: yes_no
        default: True
        description:
            de: 'Im Item-Tree die Items mit vollem Pfad-Namen anzeigen'
            en: 'Display items with full path in item tree'
            fr: "Afficher le chemin complèt des objets dans l'arborescence"

    itemtree_searchstart:
        type: num
        default: 2
        description:
            de: 'Minimale Anzahl eingegebener Zeichen ab denen die Suche im Item-Tree beginnt'
            en: 'Minimum number of entered characters to start searching the item tree'
            fr: "Nombre minimum de caractères entrés pour démarrer la recherche dans l'arborescence"

    websocket_host:
        type: ip
        description:
            de: 'IP Adresse für den websocket Zugriff'
            en: 'ip address to use for websocket access'
            fr: "Adresse IP à utiliser pour l'accès websocket"

    websocket_port:
        type: int
        valid_min: 0
        valid_max: 65535
        default: 2424
        description:
            de: 'Port der für den Websocket Zugriff verwendet wird'
            en: 'Port that is used for the websocket protocol'
            fr: "Port à utiliser pour l'accès websocket"

    log_chunksize:
        type: int
        valid_min: 25
        valid_max: 5000
        default: 1000
        description:
            de: 'Größe der gelesenen Blöcke bei der Anzeige großer Logdateien'
            en: 'Size of blocks (chunks) read when displaying large logfiles'
            fr: "Taille des morceaux lus lors de l'affichage de fichiers journaux volumineux"

    developer_mode:
        type: bool
        default: False
        gui_type: on_off

        description:
            de: 'Entwickler Modus aktivieren (Ist für das Core Entwickler Team gedacht)'
            en: 'Activate developer mode'

    rest_dispatch_force_exception:
        type: bool
        gui_type: yes_no
        default: False
        description:
            de: 'Sollen WARNINGs aus REST_dispatch_execute als EXECPTION geloggt werden?'
            en: 'Activate developer mode'

    click_dropdown_header:
        type: bool
        gui_type: yes_no
        default: False
        description:
            de: 'Click auf Kopfeintrag von Dropdown Menüs erlauben'
            en: 'Allow click on header of dropdown menus'