cgse 2023.38.0__py3-none-any.whl → 2024.1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +77 -0
- cgse-2024.1.3.dist-info/METADATA +41 -0
- cgse-2024.1.3.dist-info/RECORD +5 -0
- {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
- cgse-2023.38.0.dist-info/COPYING +0 -674
- cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
- cgse-2023.38.0.dist-info/METADATA +0 -144
- cgse-2023.38.0.dist-info/RECORD +0 -649
- cgse-2023.38.0.dist-info/entry_points.txt +0 -75
- cgse-2023.38.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5235
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -626
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -912
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -234
- egse/alert/alertman_ui.py +0 -603
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -130
- egse/alert/gsm/beaglebone_protocol.py +0 -48
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -129
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1015
- egse/confman/confman.yaml +0 -67
- egse/confman/confman_cs.py +0 -239
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -442
- egse/coordinates/__init__.py +0 -531
- egse/coordinates/avoidance.py +0 -103
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -120
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -195
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1247
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -415
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2681
- egse/dpu/ccd_ui.py +0 -508
- egse/dpu/dpu.py +0 -786
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -668
- egse/dpu/fitsgen.py +0 -2077
- egse/dpu/fitsgen_test.py +0 -752
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/constants.py +0 -220
- egse/dsi/esl.py +0 -870
- egse/dsi/rmap.py +0 -1042
- egse/dsi/rmapci.py +0 -37
- egse/dsi/spw.py +0 -154
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -258
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -28
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -51
- egse/fdir/fdir_manager_controller.py +0 -228
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -25
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -37
- egse/fdir/fdir_remote_controller.py +0 -50
- egse/fdir/fdir_remote_cs.py +0 -97
- egse/fdir/fdir_remote_interface.py +0 -14
- egse/fdir/fdir_remote_popup.py +0 -31
- egse/fee/__init__.py +0 -114
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/fee.py +0 -631
- egse/fee/feesim.py +0 -750
- egse/fee/n_fee_hk.py +0 -761
- egse/fee/nfee.py +0 -187
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -24
- egse/filterwheel/eksma/fw8smc4.py +0 -661
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -81
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -111
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1068
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -712
- egse/fov/fov_ui.py +0 -861
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -135
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1281
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -588
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -138
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -196
- egse/hexapod/symetrie/puna_protocol.py +0 -131
- egse/hexapod/symetrie/puna_ui.py +0 -434
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -415
- egse/hexapod/symetrie/zonda_protocol.py +0 -119
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -765
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -69
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/macOS/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/macOS/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -73
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -98
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -163
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -811
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -603
- egse/proxy.py +0 -522
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -675
- egse/resource.py +0 -333
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -212
- egse/services.yaml +0 -51
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1180
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -69
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1479
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -247
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -193
- egse/stages/arun/smd3.py +0 -111
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -472
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -904
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -111
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1004
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -72
- egse/storage/storage_cs.py +0 -214
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -412
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1408
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -874
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -177
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -116
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
- egse/tempcontrol/beaglebone/beaglebone.py +0 -342
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
- egse/tempcontrol/digalox/digalox.py +0 -107
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -112
- egse/tempcontrol/digalox/digalox_protocol.py +0 -55
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -78
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -73
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -727
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -875
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -118
- egse/tempcontrol/srs/ptc10_protocol.py +0 -42
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -164
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -92
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -128
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -102
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -83
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -316
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -704
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -39
- egse/vacuum/pfeiffer/tc400.py +0 -113
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -140
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
- egse/vacuum/pfeiffer/tpg261.py +0 -81
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -60
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -44
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/create_hdf5_report.py +0 -295
- scripts/csl_model.py +0 -436
- scripts/csl_restore_setup.py +0 -230
- scripts/export-grafana-dashboards.py +0 -50
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -11
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -38
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import re
|
|
3
|
-
import logging
|
|
4
|
-
import psutil
|
|
5
|
-
import subprocess
|
|
6
|
-
|
|
7
|
-
from threading import Thread
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
|
|
10
|
-
import yaml
|
|
11
|
-
|
|
12
|
-
from PyQt5.QtWidgets import QMessageBox, QApplication, QDialog, QLabel, QVBoxLayout
|
|
13
|
-
|
|
14
|
-
from egse.setup import load_setup
|
|
15
|
-
from egse.settings import Settings
|
|
16
|
-
from egse.setup import get_setup
|
|
17
|
-
from egse.system import replace_environment_variable
|
|
18
|
-
from egse.control import Success
|
|
19
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
20
|
-
from egse.fdir.fdir_remote import FdirRemoteProxy
|
|
21
|
-
from egse.fdir import generate_popup
|
|
22
|
-
|
|
23
|
-
logger = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
CTRL_SETTINGS = Settings.load("FDIR Manager Control Server")
|
|
26
|
-
REMOTE_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class FdirException(Exception):
|
|
30
|
-
pass
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class FdirManagerController(FdirRemoteInterface):
|
|
34
|
-
|
|
35
|
-
def __init__(self):
|
|
36
|
-
|
|
37
|
-
self._state = ""
|
|
38
|
-
self._priority = -1
|
|
39
|
-
self._local_pids = []
|
|
40
|
-
self._remote_pids = []
|
|
41
|
-
self._storage_path = replace_environment_variable(CTRL_SETTINGS.RECOVERY_SCRIPT_LOCATION)
|
|
42
|
-
self._logging_path = replace_environment_variable(CTRL_SETTINGS.LOGGING_LOCATION)
|
|
43
|
-
self._remote_proxy = FdirRemoteProxy()
|
|
44
|
-
# Check if the remote is online.
|
|
45
|
-
if not self._remote_proxy.is_cs_connected():
|
|
46
|
-
logger.warning("FDIR Manager could not connect to the FDIR remote CS")
|
|
47
|
-
# raise RuntimeError("FDIR Manager could not connect the the FDIR Remote CS")
|
|
48
|
-
else:
|
|
49
|
-
logger.info(f"connected to remote CS @ {REMOTE_SETTINGS.HOSTNAME}")
|
|
50
|
-
|
|
51
|
-
# Try to load fdir table.
|
|
52
|
-
try:
|
|
53
|
-
self._fdir_table = load_setup().setup.gse.fdir_manager.configuration.table
|
|
54
|
-
except AttributeError as ex:
|
|
55
|
-
raise FdirException("Could not FDIR table from current setup") from ex
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def is_connected(self):
|
|
59
|
-
return True
|
|
60
|
-
|
|
61
|
-
def is_simulator(self):
|
|
62
|
-
return False
|
|
63
|
-
|
|
64
|
-
def register_script(self, host: str, pid: int):
|
|
65
|
-
|
|
66
|
-
if self._state != 0:
|
|
67
|
-
logger.error(f"Attempt to register script while state is not idle ({self._state}).")
|
|
68
|
-
raise FdirException(
|
|
69
|
-
f"Cannot register script because FDIR state is not idle ({self._state}).")
|
|
70
|
-
|
|
71
|
-
elif host in ['localhost', os.uname()[1]]:
|
|
72
|
-
|
|
73
|
-
if pid in self._local_pids:
|
|
74
|
-
logger.error(f"Attempt to register existing PID {pid} @ localhost.")
|
|
75
|
-
raise FdirException("PID is already registered.")
|
|
76
|
-
else:
|
|
77
|
-
self._local_pids.append(pid)
|
|
78
|
-
logger.info(f"Successful registration of PID {pid} @ localhost.")
|
|
79
|
-
|
|
80
|
-
elif host == REMOTE_SETTINGS.HOSTNAME:
|
|
81
|
-
|
|
82
|
-
if pid in self._remote_pids:
|
|
83
|
-
logger.error(f"Attempt to register existing PID {pid} @ {host}.")
|
|
84
|
-
raise FdirException("PID is already registered.")
|
|
85
|
-
else:
|
|
86
|
-
self._remote_pids.append(pid)
|
|
87
|
-
logger.info(f"Successful registration of PID {pid} @ {host}.")
|
|
88
|
-
|
|
89
|
-
else:
|
|
90
|
-
logger.error(f"Attempt to register a script with unknown hostname ({host})")
|
|
91
|
-
raise FdirException("unknown hostname")
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def deregister_script(self, host: str, pid: int):
|
|
95
|
-
|
|
96
|
-
if host in ['localhost', os.uname()[1]]:
|
|
97
|
-
|
|
98
|
-
if pid not in self._local_pids[host]:
|
|
99
|
-
logger.error(f"Attempt to deregister unknown PID {pid} @ localhost.")
|
|
100
|
-
raise FdirException("PID is unknown.")
|
|
101
|
-
else:
|
|
102
|
-
self._pids[host].remove(pid)
|
|
103
|
-
logger.info(f"Successful deregistration of PID {pid} @ localhost.")
|
|
104
|
-
|
|
105
|
-
if host == REMOTE_SETTINGS.HOSTNAME:
|
|
106
|
-
|
|
107
|
-
if pid not in self._local_pids[host]:
|
|
108
|
-
logger.error(f"Attempt to deregister unknown PID {pid} @ {host}.")
|
|
109
|
-
raise FdirException("PID is unknown.")
|
|
110
|
-
else:
|
|
111
|
-
self._pids[host].remove(pid)
|
|
112
|
-
logger.info(f"Successful deregistration of PID {pid} @ {host}.")
|
|
113
|
-
|
|
114
|
-
else:
|
|
115
|
-
logger.error(f"attempt to deregister a script with unknown hostname ({host})")
|
|
116
|
-
raise FdirException("unknown hostname")
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
def signal_fdir(self, fdir_code: str, script_args: list):
|
|
120
|
-
|
|
121
|
-
logger.info(f"Received FDIR code {fdir_code}: {script_args}.")
|
|
122
|
-
|
|
123
|
-
# try to get the mitigation script name and priority from the fdir table
|
|
124
|
-
try:
|
|
125
|
-
recovery_command = self._fdir_table[fdir_code]['script']
|
|
126
|
-
priority = self._fdir_table[fdir_code]['priority']
|
|
127
|
-
actions = self._fdir_table[fdir_code]['actions']
|
|
128
|
-
except:
|
|
129
|
-
logger.error(f"No mitigation script found in the fdir table for fdir code {fdir_code}.")
|
|
130
|
-
raise FdirException("Cannot find code in FDIR table")
|
|
131
|
-
|
|
132
|
-
if priority <= self._priority:
|
|
133
|
-
logger.warning(f"Received FDIR code with lower priority {fdir_code} ({priority}) "
|
|
134
|
-
f"than current state {self._state} ({self._priority}).")
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
self._state = fdir_code
|
|
138
|
-
self._priority = priority
|
|
139
|
-
|
|
140
|
-
# kill registered local scripts
|
|
141
|
-
for pid in self._local_pids:
|
|
142
|
-
try:
|
|
143
|
-
process = psutil.Process(pid)
|
|
144
|
-
except psutil.NoSuchProcess:
|
|
145
|
-
logger.warning(
|
|
146
|
-
f"Could not find a process with PID {pid} @ localhost.")
|
|
147
|
-
else:
|
|
148
|
-
process.kill()
|
|
149
|
-
logger.info(f"Killed registered script with PID {pid} @ localhost.")
|
|
150
|
-
|
|
151
|
-
# Kill registered remote scripts
|
|
152
|
-
for pid in self._remote_pids:
|
|
153
|
-
response = self._remote_proxy.kill_process(pid)
|
|
154
|
-
if isinstance(response, Success):
|
|
155
|
-
logger.info(f"Killed registered script with PID {pid} @ {REMOTE_SETTINGS.HOSTNAME}.")
|
|
156
|
-
else:
|
|
157
|
-
logger.warning(
|
|
158
|
-
f"Could not kill process with PID {pid} @ {REMOTE_SETTINGS.HOSTNAME}.")
|
|
159
|
-
|
|
160
|
-
# Clear all stored PIDs
|
|
161
|
-
self._local_pids = []
|
|
162
|
-
self._remote_pids = []
|
|
163
|
-
|
|
164
|
-
# open filewriter for fdir script output logging
|
|
165
|
-
timestring = datetime.now().strftime("%y-%m-%d_%H:%M:%S")
|
|
166
|
-
outfilename = f"{self._logging_path}/log/{timestring}_fdir_{fdir_code}"
|
|
167
|
-
os.makedirs(os.path.dirname(outfilename), exist_ok=True) # Create directories if they don't exist
|
|
168
|
-
|
|
169
|
-
# create list of strings used to call subprocess
|
|
170
|
-
exc_command = ["python3"]
|
|
171
|
-
exc_command.append(recovery_command) # read script path
|
|
172
|
-
exc_command[1] = f"{self._storage_path}{exc_command[1]}" # prepend path to script
|
|
173
|
-
exc_command.extend(script_args) # add script arguments
|
|
174
|
-
|
|
175
|
-
# run recovery script
|
|
176
|
-
script_success = False
|
|
177
|
-
try:
|
|
178
|
-
outfile = open(outfilename, 'w')
|
|
179
|
-
p = subprocess.Popen(exc_command,
|
|
180
|
-
stdout=outfile,
|
|
181
|
-
stderr=outfile,
|
|
182
|
-
shell=False,
|
|
183
|
-
preexec_fn=os.setpgrp)
|
|
184
|
-
p.wait()
|
|
185
|
-
except Exception as e:
|
|
186
|
-
logger.error(f"failed to run {exc_command}: {e}")
|
|
187
|
-
else:
|
|
188
|
-
if p.returncode == 0:
|
|
189
|
-
logger.info(f"Executed recovery script '{recovery_command}'.")
|
|
190
|
-
script_success = True
|
|
191
|
-
else:
|
|
192
|
-
logger.info(f"Failed to execute script: '{recovery_command}'")
|
|
193
|
-
script_success = False
|
|
194
|
-
finally:
|
|
195
|
-
outfile.close()
|
|
196
|
-
|
|
197
|
-
# Create a single string representation of the actions list for the pop-up.
|
|
198
|
-
action_string = "\n".join([f"- {action}" for action in actions])
|
|
199
|
-
|
|
200
|
-
# Generate a pop-up on the remote machine (client).
|
|
201
|
-
if self._remote_proxy.is_cs_connected():
|
|
202
|
-
self._remote_proxy.generate_popup(
|
|
203
|
-
code=fdir_code, actions=action_string, success=script_success)
|
|
204
|
-
else:
|
|
205
|
-
generate_popup(code=fdir_code, actions=action_string, success=script_success)
|
|
206
|
-
|
|
207
|
-
def clear_fdir(self):
|
|
208
|
-
self._priority = 0
|
|
209
|
-
logger.info("Cleared FDIR state.")
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def get_state(self):
|
|
213
|
-
return self._priority
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
def main():
|
|
217
|
-
fmc = FdirManagerController()
|
|
218
|
-
fmc.register_script('localhost', 11111)
|
|
219
|
-
print("fdir_state =", fmc.get_state())
|
|
220
|
-
fmc.signal_fdir('FDIR_TEST')
|
|
221
|
-
fmc.signal_fdir('FDIR_TEST') # Should fail because of priority
|
|
222
|
-
print("fdir_state =", fmc.get_state())
|
|
223
|
-
fmc.clear_fdir()
|
|
224
|
-
fmc.signal_fdir('FDIR_TEST')
|
|
225
|
-
print("fdir_state =", fmc.get_state())
|
|
226
|
-
|
|
227
|
-
if __name__ == "__main__":
|
|
228
|
-
main()
|
egse/fdir/fdir_manager_cs.py
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
import click
|
|
7
|
-
import zmq
|
|
8
|
-
from prometheus_client import start_http_server
|
|
9
|
-
|
|
10
|
-
from egse.settings import Settings
|
|
11
|
-
from egse.control import ControlServer
|
|
12
|
-
from egse.system import replace_environment_variable
|
|
13
|
-
from egse.fdir.fdir_manager import FdirManagerProtocol, FdirManagerProxy
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
CTRL_SETTINGS = Settings.load("FDIR Manager Control Server")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class FdirManagerControlServer(ControlServer):
|
|
21
|
-
""" The FDIR Manager Control Server is the centralized point of emergency mitigation.
|
|
22
|
-
In response to an FDIR signal from anywhere in the CGSE, this CS will terminate all running
|
|
23
|
-
control scripts and subsequently run a predefined recovery script. Terminating control
|
|
24
|
-
scripts on other hosts is done through a FDIR Remote CS, running on the other host(s).
|
|
25
|
-
|
|
26
|
-
The following functionality is provided:
|
|
27
|
-
|
|
28
|
-
* (de-)registering control scripts
|
|
29
|
-
* receiving FDIR codes
|
|
30
|
-
* automated killing of operational scripts
|
|
31
|
-
* automated running of recovery scripts
|
|
32
|
-
* handling priority between FDIR codes
|
|
33
|
-
* monitoring of the FDIR CS state
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
def __init__(self):
|
|
37
|
-
super().__init__()
|
|
38
|
-
|
|
39
|
-
self.device_protocol = FdirManagerProtocol(self)
|
|
40
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
41
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
42
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
43
|
-
|
|
44
|
-
def get_communication_protocol(self):
|
|
45
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
46
|
-
|
|
47
|
-
def get_commanding_port(self):
|
|
48
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
49
|
-
|
|
50
|
-
def get_service_port(self):
|
|
51
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
52
|
-
|
|
53
|
-
def get_monitoring_port(self):
|
|
54
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
55
|
-
|
|
56
|
-
def get_storage_mnemonic(self):
|
|
57
|
-
try:
|
|
58
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
59
|
-
except AttributeError:
|
|
60
|
-
return "FM"
|
|
61
|
-
|
|
62
|
-
def before_serve(self):
|
|
63
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@click.group()
|
|
67
|
-
def cli():
|
|
68
|
-
pass
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@cli.command()
|
|
72
|
-
def start():
|
|
73
|
-
""" Starts the FDIR Control Server. """
|
|
74
|
-
|
|
75
|
-
multiprocessing.current_process().name = "fdir_manager_cs"
|
|
76
|
-
|
|
77
|
-
try:
|
|
78
|
-
check_prerequisites()
|
|
79
|
-
except RuntimeError as exc:
|
|
80
|
-
print(exc)
|
|
81
|
-
logger.error(exc)
|
|
82
|
-
return 0
|
|
83
|
-
|
|
84
|
-
try:
|
|
85
|
-
control_server = FdirManagerControlServer()
|
|
86
|
-
control_server.serve()
|
|
87
|
-
except KeyboardInterrupt:
|
|
88
|
-
print("Shutdown requested...exiting")
|
|
89
|
-
except SystemExit as exit_code:
|
|
90
|
-
print("System Exit with code {}.".format(exit_code))
|
|
91
|
-
sys.exit(exit_code)
|
|
92
|
-
except Exception:
|
|
93
|
-
import traceback
|
|
94
|
-
|
|
95
|
-
traceback.print_exc(file=sys.stdout)
|
|
96
|
-
|
|
97
|
-
return 0
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
@cli.command()
|
|
101
|
-
def stop():
|
|
102
|
-
"""Send a 'quit_server' command to the Configuration Manager."""
|
|
103
|
-
with FdirManagerProxy() as fm:
|
|
104
|
-
sp = fm.get_service_proxy()
|
|
105
|
-
sp.quit_server()
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
@cli.command()
|
|
109
|
-
def status():
|
|
110
|
-
"""Print the status of the control server."""
|
|
111
|
-
pass
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def check_prerequisites():
|
|
115
|
-
""" Checks if the recovery script location is defined and valid.
|
|
116
|
-
|
|
117
|
-
Raises:
|
|
118
|
-
RuntimeError.
|
|
119
|
-
"""
|
|
120
|
-
|
|
121
|
-
location = CTRL_SETTINGS.RECOVERY_SCRIPT_LOCATION
|
|
122
|
-
location = replace_environment_variable(location)
|
|
123
|
-
|
|
124
|
-
if not location:
|
|
125
|
-
raise RuntimeError(
|
|
126
|
-
"The environment variable referenced in the Settings.yaml file for the "
|
|
127
|
-
"RECOVERY_SCRIPT_LOCATION of the FDIR control server does not exist, please set "
|
|
128
|
-
"the environment variable."
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
location = Path(location)
|
|
132
|
-
|
|
133
|
-
if not location.exists():
|
|
134
|
-
raise RuntimeError(
|
|
135
|
-
f"The directory {location} does not exist, provide a valid location for "
|
|
136
|
-
f"recovery scripts."
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
logger.debug(f"recovery script location = {location}")
|
|
140
|
-
|
|
141
|
-
location = CTRL_SETTINGS.LOGGING_LOCATION
|
|
142
|
-
location = replace_environment_variable(location)
|
|
143
|
-
|
|
144
|
-
if not location:
|
|
145
|
-
raise RuntimeError(
|
|
146
|
-
"The environment variable referenced in the Settings.yaml file for the "
|
|
147
|
-
"LOGGING_LOCATION of the FDIR control server does not exist, please set "
|
|
148
|
-
"the environment variable."
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
location = Path(location)
|
|
152
|
-
|
|
153
|
-
if not location.exists():
|
|
154
|
-
raise RuntimeError(
|
|
155
|
-
f"The directory {location} does not exist, provide a valid location for "
|
|
156
|
-
f"the log output of recovery scripts."
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
logger.debug(f"FDIR recovery script logging location = {location}")
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if __name__ == "__main__":
|
|
163
|
-
|
|
164
|
-
sys.exit(cli())
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
from egse.decorators import dynamic_interface
|
|
2
|
-
from egse.control import Response, Success
|
|
3
|
-
|
|
4
|
-
class FdirManagerInterface:
|
|
5
|
-
""" Descriptions of the interface can be found in the corresponding yaml file. """
|
|
6
|
-
|
|
7
|
-
@dynamic_interface
|
|
8
|
-
def register_script(self, host: str, pid: int):
|
|
9
|
-
raise NotImplementedError
|
|
10
|
-
|
|
11
|
-
@dynamic_interface
|
|
12
|
-
def deregister_script(self, host: str, pid: int):
|
|
13
|
-
raise NotImplementedError
|
|
14
|
-
|
|
15
|
-
@dynamic_interface
|
|
16
|
-
def signal_fdir(self, fdir_code: int):
|
|
17
|
-
raise NotImplementedError
|
|
18
|
-
|
|
19
|
-
@dynamic_interface
|
|
20
|
-
def clear_fdir(self):
|
|
21
|
-
raise NotImplementedError
|
|
22
|
-
|
|
23
|
-
@dynamic_interface
|
|
24
|
-
def get_state(self):
|
|
25
|
-
raise NotImplementedError
|
egse/fdir/fdir_remote.py
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from egse.command import ClientServerCommand
|
|
4
|
-
from egse.control import ControlServer
|
|
5
|
-
from egse.proxy import Proxy
|
|
6
|
-
from egse.protocol import CommandProtocol
|
|
7
|
-
from egse.settings import Settings
|
|
8
|
-
from egse.zmq_ser import connect_address, bind_address
|
|
9
|
-
from egse.system import format_datetime
|
|
10
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
11
|
-
from egse.fdir.fdir_remote_controller import FdirRemoteController
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
CTRL_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
17
|
-
DEVICE_SETTINGS = Settings.load(filename="fdir_remote.yaml")
|
|
18
|
-
SITE_ID = Settings.load("SITE").ID
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class FdirRemoteCommand(ClientServerCommand):
|
|
22
|
-
pass
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class FdirRemoteProxy(Proxy, FdirRemoteInterface):
|
|
26
|
-
""" The FDIR Remote Proxy class is used to connect to the FDIR remote
|
|
27
|
-
control server. It should only be used by the fdir manager.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
31
|
-
self,
|
|
32
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
33
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
34
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
35
|
-
):
|
|
36
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class FdirRemoteProtocol(CommandProtocol):
|
|
40
|
-
|
|
41
|
-
def __init__(self, control_server: ControlServer):
|
|
42
|
-
|
|
43
|
-
super().__init__()
|
|
44
|
-
|
|
45
|
-
self.control_server = control_server
|
|
46
|
-
self.controller = FdirRemoteController()
|
|
47
|
-
|
|
48
|
-
self.load_commands(
|
|
49
|
-
DEVICE_SETTINGS.Commands,
|
|
50
|
-
FdirRemoteCommand,
|
|
51
|
-
FdirRemoteController,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
self.build_device_method_lookup_table(self.controller)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def get_bind_address(self):
|
|
58
|
-
|
|
59
|
-
return bind_address(
|
|
60
|
-
self.control_server.get_communication_protocol(),
|
|
61
|
-
self.control_server.get_commanding_port(),
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def get_status(self):
|
|
66
|
-
|
|
67
|
-
return super().get_status()
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# The FDIR remote is stateless, so no HK.
|
|
71
|
-
def get_housekeeping(self):
|
|
72
|
-
|
|
73
|
-
return {"timestamp": format_datetime()}
|
egse/fdir/fdir_remote.yaml
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
BaseClass:
|
|
2
|
-
egse.fdir.FdirRemoteInterface
|
|
3
|
-
|
|
4
|
-
ProxyClass:
|
|
5
|
-
egse.fdir.FdirRemoteProxy
|
|
6
|
-
|
|
7
|
-
ControlServerClass:
|
|
8
|
-
egse.alert.FdirRemoteControlServer
|
|
9
|
-
|
|
10
|
-
ControlServer:
|
|
11
|
-
egse.fdir.fdir_remote_cs
|
|
12
|
-
|
|
13
|
-
Commands:
|
|
14
|
-
is_connected:
|
|
15
|
-
description:
|
|
16
|
-
args:
|
|
17
|
-
cmd: ""
|
|
18
|
-
|
|
19
|
-
is_simulator:
|
|
20
|
-
description:
|
|
21
|
-
args:
|
|
22
|
-
cmd: ""
|
|
23
|
-
|
|
24
|
-
kill_process:
|
|
25
|
-
description: Instruct the CS to kill a process (test script).
|
|
26
|
-
args:
|
|
27
|
-
pid: int | process ID of the script
|
|
28
|
-
cmd: "{pid}"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
generate_popup:
|
|
32
|
-
description: Generate a pop-up on the remote (client) machine to warn about an FDIR situation.
|
|
33
|
-
args:
|
|
34
|
-
code: str | fdir code
|
|
35
|
-
actions: str | list of actions performed (delimited by newlines)
|
|
36
|
-
success: bool | whether the recovery script was executed successfuly
|
|
37
|
-
cmd: "{code}{actions}{success}"
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
import logging
|
|
4
|
-
import psutil
|
|
5
|
-
import subprocess
|
|
6
|
-
import threading
|
|
7
|
-
import time
|
|
8
|
-
|
|
9
|
-
from PyQt5.QtWidgets import QMessageBox, QApplication
|
|
10
|
-
|
|
11
|
-
from egse.control import Response, Success, Failure
|
|
12
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
13
|
-
# from egse.fdir.fdir_manager import FdirManagerProxy
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class FdirRemoteController(FdirRemoteInterface):
|
|
19
|
-
def __init__(self):
|
|
20
|
-
self.dialog = None
|
|
21
|
-
|
|
22
|
-
def is_connected(self):
|
|
23
|
-
return True
|
|
24
|
-
|
|
25
|
-
def is_simulator(self):
|
|
26
|
-
return False
|
|
27
|
-
|
|
28
|
-
def kill_process(self, pid: int) -> Response:
|
|
29
|
-
|
|
30
|
-
try:
|
|
31
|
-
process = psutil.Process(pid)
|
|
32
|
-
except psutil.NoSuchProcess:
|
|
33
|
-
logger.warning(f"Could not find a process with PID {pid}.")
|
|
34
|
-
return Failure(f"Could not find a process with PID {pid}.")
|
|
35
|
-
else:
|
|
36
|
-
process.kill()
|
|
37
|
-
logger.info(f"Killed registered script with PID {pid}.")
|
|
38
|
-
return Success("")
|
|
39
|
-
|
|
40
|
-
def generate_popup(self, code: str, actions: str, success: bool) -> Response:
|
|
41
|
-
|
|
42
|
-
path = os.path.dirname(os.path.abspath(__file__))
|
|
43
|
-
subprocess.Popen(['python3', f'{path}/fdir_remote_popup.py', code, actions, str(success)])
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if __name__ == "__main__":
|
|
49
|
-
fdir = FdirRemoteController()
|
|
50
|
-
fdir.generate_popup("FDIR_CS_STOPPED", "rip", True)
|
egse/fdir/fdir_remote_cs.py
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
from PyQt5.QtWidgets import QApplication
|
|
7
|
-
import click
|
|
8
|
-
import zmq
|
|
9
|
-
from prometheus_client import start_http_server
|
|
10
|
-
|
|
11
|
-
from egse.settings import Settings
|
|
12
|
-
from egse.control import ControlServer
|
|
13
|
-
from egse.system import replace_environment_variable
|
|
14
|
-
from egse.fdir.fdir_remote import FdirRemoteProtocol, FdirRemoteProxy
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
CTRL_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class FdirRemoteControlServer(ControlServer):
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def __init__(self):
|
|
25
|
-
super().__init__()
|
|
26
|
-
self.device_protocol = FdirRemoteProtocol(self)
|
|
27
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
28
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
29
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def get_communication_protocol(self):
|
|
33
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
34
|
-
|
|
35
|
-
def get_commanding_port(self):
|
|
36
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
37
|
-
|
|
38
|
-
def get_service_port(self):
|
|
39
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
40
|
-
|
|
41
|
-
def get_monitoring_port(self):
|
|
42
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
43
|
-
|
|
44
|
-
def get_storage_mnemonic(self):
|
|
45
|
-
try:
|
|
46
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
47
|
-
except AttributeError:
|
|
48
|
-
return "FR"
|
|
49
|
-
|
|
50
|
-
def before_serve(self):
|
|
51
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@click.group()
|
|
55
|
-
def cli():
|
|
56
|
-
pass
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@cli.command()
|
|
60
|
-
def start():
|
|
61
|
-
""" Starts the FDIR Control Server. """
|
|
62
|
-
|
|
63
|
-
multiprocessing.current_process().name = "fdir_remote_cs"
|
|
64
|
-
|
|
65
|
-
try:
|
|
66
|
-
control_server = FdirRemoteControlServer()
|
|
67
|
-
control_server.serve()
|
|
68
|
-
except KeyboardInterrupt:
|
|
69
|
-
print("Shutdown requested...exiting")
|
|
70
|
-
except SystemExit as exit_code:
|
|
71
|
-
print("System Exit with code {}.".format(exit_code))
|
|
72
|
-
sys.exit(exit_code)
|
|
73
|
-
except Exception:
|
|
74
|
-
import traceback
|
|
75
|
-
|
|
76
|
-
traceback.print_exc(file=sys.stdout)
|
|
77
|
-
|
|
78
|
-
return 0
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
@cli.command()
|
|
82
|
-
def stop():
|
|
83
|
-
"""Send a 'quit_server' command to the Configuration Manager."""
|
|
84
|
-
with FdirRemoteProxy() as fm:
|
|
85
|
-
sp = fm.get_service_proxy()
|
|
86
|
-
sp.quit_server()
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@cli.command()
|
|
90
|
-
def status():
|
|
91
|
-
"""Print the status of the control server."""
|
|
92
|
-
pass
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if __name__ == "__main__":
|
|
96
|
-
|
|
97
|
-
sys.exit(cli())
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from egse.decorators import dynamic_interface
|
|
2
|
-
from egse.control import Response, Success
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class FdirRemoteInterface:
|
|
6
|
-
""" Descriptions of the interface can be found in the corresponding yaml file. """
|
|
7
|
-
|
|
8
|
-
@dynamic_interface
|
|
9
|
-
def kill_process(self, pid: int) -> Response:
|
|
10
|
-
raise NotImplementedError
|
|
11
|
-
|
|
12
|
-
@dynamic_interface
|
|
13
|
-
def generate_popup(self, code: int, actions, success) -> Response:
|
|
14
|
-
raise NotImplementedError
|