Question
· Oct 24, 2023

Python : est-il possible de compiler/recharger la Production sans faire appel à une connexion à la base de données IRIS ?

import os

# Récupérer les variables d'environnement
db_host = os.getenv('DB_HOST')
db_port = os.getenv('DB_PORT')
db_namespace = os.getenv('DB_NAMESPACE')
db_username = os.getenv('DB_USERNAME')
db_password = os.getenv('DB_PASSWORD')

# Créer une connexion à la base de données
conn = irisnative.createConnection(db_host, db_port, db_namespace, db_username, db_password)

# Créer une instance IRIS à partir de cette connexion
iris_native = irisnative.createIris(conn)

status = iris_native.classMethodValue('%SYSTEM.OBJ', 'Load', 'Production.cls', 'ck')

if status == 1:
    print("Le fichier Production.cls a été compilé avec succès.")
else:
    print("Une erreur s'est produite lors de la compilation du fichier Production.cls.")



Ce code Python fonctionne parfaitement mais je cherche une autre alternative sans créer de connexion à IRIS afin d'éviter toute faille de sécurité
Version du produit: IRIS 2023.2
$ZV: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.2 (Build 227U)
Discussion (4)1
Connectez-vous ou inscrivez-vous pour continuer

Qu'entendez-vous par "éviter toute violation de sécurité"? Quelle violation de sécurité essayez-vous d'éviter? Créer une connexion à IRIS n'est pas une violation de sécurité.

Vous pouvez spécifier l'utilisateur et les rôles dans la chaîne de connexion, vous pouvez donc limiter l'accès à la base de données à ce qui est nécessaire pour la tâche en cours.

Bonjour,

Pour se connecter à IRIS, il est recommandé d'utiliser un login/password.
A ma connaissance, il n'y a pas de moyen de se connecter avec des certificats.

Pour se connecter avec un login/password dans le cas d'une connexion à IRIS en TCP, il est recommandé d'utiliser des variables d'environnement.

Example en python avec le module sqlachemy:

import os
from sqlalchemy import create_engine,text

engine = create_engine(
    "iris://",
    connect_args={
        "hostname": os.environ.get("IRIS_HOST", "localhost"),
        "port": os.environ.get("IRIS_PORT", 1972),
        "username": os.environ.get("IRIS_USERNAME", "SuperUser"),
        "password": os.environ.get("IRIS_PASSWORD", "SYS"),
        "namespace": os.environ.get("IRIS_DATABASE", "USER"),
    },
)

with engine.connect() as conn:
    result = conn.execute(text("SELECT 1"))
    print(result.fetchall())

Le cas d'embedded Python est un peu différent car la connexion ne se fait pas par TCP, la connexion se fait par "shared memory".

La connexion dans ce cas est définie par le service "%Service_CallIn" (pour information, les connexions TCP sont définies par le service "%Service_Bindings").

Regardons maintenant les possibilités de connexion offert par le service "%Service_CallIn".

  • Unauthenticated
    • L'utilisateur par défault sera alors "UnknownUser"
  • Operating System
    • Connexion avec l'utilisateur du système d'exploitation
    • Ce doit etre le même user que celui qui a lancé le processus IRIS
  • Password
    • Connexion classique d'embedded Python avec les variables d'environnement suivantes:
    • IRISUSERNAME
    • IRISPASSWORD
    • IRISNAMESPACE
  • Kerberos
    • Authentification Kerberos
  • Kerberos Credentials Cache
    • Authentification Kerberos avec un cache de credentials

Dans votre cas, peut etre que Operating System est la meilleure solution. Kerberos est aussi une bonne solution mais il faut que votre environnement soit configuré pour.

Pour plus d'information, je vous invite à suivre la discution suivante :

https://fr.community.intersystems.com/post/acc%C3%A8s-au-terminal-iris-s...