|
|
@ -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')) |
|
|
|