{"id":27007213,"url":"https://github.com/nexdatas/nxsconfigserver","last_synced_at":"2026-04-30T01:33:06.255Z","repository":{"id":29260629,"uuid":"32793242","full_name":"nexdatas/nxsconfigserver","owner":"nexdatas","description":"NeXus Configuration Tango server -- front-end to NeXus Component database","archived":false,"fork":false,"pushed_at":"2024-10-23T16:35:18.000Z","size":2894,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":6,"default_branch":"develop","last_synced_at":"2024-10-23T22:42:16.325Z","etag":null,"topics":["mysql","nexusformat","python","tango"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nexdatas.png","metadata":{"files":{"readme":"README.rst","changelog":"ChangeLog","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-03-24T11:00:27.000Z","updated_at":"2024-10-23T16:35:20.000Z","dependencies_parsed_at":"2024-10-23T18:45:04.526Z","dependency_job_id":"cb2fcbad-dda1-4360-b535-1f33fa1998bd","html_url":"https://github.com/nexdatas/nxsconfigserver","commit_stats":null,"previous_names":[],"tags_count":71,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexdatas%2Fnxsconfigserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexdatas%2Fnxsconfigserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexdatas%2Fnxsconfigserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexdatas%2Fnxsconfigserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nexdatas","download_url":"https://codeload.github.com/nexdatas/nxsconfigserver/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247142060,"owners_count":20890653,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mysql","nexusformat","python","tango"],"created_at":"2025-04-04T08:19:01.168Z","updated_at":"2026-04-30T01:33:06.248Z","avatar_url":"https://github.com/nexdatas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"======================================================\nWelcome to NeXuS Configuration Server's documentation!\n======================================================\n\n|github workflow|\n|docs|\n|Pypi Version|\n|Python Versions|\n\n.. |github workflow| image:: https://github.com/nexdatas/nxsconfigserver/actions/workflows/tests.yml/badge.svg\n   :target: https://github.com/nexdatas/nxsconfigserver/actions\n   :alt:\n\n.. |docs| image:: https://img.shields.io/badge/Documentation-webpages-ADD8E6.svg\n   :target: https://nexdatas.github.io/nxsconfigserver/index.html\n   :alt:\n\n.. |Pypi Version| image:: https://img.shields.io/pypi/v/nxsconfigserver.svg\n                  :target: https://pypi.python.org/pypi/nxsconfigserver\n                  :alt:\n\n.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/nxsconfigserver.svg\n                     :target: https://pypi.python.org/pypi/nxsconfigserver/\n                     :alt:\n\n\n\nAuthors: Jan Kotanski, Eugen Wintersberger, Halil Pasic\n\nNeXuS Configuration Server is a Tango Server with its implementation based\non a MySQL database. It allows to store XML configuration datasources\nand components. It also gives possibility to select mandatory components\nand perform the process of component merging.\n\nTango Server API: https://nexdatas.github.io/nxsconfigserver/doc_html\n\n| Source code: https://github.com/nexdatas/nxsconfigserver/\n| Web page: https://nexdatas.github.io/nxsconfigserver/\n| NexDaTaS Web page: https://nexdatas.github.io\n\n------------\nInstallation\n------------\n\nInstall the dependencies:\n\n|    MySQLdb, PyTango, sphinx\n\nFrom sources\n^^^^^^^^^^^^\n\nDownload the latest version of NeXuS Configuration Server from\n\n|    https://github.com/nexdatas/nxsconfigserver/\n|    https://github.com/nexdatas/nxsconfigserver-db/\n\nExtract the sources and run\n\n.. code-block:: console\n\n\t  $ python setup.py install\n\nTo set database execute\n\n.. code-block:: console\n\n\t  $ mysql \u003c conf/mysql_create.sql\n\nwith proper privileges.\n\nDebian packages\n^^^^^^^^^^^^^^^\n\nDebian Trixie, Bookworm, Bullseye and as well as Ubuntu Questing, Noble, Jammy  packages can be found in the HDRI repository.\n\nTo install the debian packages, add the PGP repository key\n\n.. code-block:: console\n\n\t  $ sudo su\n\t  $ curl -s http://repos.pni-hdri.de/debian_repo.pub.gpg | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/debian-hdri-repo.gpg --import\n\t  $ chmod 644 /etc/apt/trusted.gpg.d/debian-hdri-repo.gpg\n\nand then download the corresponding source list, e.g. for trixie\n\n.. code-block:: console\n\n\t  $ cd /etc/apt/sources.list.d\n\t  $ wget http://repos.pni-hdri.de/trixie-pni-hdri.sources\n\nFinally, for python2 packages\n\n.. code-block:: console\n\n\t  $ apt-get update\n\t  $ apt-get install python-nxsconfigserver nxsconfigserver-db\n\nand the NXSConfigServer tango server (from 2.10.0)\n\n\t  $ apt-get install nxsconfigserver\n\nor for python3\n\n.. code-block:: console\n\n\t  $ apt-get update\n\t  $ apt-get install python3-nxsconfigserver nxsconfigserver-db\n\nand the NXSConfigServer tango server (from 2.10.0)\n\n\t  $ apt-get install nxsconfigserver3\n\n\nFrom pip\n\"\"\"\"\"\"\"\"\n\nTo install it from pip you need pymysqldb e.g.\n\n.. code-block:: console\n\n   $ python3 -m venv myvenv\n   $ . myvenv/bin/activate\n\n   $ pip install pymysqldb\n\n   $ pip install nxsconfigserver\n\nMoreover it is also good to install\n\n.. code-block:: console\n\n   $ pip install pytango\n   $ pip install nxstools\n\nSetting NeXus Configuration Server\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTo set up  NeXus Configuration Server with the default configuration run\n\n.. code-block:: console\n\n          $ nxsetup -x NXSConfigServer\n\nThe *nxsetup* command comes from the **python-nxstools** package.\n\n===========\nDescription\n===========\n\nConfiguration Server is dedicated to store NXDL-like configuration needed for\nTango Data Writer runs. The server uses as a storage system a MYSQL database.\nTo create required DB tables one can use ndts.sql script from the repository.\n\nIn Configuration Server the configuration is memorized in separate elements:\ndatasources or components.\n\n**DataSources** describe access to input data, i.e to specific hardware\nTANGO devices or other databases as well to client data.\n\n**Components** specify Nexus tree with positions of datasets for particular\npieces of hardware and writing strategy for corresponding to them data.\n\n+ They can include datasources directly as well as links to datasources\n  defined in the server. To this end template syntax of\n  $datasources.\u003cds_name\u003e type is used.\n+ Moreover, they can holds links to other components which describe their\n  dependences. In this case $components.\u003ccomp_name\u003e syntax is used.\n+ Finally, the components can contains variables. The variables are defined\n  in XML code by $var.\u003cvar_name\u003e syntax and can be provided to\n  the Configuration Server by passing a JSON string.\n  The default value for variables is an empty string.\n\nAll elements of configuration can be created by GUI tool - ComponentDesigner.\nThe tool can connect to Configuration Server and fetch or store\nthe separate elements of the XML configuration.\n\nDuring creation of the final configuration Configuration Server merges\nall required and dependent components, connected to them datasources and\nprovided values of the variables. As a result it returns a single XML string.\nThis XML string can be pass directly into the dedicated Tango Data Writer\nattribute.\n\n\n\n===========\nClient code\n===========\n\n.. code-block:: python\n\n    # In this section we present an example how to communicate with\n    # Configuration Server making use of PyTango.\n\n    import tango\n\n    cnfServer = tango.DeviceProxy(\"p00/xmlconfigserver/exp.01\")\n\n    cnfServer.JSONSettings = \\\n\t'{\"db\":\"ndts_p02\",\"read_default_file\":\"/etc/my.cnf\",\"use_unicode\":true}'\n\n    # opens DB connection\n    cnfServer.Open()\n\n    # After creating the server proxy we can set configuration for connection to\n    #  the MYSQL DB.\n    # The JSONSettings attribute is memorized so you have to write it only when you\n    # change configuration of DB connection. Next, we open connection to\n    # DB specified by our JSONSettings.\n\n\n\n    # stores default component\n    cpxml = open(\"default.xml\", 'r').read()\n    cnfServer.XMLString = cpxml\n    cnfServer.StoreComponent('default')\n\n    # stores slit1 component in DB\n    cpxml = open(\"slit1.xml\", 'r').read()\n    cnfServer.XMLString = cpxml\n    cnfServer.StoreComponent('slit1')\n\n    # stores slit2 component in DB\n    cpxml = open(\"slit2.xml\", 'r').read()\n    cnfServer.XMLString = cpxml\n    cnfServer.StoreComponent('slit2')\n\n    # stores slit3 component in DB\n    cpxml = open(\"slit3.xml\", 'r').read()\n    cnfServer.XMLString = cpxml\n    cnfServer.StoreComponent('slit3')\n\n    # stores pilatus300k component in DB\n    cpxml = open(\"pilatus.xml\", 'r').read()\n    cnfServer.XMLString = cpxml\n    cnfServer.StoreComponent('pilatus300k')\n\n\n    # stores motor01 datasource in DB\n    dsxml = open(\"motor.ds.xml\", 'r').read()\n    cnfServer.XMLString = dsxml\n    cnfServer.StoreDataSource('motor01')\n\n    # stores motor02 datasource in DB\n    dsxml = open(\"motor.ds.xml\", 'r').read()\n    cnfServer.XMLString = dsxml\n    cnfServer.StoreDataSource('motor02')\n\n\n\n    # removes slit3 component from DB\n    cnfServer.DeleteComponent('slit3')\n\n    # removes motor02 datasource from DB\n    cnfServer.DeleteDataSource('motor02')\n\n    # If someone cannot use ComponentDesigner it is also an option to store\n    # or delete components and datasources using directly tango interface\n    # as it is shown above.\n\n\n\n    # provides names of available components\n    cmpNameList = cnfServer.AvailableComponents()\n    # provides names of available datasources\n    dsNameList = cnfServer.AvailableDataSources()\n\n    # To get information about names of available components and datasources\n    # in Configuration Server we use the above commands.\n\n\n\n    # provides a list of required components\n    cmpList = cnfServer.Components(cmpNameList)\n    # provides a list of required Datasources\n    dsList = cnfServer.DataSources(dsNameList)\n\n    # Having names of stored elements we can get their XML code.\n\n    # provides a list of Datasources from a given Component\n    dsList = cnf.Server.ComponentDataSources('pilatus300k')\n    dsList = cnf.Server.ComponentsDataSources(['pilatus300k', 'slit1'])\n\n    # as well as query Configuration Server which datasource\n    # are related to the particular component.\n\n    # provides a dependent components\n    cpList = cnf.Server.DependentComponents(['pilatus300k', 'slit3'])\n\n\n    # Moreover, one can also query Configuration Server for a list of\n    # dependent components\n\n    # provides a list of Variables from a given components\n    varList = cnf.Server.ComponentVariables('pilatus300k')\n    varList = cnf.Server.ComponentsVariables(['pilatus300k', 'slit3'])\n\n    #or ask for a list of variables which are related to the particular components.\n\n    # sets values of variables\n    cnf.Server.Variables = '{\"entry_id\":\"123\",\"beamtime_id\":\"123453535453\"}'\n\n    #The variable values can be passed to the Configuration Server\n    # via a JSON string.\n\n\n\n    # sets given component as mandatory for the final configuration\n    cnfServer.SetMandatoryComponents(['default','slit1'])\n    # un-sets given component as mandatory for the final configuration\n    cnfServer.UnsetMandatoryComponents(['slit1'])\n\n    # provides names of mandatory components\n    man =  cnfServer.MandatoryComponents()\n\n    # Some of the component can be set as mandatory in\n    # the final configuration. To define them Configuration Server provides\n    # above commands.\n\n\n\n    # provides the current configuration version\n    version =  cnfServer.Version\n\n    # Each configuration has a revision number. It can be found\n    # together with Configuration Server version in Version attribute.\n\n    # creates the final configuration from slit2 and pilatus300k\n    # as well as all mandatory components\n    cnfServer.CreateConfiguration('slit2', 'pilatus300k')\n    # XML string ready to use by Tango Data Server\n    finalXML = cnfServer.XMLString\n\n    # In order to create our final configuration we execute CreateConfiguration\n    # command with a list of names of required components. The command merges\n    # these components with mandatory ones and provides the resulting NXDL-like\n    # configuration in the XMLString attribute.\n\n\n\n\n    # merges given components\n    mergedComp = cnfServer.Merge(['slit2', 'pilatus300k'])\n\n    # Similarly, the Merge command provides configuration by unresolved links\n    # to datasoures and with non-assigned variable values.\n\n\n    # closes connection to DB\n    cnfServer.close()\n\n    # Command close terminates our connection to the DB server.\n\n=======================\nConfiguration Variables\n=======================\n\nValues of configuration variables can be also define inside the component xmls.\nLet's consider two following components:\n\n*mydetector* with a general detector transformation group\n\n.. code-block:: xml\n\n   \u003cdefinition\u003e\n     \u003cgroup type='NXentry' name='entry'\u003e\n       \u003cgroup type='NXinstrument' name='instrument'\u003e\n          \u003cgroup type='NXdetector' name='$var.detector#\\\"mydetector\\\"'\u003e\n             \u003cgroup type='NXtransformations' name='transformations'/\u003e\n\t  \u003c/group\u003e\n       \u003c/group\u003e\n     \u003c/group\u003e\n   \u003c/definition\u003e\n\nand *pilatus* created for the particular detector\n\n.. code-block:: xml\n\n   \u003cdefinition\u003e\n     \u003cgroup type='NXentry' name='entry'\u003e\n       \u003cgroup type='NXinstrument' name='instrument'\u003e\n          \u003cgroup type='NXdetector' name='pilatus'\u003e\n             \u003cfield type='NX_FLOAT64' name='data'/\u003e\n\t  \u003c/group\u003e\n       \u003c/group\u003e\n     \u003c/group\u003e\n     \u003cdoc\u003e$var(detector=pilatus)\u003c/doc\u003e\n   \u003c/definition\u003e\n\n\nCreating configuration without variables\n\n.. code-block:: python\n\n   cnfServer.Variables = '{}'\n   cnfServer.CreateConfiguration([\"mydetector\"])\n\nresults in\n\n.. code-block:: xml\n\n   \u003cdefinition\u003e\n     \u003cgroup type='NXentry' name='entry'\u003e\n       \u003cgroup type='NXinstrument' name='instrument'\u003e\n          \u003cgroup type='NXdetector' name='mydetector'\u003e\n             \u003cgroup type='NXtransformations' name='transformations'/\u003e\n\t  \u003c/group\u003e\n       \u003c/group\u003e\n     \u003c/group\u003e\n   \u003c/definition\u003e\n\nWhen configuration variables are defined\n\n.. code-block:: python\n\n   cnfServer.Variables = '{\"detector\": \"det1\"}'\n   cnfServer.CreateConfiguration([\"mydetector\"])\n\none can get\n\n.. code-block:: xml\n\n   \u003cdefinition\u003e\n     \u003cgroup type='NXentry' name='entry'\u003e\n       \u003cgroup type='NXinstrument' name='instrument'\u003e\n          \u003cgroup type='NXdetector' name='det1'\u003e\n             \u003cgroup type='NXtransformations' name='transformations'/\u003e\n\t  \u003c/group\u003e\n       \u003c/group\u003e\n     \u003c/group\u003e\n   \u003c/definition\u003e\n\nFinally, creating configuration xml from our two components without variables\n\n.. code-block:: python\n\n   cnfServer.Variables = '{}'\n   cnfServer.CreateConfiguration([\"mydetector\", \"pilatus\"])\n\nresults in\n\n.. code-block:: xml\n\n   \u003cdefinition\u003e\n   \u003cgroup name=\"entry\" type=\"NXentry\"\u003e\n     \u003cgroup name=\"instrument\" type=\"NXinstrument\"\u003e\n       \u003cgroup name=\"pilatus\" type=\"NXdetector\"\u003e\n         \u003cgroup name=\"transformations\" type=\"NXtransformations\"/\u003e\n         \u003cfield name=\"data\" type=\"NX_FLOAT64\"/\u003e\n\t \u003c/group\u003e\n       \u003c/group\u003e\n     \u003c/group\u003e\n     \u003cdoc\u003e$var(detector=pilatus)\u003c/doc\u003e\n   \u003c/definition\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnexdatas%2Fnxsconfigserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnexdatas%2Fnxsconfigserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnexdatas%2Fnxsconfigserver/lists"}