accéder à la publication Guillaume Rongier · Déc 4, 2023 oui, example : C:\InterSystems\IRIS\bin>set IRISNAMESPACE = USER
accéder à la publication Guillaume Rongier · Déc 4, 2023 Salut, Peux-tu essayer cette commande : python -m grongier.pex._cli Je vais regarder en parallèle, le problème avec windows (pas facile, j'ai pas de VM windows à disposition :()
accéder à la publication Guillaume Rongier · Nov 28, 2023 Si tu peux changer de namespace quand tu le souhaites pour ca deux facons : avant d'executer iop tu changes la variable d'environnement IRISNAMESPACE. export IRISNAMESPACE=TEST iop -m path/to/my_settings.py dans ton fichier my_settings.py tu peux changer le namespace avec la fonction suivante : import iris # switch namespace to the TEST namespace iris.system.Process.SetNamespace("TEST") # print the current namespace print(iris.system.Process.NameSpace()) from TEST.bo import MyBo CLASSES = { "MyIRIS.MyBo": MyBo } PRODUCTIONS = [ { "MyIRIS.Production": { "@TestingEnable": "true", "@Name": "MyIRIS.Production", "Item": [ { "@Name": "Instance.Of.MyBo", "@ClassName": "MyIRIS.MyBo", } ] } } ]
accéder à la publication Guillaume Rongier · Nov 28, 2023 Pour embedded python, tu dois set la variable d’environnement IRISNAMESPACE export IRISNAMESPACE=TEST https://docs.intersystems.com/iris20233/csp/docbook/DocBook.UI.Page.cls?...
accéder à la publication Guillaume Rongier · Nov 28, 2023 es tu sur le bon serveur, bon namespace, car si paas d'erreur la classe a bien été migrée, maintenant c'est trouver où ?
accéder à la publication Guillaume Rongier · Nov 28, 2023 humm, ne pas confondre la PWG (Private WebGateway) et la WebGateway. La private webgateway est un mini apache qui est embarqué dans iris. Il n'a pas a etre configuré. De plus, dans la configue pour acceder à ce portail il ne faut pas oublier d'ajouter ton ip en white list System_Manager=*.*.*.* Pourquoi souhaites-tu le configurer ?
accéder à la publication Guillaume Rongier · Nov 28, 2023 Salut, il manque un d à @TestingEnable @TestingEnable != @TestingEnabled
accéder à la publication Guillaume Rongier · Nov 21, 2023 Super : Pour information, les métrics interop ne sont pas activés par default. Pour les activer : do ##class(Ens.Util.Statistics).EnableSAMForNamespace() Plus d'information ici sur la doc
accéder à la publication Guillaume Rongier · Nov 20, 2023 Ok, ca fonctionne de mon cote, je me suis juste trompé de oid : snmpwalk -m ALL -v 2c -c public localhost iso.3.6.1.4.1.16563.4.1.1.1.5.4.73.82.73.83Résultat : iso.3.6.1.4.1.16563.4.1.1.1.5.4.73.82.73.83 = STRING: "IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.1 (Build 229U) Fri Apr 14 2023 17:37:52 EDT"Maintenant que le snmpd fonctionne, je ne peux que vous recommander de vous pencher aussi sur les solutions comme OpenTelemetry, qui est un standard pour la collecte de métriques, traces et logs. Plus d'infos ici : https://opentelemetry.io/ Et notre documentation ici : https://docs.intersystems.com/iris20233/csp/docbook/Doc.View.cls?KEY=GCM...
accéder à la publication Guillaume Rongier · Nov 16, 2023 Bonjour, Effectivement, le service EnsLib.SQL.Service.GenericService est un service de type "Business Service" qui va générer un message pour chaque ligne de résultat de la requête SQL. Ce service est donc adapté pour des requêtes qui retournent un nombre limité de lignes. Je pense que tu vas devoir passer par du code custom. Voici un exemple en Python qui est relativement simple à mettre en oeuvre. Le bs : from grongier.pex import BusinessService import pandas as pd from sqlalchemy import create_engine from .msg import SQLMessage class SQLService(BusinessService): def __init__(self, **kwargs): self.sql = None self.conn = None self.target = None def on_init(self): if not hasattr(self, 'sql'): raise Exception('Missing sql attribute') if not hasattr(self, 'conn'): raise Exception('Missing conn attribute') if not hasattr(self, 'target'): raise Exception('Missing target attribute') self.engine = create_engine(self.conn) # raise an error if cannot connect to the database self.engine.connect() def get_adapter_type(): """ Name of the registred Adapter """ return "Ens.InboundAdapter" def on_process_input(self, message_input): # create a dataframe from the sql query df = pd.read_sql(self.sql, self.engine) # create a message message = SQLMessage(dataframe=df) # send the message to the target self.send_request_sync(self.target, message) return Ici on utilise la force de pandas pour créer un dataframe à partir du résultat de la requête SQL. On crée ensuite un message qui contient le dataframe et on l'envoie au target. La configuration est faite à partir de propriétés suivantes : sql : la requête SQL conn : la connexion à la base de données target : le target Le message : from grongier.pex import Message from dataclasses import dataclass from pandas.core.frame import DataFrame @dataclass class SQLMessage(Message): dataframe: DataFrame = None Le message qui contient le dataframe. La target qui permet de créer le fichier csv : from grongier.pex import BusinessOperation from .msg import SQLMessage import pandas as pd class CSVOperation(BusinessOperation): def __init__(self, **kwargs): self.filename = None def on_init(self): if not hasattr(self, 'filename'): raise Exception('Missing filename attribute') def on_sql_message(self, message_input: SQLMessage): # get the dataframe from the message df = message_input.dataframe # create a csv file df.to_csv(self.filename, index=False) return La configuration est faite à partir du fichier settings.py : from sqltocsv import bo,bs import os CLASSES = { 'Python.Bs.SQLService': bs.SQLService, 'Python.Bo.CSVOperation': bo.CSVOperation } db_user = os.environ.get('POSTGRES_USER', 'DemoData') db_password = os.environ.get('POSTGRES_PASSWORD', 'DemoData') db_host = os.environ.get('POSTGRES_HOST', 'db') db_port = os.environ.get('POSTGRES_PORT', '5432') db_name = os.environ.get('POSTGRES_DB', 'DemoData') PRODUCTIONS = [{ "Python.Production": { "@Name": "Python.Production", "@LogGeneralTraceEvents": "false", "Description": "", "ActorPoolSize": "2", "Item": [ { "@Name": "Python.Bs.SQLService", "@Category": "", "@ClassName": "Python.Bs.SQLService", "@PoolSize": "1", "@Enabled": "true", "@Foreground": "false", "@Comment": "", "@LogTraceEvents": "false", "@Schedule": "", "Setting": { "@Target": "Host", "@Name": "%settings", "#text": "sql=select * from formation\nconn=postgresql://"+db_user+":"+db_password+"@"+db_host+":"+db_port+"/"+db_name+"\ntarget=Python.Bo.CSVOperation" } }, { "@Name": "Python.Bo.CSVOperation", "@Category": "", "@ClassName": "Python.Bo.CSVOperation", "@PoolSize": "1", "@Enabled": "true", "@Foreground": "false", "@Comment": "", "@LogTraceEvents": "false", "@Schedule": "", "Setting": { "@Target": "Host", "@Name": "%settings", "#text": "filename=/tmp/export.csv" } } ] } }] On utilise les variables d'environnement pour la connexion à la base de données. Tu as l'exemple complet ici : https://github.com/grongierisc/formation-template-python/tree/demo_sqltodb Je laisse un autre membre de la communauté répondre avec une solution en ObjectScript.
accéder à la publication Guillaume Rongier · Nov 16, 2023 Bonjour Cyril, Je n'ai pas encore été au bout de l'exercice, ce pendant, je vais vous partager mon avancé sur ce sujet : Avez-vous vérifié que le deamon snmpd etait bien installé et configuré sur votre instance docker ? Par defaut, il n'est pas installé, il faut donc l'installer et le configurer. Exemple d'un dockerfile pour installer snmpd : ARG IMAGE=intersystemsdc/iris-community:latest FROM $IMAGE WORKDIR /irisdev/app USER root RUN apt-get update && apt-get install -y \ nano \ snmpd \ snmp \ sudo && \ /bin/echo -e ${ISC_PACKAGE_MGRUSER}\\tALL=\(ALL\)\\tNOPASSWD: ALL >> /etc/sudoers && \ sudo -u ${ISC_PACKAGE_MGRUSER} sudo echo enabled passwordless sudo-ing for ${ISC_PACKAGE_MGRUSER} COPY snmpd.conf /etc/snmp/snmpd.conf USER ${ISC_PACKAGE_MGRUSER} Exemple d'un snmpd.conf : ############################################################################### # # snmpd.conf: # An example configuration file for configuring the NET-SNMP agent with Cache. # # This has been used successfully on Red Hat Enterprise Linux and running # the snmpd daemon in the foreground with the following command: # # /usr/sbin/snmpd -f -L -x TCP:localhost:705 -c./snmpd.conf # # You may want/need to change some of the information, especially the # IP address of the trap receiver of you expect to get traps. I've also seen # one case (on AIX) where we had to use the "-C" option on the snmpd command # line, to make sure we were getting the correct snmpd.conf file. # ############################################################################### ########################################################################### # SECTION: System Information Setup # # This section defines some of the information reported in # the "system" mib group in the mibII tree. # syslocation: The [typically physical] location of the system. # Note that setting this value here means that when trying to # perform an snmp SET operation to the sysLocation.0 variable will make # the agent return the "notWritable" error code. IE, including # this token in the snmpd.conf file will disable write access to # the variable. # arguments: location_string syslocation "System Location" # syscontact: The contact information for the administrator # Note that setting this value here means that when trying to # perform an snmp SET operation to the sysContact.0 variable will make # the agent return the "notWritable" error code. IE, including # this token in the snmpd.conf file will disable write access to # the variable. # arguments: contact_string syscontact "Your Name" # sysservices: The proper value for the sysServices object. # arguments: sysservices_number sysservices 76 ########################################################################### # SECTION: Agent Operating Mode # # This section defines how the agent will operate when it # is running. # master: Should the agent operate as a master agent or not. # Currently, the only supported master agent type for this token # is "agentx". # # arguments: (on|yes|agentx|all|off|no) master agentx agentXSocket tcp:localhost:705 ########################################################################### # SECTION: Trap Destinations # # Here we define who the agent will send traps to. # trapsink: A SNMPv1 trap receiver # arguments: host [community] [portnum] trapsink localhost public ############################################################################### # Access Control ############################################################################### # As shipped, the snmpd demon will only respond to queries on the # system mib group until this file is replaced or modified for # security purposes. Examples are shown below about how to increase the # level of access. # # By far, the most common question I get about the agent is "why won't # it work?", when really it should be "how do I configure the agent to # allow me to access it?" # # By default, the agent responds to the "public" community for read # only access, if run out of the box without any configuration file in # place. The following examples show you other ways of configuring # the agent so that you can change the community names, and give # yourself write access to the mib tree as well. # # For more information, read the FAQ as well as the snmpd.conf(5) # manual page. # #### # First, map the community name "public" into a "security name" # sec.name source community com2sec notConfigUser default public #### # Second, map the security name into a group name: # groupName securityModel securityName group notConfigGroup v1 notConfigUser group notConfigGroup v2c notConfigUser #### # Third, create a view for us to let the group have rights to: # Make at least snmpwalk -v 1 localhost -c public system fast again. # name incl/excl subtree mask(optional) # access to 'internet' subtree view systemview included .1.3.6.1 # access to Cache MIBs Caché and Ensemble view systemview included .1.3.6.1.4.1.16563.1 view systemview included .1.3.6.1.4.1.16563.2 #### # Finally, grant the group read-only access to the systemview view. # group context sec.model sec.level prefix read write notif access notConfigGroup "" any noauth exact systemview none none Ensuite, il faut lancer le deamon snmpd : sudo service snmpd start Sur iris, il faut ensuite configurer le snmp agent : %SYS> w $$start^SNMP() Avec toutes ces étapes, vous devriez pouvoir récupérer des informations via snmp. snmpwalk -m ALL -v 2c -c public localhost .1.3.6.1.4.1.16563.1.1.1.1 C'est là ou je bloque pour le moment, je n'arrive pas à récupérer les informations d'IRIS. Cependant, le service snmpd est bien lancé et fonctionnel ainsi que le snmp agent. Pour plus d'informations, je vous invite à lire les articles suivants : https://community.intersystems.com/post/intersystems-data-platforms-and-...
accéder à la publication Guillaume Rongier · Nov 14, 2023 Super article, en plus avec une exclusivité en langue française :) Ça me rappel des souvenir d'un projet ou nous avions construit une machine à état : https://developer.mozilla.org/fr/docs/Glossary/State_machine A l'époque, les messages queues n'existaient pas et ton tuto non plus d’ailleurs ;) ça nous aurait bien aidé. Pense le compléter avec un exemple appliqué aux websocket, j'ai l'impression que ça s'y prête bien.
accéder à la publication Guillaume Rongier · Nov 7, 2023 Bonjour @Moussa SAMB Je viens de creer un projet example qui permet de se connecter à un server mail type imap en oauth2 : https://github.com/grongierisc/iris-imap-python-adaptor Si ca t'intéresse, je peux te le présenter en détail et l'améliorer pour qu'il corresponde à tes besoins.
accéder à la publication Guillaume Rongier · Oct 31, 2023 Bonjour, Les versions LTS d'iris sont les versions en XXXX.1. Nous appelons ces versions des Extended Maintenance (EM) Les versions qui ne finissent pas par un 1 sont des Continus Delivery Plus d'information sur ce post : https://community.intersystems.com/post/updates-our-release-cadence Ici pour suivre toutes les versions publiées ainsi que les releases notes: https://docs.intersystems.com/iris.html
accéder à la publication Guillaume Rongier · Oct 31, 2023 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...
accéder à la publication Guillaume Rongier · Oct 30, 2023 Pour information : Ce depot git fait exatement ce que vous chercher à faire. Il implemente `djangorestframework` pour des tables pré-existante. https://github.com/grongierisc/django-iris-template
accéder à la publication Guillaume Rongier · Oct 26, 2023 yes, sur windows c'est "%Service_console" https://docs.intersystems.com/iris20232/csp/docbook/DocBook.UI.Page.cls?...
accéder à la publication Guillaume Rongier · Oct 26, 2023 Bonjour, Pour activer la connexion sans mot de passe à partir d'un compte OS de la machine, il faut configurer le service "%Service_Terminal" comme ceci : Ensuite "%Service_Terminal" : Pour finir s'assurer que "Operating system" est activé
accéder à la publication Guillaume Rongier · Oct 25, 2023 Vous pouvez utiliser Django pour créer des API sur votre base de données. Les options avec inspectdb ou la création manuelle de modèles sont possibles et ne dupliqueront pas votre base de données. Elles sont là pour creer un mapping entre votre base de données et des objets Python (les modèles Django). Vous etes donc dans un contexte "MVC" (en fait MTV pour Model Template View si vous utilisez Django en tant que framework web). Si vous utilisez uniquement Django pour créer des API, vous n'avez pas besoin de templates et de vues, mais vous pouvez utiliser les modèles Django pour créer des objets Python qui représentent vos tables de base de données et donc utiliser les capacités d'ORM (Object Relational Mapping) de Django pour manipuler vos données.
accéder à la publication Guillaume Rongier · Oct 25, 2023 wow, c'est cool ca, je connaissais : Do obj.%Set(sqlFieldName, property, "stream") mais pas : Do obj.%Set(sqlFieldName, property, "stream>base64") merci pour l'astuce :)