Browse Source

ajout apikaz

master
fabrice.regnier 2 weeks ago
parent
commit
5ccc271e7c
  1. 320
      dockers/apikaz/source/app.py

320
dockers/apikaz/source/app.py

@ -2,15 +2,24 @@ import os
import requests
import subprocess
from flask import Flask, jsonify, send_from_directory, request, abort
from flask import Flask, jsonify, send_from_directory, request, abort, json, Response
from flasgger import Swagger
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
swagger = Swagger(app)
#swagger = Swagger(app)
swagger = Swagger(app, template={
"swagger": "2.0",
"info": {
"title": "L'API Kaz de la mort qui tue",
"version": "0.0.2",
"description": "Permettre des opérations de gestion des services kaz avec des écrans Ouaib"
}
})
#*************************************************
#Filtrer les IP qui peuvent accéder à l'api
trusted_ips = [
"78.127.1.19",
@ -31,6 +40,28 @@ def limit_remote_addr():
#*************************************************
# @app.route('/test')
# def test():
# return os.environ.get('mattermost_url')
#*************************************************
# @app.route('/print_env')
# def print_environment():
# # Crée une chaîne de caractères pour stocker les variables d'environnement
# env_string = ""
#
# # Itère sur les variables d'environnement et les ajoute à la chaîne de caractères
# for key, value in os.environ.items():
# env_string += f"{key}: {value}\n" + "<br>"
#
# # Retourne la chaîne de caractères contenant les variables d'environnement
# return env_string
#*************************************************
#*************************************************
#variables globales
paheko_ident=os.environ.get('paheko_API_USER')
@ -49,59 +80,11 @@ def favicon():
return '', 204
#*************************************************
#la page d'accueil est vide
@app.route('/')
def silence():
return ''
#*************************************************
# class HelloWorld(Resource):
# def get(self):
# """
# titre de la desc: Un simple HelloWorld
# Détail de la desc....
# ---
# parameters: []
# responses:
# 200:
# description: A simple message HelloWorld
# 404:
# description: Aie aie aie !!!
# """
# return {'message': 'Hello World!'}
#
# api.add_resource(HelloWorld, '/hello')
#*************************************************
#DANGER si on touche à l'indentation pour swagger, c'est cuit!
# class Username(Resource):
# def get(self, username):
# """
# This examples uses FlaskRESTful Resource
# It works also with swag_from, schemas and spec_dict
# ---
# parameters:
# - in: path
# name: username
# type: string
# required: true
# responses:
# 200:
# description: A single user item
# schema:
# id: User
# properties:
# username:
# type: string
# description: The name of the user
# default: Steven Wilson
# """
# return {'username': username}, 200
#
# api.add_resource(Username, '/username/<username>')
#*************************************************
#*******PAHEKO************************************
#*************************************************
@ -112,6 +95,8 @@ class Paheko_categories(Resource):
Titre: Récupérer les catégories Paheko
Détail: avec le compteur associé
---
tags:
- Paheko
parameters: []
responses:
200:
@ -142,6 +127,8 @@ class Paheko_users(Resource):
Titre: Afficher les membres d'une catégorie Paheko
Détail:
---
tags:
- Paheko
parameters:
- in: path
name: categorie
@ -177,6 +164,8 @@ class Paheko_user(Resource):
Titre: Afficher un membre de Paheko
Détail:
---
tags:
- Paheko
parameters:
- in: path
name: numero
@ -208,12 +197,28 @@ api.add_resource(Paheko_user, '/paheko/user/<numero>')
#*************************************************
#*******MATTERMOST********************************
#*************************************************
# on utilise mmctl et pas l'apiv4 de MM
# pourquoi ? passe que mmcl déjà utilisé dans les scripts kaz.
#*************************************************
def Mattermost_authenticate():
# Authentification sur MM
global mattermost_url, mattermost_user, mattermost_pass
cmd = f"/mm/mmctl auth login {mattermost_url} --name local-server --username {mattermost_user} --password {mattermost_pass}"
subprocess.run(cmd, shell=True, stderr=subprocess.STDOUT, check=True)
#*************************************************
class Mattermost_message(Resource):
def get(self,equipe,canal,message):
def post(self,equipe,canal,message):
"""
Titre: Envoyer dans une Equipe/Canal de MM
Titre: Envoyer un message dans une Equipe/Canal de MM
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: equipe
@ -234,10 +239,8 @@ class Mattermost_message(Resource):
404:
description: oops
"""
global mattermost_url, mattermost_user, mattermost_pass
Mattermost_authenticate()
cmd="/mm/mmctl auth login "+mattermost_url+" --name local-server --username "+mattermost_user+" --password " +mattermost_pass
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
cmd="/mm/mmctl post create "+equipe+":"+canal+" --message "+ "\"" + message + "\""
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
return "ok"
@ -246,30 +249,201 @@ api.add_resource(Mattermost_message, '/mattermost/message/<equipe>/<canal>/<mess
#*************************************************
# @app.route('/test')
# def test():
# return os.environ.get('mattermost_url')
class Mattermost_user(Resource):
def get(self,user):
"""
Le user existe t-il sur MM ?
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: user
type: string
required: true
description: possible d'entrer un username, un email
responses:
True:
description: Existe
False:
description: N'existe pas
"""
Mattermost_authenticate()
try:
cmd = f"/mm/mmctl user search {user} --json"
user_list_output = subprocess.check_output(cmd, shell=True)
return True # Le nom d'utilisateur existe
except subprocess.CalledProcessError:
return False # Le nom d'utilisateur n'existe pas
api.add_resource(Mattermost_user, '/mattermost/user/<string:user>')
#*************************************************
# @app.route('/print_env')
# def print_environment():
# # Crée une chaîne de caractères pour stocker les variables d'environnement
# env_string = ""
#
# # Itère sur les variables d'environnement et les ajoute à la chaîne de caractères
# for key, value in os.environ.items():
# env_string += f"{key}: {value}\n" + "<br>"
#
# # Retourne la chaîne de caractères contenant les variables d'environnement
# return env_string
class Mattermost_user_create(Resource):
def post(self,user,email,password):
"""
Créer un utilisateur sur MM
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: user
type: string
required: true
- in: path
name: email
type: string
required: true
- in: path
name: password
type: string
required: true
responses:
200:
description: Utilisateur créé
400:
description: oops, Utilisateur non créé
"""
Mattermost_authenticate()
# Création de l'utilisateur
try:
cmd = f"/mm/mmctl user create --email {email} --username {user} --password {password}"
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
return Response( output.decode("utf-8"), status=200 )
except subprocess.CalledProcessError as e:
return Response( e.output.decode("utf-8"), status=400 )
api.add_resource(Mattermost_user_create, '/mattermost/user/create/<string:user>/<string:email>/<string:password>')
#*************************************************
class Mattermost_user_team(Resource):
def post(self,email,equipe):
"""
Affecte un utilisateur à une équipe MM
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: email
type: string
required: true
- in: path
name: equipe
type: string
required: true
responses:
200:
description: l'utilisateur a bien été affecté à l'équipe
400:
description: oops, Utilisateur non affecté
"""
Mattermost_authenticate()
try:
cmd = f"/mm/mmctl team users add {equipe} {email}"
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
return Response( output.decode("utf-8"), status=200 )
except subprocess.CalledProcessError as e:
return Response( e.output.decode("utf-8"), status=400 )
api.add_resource(Mattermost_user_team, '/mattermost/user/team/<string:email>/<string:equipe>')
#*************************************************
class Mattermost_user_channel(Resource):
def post(self,email,equipe,canal):
"""
Affecte un utilisateur à un canal MM
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: email
type: string
required: true
- in: path
name: equipe
type: string
required: true
- in: path
name: canal
type: string
required: true
responses:
200:
description: l'utilisateur a bien été affecté au canal
400:
description: oops, Utilisateur non affecté
"""
Mattermost_authenticate()
try:
cmd = f'/mm/mmctl channel users add {equipe}:{canal} {email}'
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
return Response( output.decode("utf-8"), status=200 )
except subprocess.CalledProcessError as e:
return Response( e.output.decode("utf-8"), status=400 )
api.add_resource(Mattermost_user_channel, '/mattermost/user/channel/<string:email>/<string:equipe>/<string:canal>')
#*************************************************
# pour utiliser mmctl
# ./mmctl post create kaz:Sysadmin --message "@all message mmctl envoye depuis l apikaz de kazkouil.fr"
class Mattermost_team_create(Resource):
def post(self,equipe,email):
"""
Créer une équipe sur MM et affecter un admin si email est renseigné
Détail:
---
tags:
- Mattermost
parameters:
- in: path
name: equipe
type: string
required: true
- in: path
name: email
type: string
required: true
responses:
200:
description: Equipe créée
400:
description: oops, Equipe non créée
"""
Mattermost_authenticate()
try:
#DANGER: l'option --email ne rend pas le user admin d l'équipe comme c'est indiqué dans la doc :(
cmd = f"/mm/mmctl team create --name {equipe} --display-name {equipe} --email {email} --private"
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
return Response( output.decode("utf-8"), status=200 )
except subprocess.CalledProcessError as e:
return Response( e.output.decode("utf-8"), status=400 )
api.add_resource(Mattermost_team_create, '/mattermost/team/create/<string:equipe>/<string:email>')
#*************************************************
#*************************************************
#*************************************************
#*************************************************
if __name__ == '__main__':
app.run(host='0.0.0.0', port=os.getenv('PORT'))

Loading…
Cancel
Save