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
egse/process.py
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides functions and classes to work with processes and sub-processes.
|
|
3
|
-
"""
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import contextlib
|
|
7
|
-
import datetime
|
|
8
|
-
import logging
|
|
9
|
-
import os
|
|
10
|
-
import subprocess
|
|
11
|
-
import threading
|
|
12
|
-
import time
|
|
13
|
-
import uuid
|
|
14
|
-
from typing import List
|
|
15
|
-
from typing import Optional
|
|
16
|
-
|
|
17
|
-
import psutil
|
|
18
|
-
from prometheus_client import Gauge
|
|
19
|
-
|
|
20
|
-
from egse.bits import humanize_bytes
|
|
21
|
-
from egse.system import humanize_seconds
|
|
22
|
-
|
|
23
|
-
LOGGER = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class ProcessStatus:
|
|
27
|
-
"""
|
|
28
|
-
The ProcessStatus is basically a dataclass that contains the status information of a running
|
|
29
|
-
process.
|
|
30
|
-
|
|
31
|
-
The available information is the following:
|
|
32
|
-
|
|
33
|
-
* pid: the process identifier
|
|
34
|
-
* uptime: the process up-time as a floating point number expressed in seconds
|
|
35
|
-
* uuid: the UUID1 for this process
|
|
36
|
-
* memory info: memory information on the process
|
|
37
|
-
* cpu usage, percentage and count (number of physical cores)
|
|
38
|
-
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
def __init__(self, *, metrics_prefix: Optional[str] = None):
|
|
42
|
-
self._process = psutil.Process()
|
|
43
|
-
self._cpu_count = psutil.cpu_count(logical=False)
|
|
44
|
-
with self._process.oneshot():
|
|
45
|
-
self._pid: int = self._process.pid
|
|
46
|
-
self._create_time: float = self._process.create_time()
|
|
47
|
-
# not sure if we need to use interval=0.1 as an argument in the next call
|
|
48
|
-
self._cpu_percent: float = self._process.cpu_percent()
|
|
49
|
-
self._cpu_times = self._process.cpu_times()
|
|
50
|
-
self._uptime = (
|
|
51
|
-
datetime.datetime.now(tz=datetime.timezone.utc).timestamp() - self._create_time
|
|
52
|
-
)
|
|
53
|
-
self._memory_info = self._process.memory_full_info()
|
|
54
|
-
self._uuid: uuid.UUID = uuid.uuid1()
|
|
55
|
-
|
|
56
|
-
metrics_prefix = f"{metrics_prefix.lower()}_" if metrics_prefix else ""
|
|
57
|
-
|
|
58
|
-
self.metrics = dict(
|
|
59
|
-
PSUTIL_NUMBER_OF_CPU=Gauge(
|
|
60
|
-
f"{metrics_prefix}psutil_number_of_cpu",
|
|
61
|
-
"Number of physical cores, excluding hyper thread CPUs"
|
|
62
|
-
),
|
|
63
|
-
PSUTIL_CPU_TIMES=Gauge(
|
|
64
|
-
f"{metrics_prefix}psutil_cpu_times_seconds",
|
|
65
|
-
"Accumulated process time in seconds", ["type"]
|
|
66
|
-
),
|
|
67
|
-
PSUTIL_CPU_PERCENT=Gauge(
|
|
68
|
-
f"{metrics_prefix}psutil_cpu_percent",
|
|
69
|
-
"The current process CPU utilization as a percentage"
|
|
70
|
-
),
|
|
71
|
-
PSUTIL_PID=Gauge(
|
|
72
|
-
f"{metrics_prefix}psutil_pid", "Process ID"
|
|
73
|
-
),
|
|
74
|
-
PSUTIL_MEMORY_INFO=Gauge(
|
|
75
|
-
f"{metrics_prefix}psutil_memory_info_bytes",
|
|
76
|
-
"Memory info for this instrumented process",
|
|
77
|
-
["type"]
|
|
78
|
-
),
|
|
79
|
-
PSUTIL_NUMBER_OF_THREADS=Gauge(
|
|
80
|
-
f"{metrics_prefix}psutil_number_of_threads",
|
|
81
|
-
"Return the number of Thread objects currently alive"
|
|
82
|
-
),
|
|
83
|
-
PSUTIL_PROC_UPTIME=Gauge(
|
|
84
|
-
f"{metrics_prefix}psutil_proccess_uptime",
|
|
85
|
-
"Return the time in seconds that the process is up and running"
|
|
86
|
-
),
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
self.metrics["PSUTIL_NUMBER_OF_CPU"].set(self._cpu_count)
|
|
90
|
-
self.metrics["PSUTIL_PID"].set(self._process.pid)
|
|
91
|
-
|
|
92
|
-
self.update()
|
|
93
|
-
|
|
94
|
-
def update_metrics(self):
|
|
95
|
-
"""
|
|
96
|
-
Updates the metrics that are taken from the psutils module.
|
|
97
|
-
|
|
98
|
-
The following metrics are never updated since they are not changed during a
|
|
99
|
-
process execution:
|
|
100
|
-
|
|
101
|
-
* PSUTIL_NUMBER_OF_CPU
|
|
102
|
-
* PSUTIL_PID
|
|
103
|
-
"""
|
|
104
|
-
|
|
105
|
-
self.metrics["PSUTIL_MEMORY_INFO"].labels(type="rss").set(self._memory_info.rss)
|
|
106
|
-
self.metrics["PSUTIL_MEMORY_INFO"].labels(type="uss").set(self._memory_info.uss)
|
|
107
|
-
self.metrics["PSUTIL_CPU_TIMES"].labels(type="user").set(self._cpu_times.user)
|
|
108
|
-
self.metrics["PSUTIL_CPU_TIMES"].labels(type="system").set(self._cpu_times.system)
|
|
109
|
-
self.metrics["PSUTIL_CPU_PERCENT"].set(self._cpu_percent)
|
|
110
|
-
self.metrics["PSUTIL_NUMBER_OF_THREADS"].set(threading.active_count())
|
|
111
|
-
self.metrics["PSUTIL_PROC_UPTIME"].set(self._uptime)
|
|
112
|
-
|
|
113
|
-
def update(self):
|
|
114
|
-
"""
|
|
115
|
-
Updates those values that change during execution, like memory usage, number of
|
|
116
|
-
connections, ...
|
|
117
|
-
|
|
118
|
-
This call will also update the metrics!
|
|
119
|
-
|
|
120
|
-
Returns:
|
|
121
|
-
the ProcessStatus object, self.
|
|
122
|
-
"""
|
|
123
|
-
self._cpu_percent = self._process.cpu_percent()
|
|
124
|
-
self._cpu_times = self._process.cpu_times()
|
|
125
|
-
self._uptime = time.time() - self._create_time
|
|
126
|
-
self._memory_info = self._process.memory_full_info()
|
|
127
|
-
|
|
128
|
-
self.update_metrics()
|
|
129
|
-
|
|
130
|
-
return self
|
|
131
|
-
|
|
132
|
-
def as_dict(self):
|
|
133
|
-
"""Returns all process information as a dictionary.
|
|
134
|
-
|
|
135
|
-
This runs the `update()` method first to bring the numbers up-to-date.
|
|
136
|
-
"""
|
|
137
|
-
self.update()
|
|
138
|
-
return {
|
|
139
|
-
"PID": self._pid,
|
|
140
|
-
"Up": self._uptime,
|
|
141
|
-
"UUID": self._uuid,
|
|
142
|
-
"RSS": self._memory_info.rss,
|
|
143
|
-
"USS": self._memory_info.uss,
|
|
144
|
-
"CPU User": self._cpu_times.user,
|
|
145
|
-
"CPU System": self._cpu_times.system,
|
|
146
|
-
"CPU count": self._cpu_count,
|
|
147
|
-
"CPU%": self._cpu_percent,
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
def __str__(self):
|
|
151
|
-
self.update()
|
|
152
|
-
msg = (
|
|
153
|
-
f"PID: {self._pid}, "
|
|
154
|
-
f"Up: {humanize_seconds(self._uptime)}, "
|
|
155
|
-
f"UUID: {self._uuid}, "
|
|
156
|
-
f"RSS: {humanize_bytes(self._memory_info.rss)}, "
|
|
157
|
-
f"USS: {humanize_bytes(self._memory_info.uss)}, "
|
|
158
|
-
f"CPU User: {humanize_seconds(self._cpu_times.user)}, "
|
|
159
|
-
f"CPU System: {humanize_seconds(self._cpu_times.system)}, "
|
|
160
|
-
f"CPU Count: {self._cpu_count}, "
|
|
161
|
-
f"CPU%: {self._cpu_percent}"
|
|
162
|
-
)
|
|
163
|
-
return msg
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
# * can we restart the same sub process?
|
|
167
|
-
# * do we need to pass the additional arguments to the constructor or to the execute method?
|
|
168
|
-
# When we can restart/re-execute a subprocess, we might want to do that with additional
|
|
169
|
-
# arguments, e.g. to set a debugging flag or to start in simulator mode. Then we will need to
|
|
170
|
-
# do that in the execute method.
|
|
171
|
-
# * Process should have a notion of UUID, which it can request at start-up to communicate to the
|
|
172
|
-
# process manager which can then check if it's known already or a new process that was started
|
|
173
|
-
# (possible on another computer)
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
class SubProcess:
|
|
177
|
-
"""
|
|
178
|
-
A SubProcess that is usually started by the ProcessManager.
|
|
179
|
-
|
|
180
|
-
Usage:
|
|
181
|
-
|
|
182
|
-
hexapod_ui = SubProcess("MyApp", [sys.executable, "-m", "egse.hexapod.hexapod_ui"])
|
|
183
|
-
hexapod_ui.execute()
|
|
184
|
-
|
|
185
|
-
"""
|
|
186
|
-
|
|
187
|
-
def __init__(self, name: str, cmd: List, args: List = None, shell: bool = True):
|
|
188
|
-
self._popen = None
|
|
189
|
-
self._sub_process: psutil.Process = None
|
|
190
|
-
self._name = name
|
|
191
|
-
self._cmd = cmd
|
|
192
|
-
self._args = args or []
|
|
193
|
-
self._shell = shell
|
|
194
|
-
|
|
195
|
-
def execute(self, detach_from_parent=False) -> bool:
|
|
196
|
-
""" Execute the sub-process.
|
|
197
|
-
|
|
198
|
-
Args:
|
|
199
|
-
- detach_from_parent: Boolean indicating whether the sub-process should be detached from the
|
|
200
|
-
parent process. If set to False, the sub-process will be killed whenever the
|
|
201
|
-
parent process is interrupted or stopped.
|
|
202
|
-
"""
|
|
203
|
-
|
|
204
|
-
try:
|
|
205
|
-
command: List = [*self._cmd, *self._args]
|
|
206
|
-
LOGGER.debug(f"SubProcess command: {command}")
|
|
207
|
-
# self._popen = subprocess.Popen(command, env=os.environ, close_fds=detach_from_parent)
|
|
208
|
-
self._popen = subprocess.Popen(
|
|
209
|
-
" ".join(command),
|
|
210
|
-
env=os.environ,
|
|
211
|
-
shell=self._shell, # executable='/bin/bash',
|
|
212
|
-
stdout=subprocess.DEVNULL,
|
|
213
|
-
stderr=subprocess.DEVNULL,
|
|
214
|
-
stdin=subprocess.DEVNULL,
|
|
215
|
-
)
|
|
216
|
-
self._sub_process = psutil.Process(self._popen.pid)
|
|
217
|
-
|
|
218
|
-
LOGGER.debug(
|
|
219
|
-
f"SubProcess started: {command}, pid={self._popen.pid}, sub_process="
|
|
220
|
-
f"{self._sub_process} [pid={self._sub_process.pid}]"
|
|
221
|
-
)
|
|
222
|
-
except KeyError:
|
|
223
|
-
LOGGER.error(f"Unknown client process: {self._name}", exc_info=True)
|
|
224
|
-
return False
|
|
225
|
-
except (PermissionError, FileNotFoundError) as exc:
|
|
226
|
-
# This error is raised when the command is not an executable or is not found
|
|
227
|
-
LOGGER.error(f"Could not execute sub-process: {exc}", exc_info=True)
|
|
228
|
-
return False
|
|
229
|
-
return True
|
|
230
|
-
|
|
231
|
-
@property
|
|
232
|
-
def name(self):
|
|
233
|
-
return self._name
|
|
234
|
-
|
|
235
|
-
@property
|
|
236
|
-
def pid(self) -> int:
|
|
237
|
-
return self._sub_process.pid if self._sub_process else None
|
|
238
|
-
|
|
239
|
-
def cmdline(self) -> str:
|
|
240
|
-
return " ".join(self._sub_process.cmdline())
|
|
241
|
-
|
|
242
|
-
def children(self, recursive: bool = True) -> List:
|
|
243
|
-
return self._sub_process.children(recursive=recursive)
|
|
244
|
-
|
|
245
|
-
def is_child(self, pid: int):
|
|
246
|
-
return any(pid == p.pid for p in self._sub_process.children(recursive=True))
|
|
247
|
-
|
|
248
|
-
def is_running(self):
|
|
249
|
-
"""
|
|
250
|
-
Check if this process is still running.
|
|
251
|
-
|
|
252
|
-
* checks if process exists
|
|
253
|
-
* checks if process is not a zombie and is not dead
|
|
254
|
-
|
|
255
|
-
Returns:
|
|
256
|
-
True if the process is running.
|
|
257
|
-
"""
|
|
258
|
-
if self._sub_process is None:
|
|
259
|
-
return False
|
|
260
|
-
if self._sub_process.is_running():
|
|
261
|
-
# it still might be a zombie process
|
|
262
|
-
if self._sub_process.status() in [psutil.STATUS_ZOMBIE, psutil.STATUS_DEAD]:
|
|
263
|
-
LOGGER.warning("The sub-process is dead or a zombie.")
|
|
264
|
-
return False
|
|
265
|
-
return True
|
|
266
|
-
LOGGER.debug(f"Return value of the sub-process: {self._popen.returncode}")
|
|
267
|
-
return False
|
|
268
|
-
|
|
269
|
-
def exists(self) -> bool:
|
|
270
|
-
"""
|
|
271
|
-
Checks if the sub-process exists by checking if its process ID exists.
|
|
272
|
-
|
|
273
|
-
Returns:
|
|
274
|
-
True if the sub-process exists.
|
|
275
|
-
"""
|
|
276
|
-
return psutil.pid_exists(self.pid)
|
|
277
|
-
|
|
278
|
-
def quit(self):
|
|
279
|
-
"""
|
|
280
|
-
Send a request to quit to the process.
|
|
281
|
-
|
|
282
|
-
This sends a ZeroMQ message "Quit" to the process. The process is expected to answer with
|
|
283
|
-
"Quiting" and then
|
|
284
|
-
actually ends its execution.
|
|
285
|
-
|
|
286
|
-
Returns:
|
|
287
|
-
True when received the answer "Quiting", False otherwise.
|
|
288
|
-
"""
|
|
289
|
-
return self.reap_children()
|
|
290
|
-
|
|
291
|
-
def reap_children(self, timeout=3):
|
|
292
|
-
"""Tries hard to terminate and ultimately kill all the children of this process."""
|
|
293
|
-
|
|
294
|
-
def on_terminate(proc):
|
|
295
|
-
LOGGER.info(f"process {proc} terminated with exit code {proc.returncode}")
|
|
296
|
-
|
|
297
|
-
return_code = 0
|
|
298
|
-
|
|
299
|
-
procs = [self._sub_process]
|
|
300
|
-
procs.extend(self._sub_process.children())
|
|
301
|
-
|
|
302
|
-
LOGGER.info(f"Processes: {procs}")
|
|
303
|
-
|
|
304
|
-
# send SIGTERM
|
|
305
|
-
for p in procs:
|
|
306
|
-
try:
|
|
307
|
-
LOGGER.info(f"Terminating process {p}")
|
|
308
|
-
p.terminate()
|
|
309
|
-
except psutil.NoSuchProcess:
|
|
310
|
-
pass
|
|
311
|
-
gone, alive = psutil.wait_procs(procs, timeout=timeout, callback=on_terminate)
|
|
312
|
-
if alive:
|
|
313
|
-
# send SIGKILL
|
|
314
|
-
for p in alive:
|
|
315
|
-
LOGGER.info(f"process {p} survived SIGTERM; trying SIGKILL")
|
|
316
|
-
try:
|
|
317
|
-
p.kill()
|
|
318
|
-
except psutil.NoSuchProcess:
|
|
319
|
-
pass
|
|
320
|
-
gone, alive = psutil.wait_procs(alive, timeout=timeout, callback=on_terminate)
|
|
321
|
-
if alive:
|
|
322
|
-
# give up
|
|
323
|
-
for p in alive:
|
|
324
|
-
LOGGER.info(f"process {p} survived SIGKILL; giving up")
|
|
325
|
-
return_code += 1 # return code indicates how many processes are still running
|
|
326
|
-
|
|
327
|
-
return return_code
|
|
328
|
-
|
|
329
|
-
def returncode(self):
|
|
330
|
-
"""
|
|
331
|
-
Check if the sub-process is terminated and return its return code or None when the process
|
|
332
|
-
is still running.
|
|
333
|
-
"""
|
|
334
|
-
return self._popen.poll()
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
def is_process_running(items: List[str] | str, contains: bool = True, case_sensitive: bool = False):
|
|
338
|
-
"""
|
|
339
|
-
Check if there is any running process that contains the given items in its commandline.
|
|
340
|
-
|
|
341
|
-
Loops over all running processes and tries to match all items in 'cmd_line_items' to the command line
|
|
342
|
-
of the process. If all 'cmd_line_items' can be matched to a process, the function returns True.
|
|
343
|
-
|
|
344
|
-
Args:
|
|
345
|
-
items: a string or a list of strings that should match command line parts
|
|
346
|
-
contains: if True, the match is done with 'in' otherwise '=='
|
|
347
|
-
case_sensitive: if True, the match shall be case-sensitive
|
|
348
|
-
|
|
349
|
-
Returns:
|
|
350
|
-
True if there exists a running process with the given items, False otherwise.
|
|
351
|
-
"""
|
|
352
|
-
|
|
353
|
-
def lower(x: str) -> str:
|
|
354
|
-
return x.lower()
|
|
355
|
-
|
|
356
|
-
def pass_through(x: str) -> str:
|
|
357
|
-
return x
|
|
358
|
-
|
|
359
|
-
case = pass_through if case_sensitive else lower
|
|
360
|
-
|
|
361
|
-
if not items:
|
|
362
|
-
LOGGER.warning("Expected at least one item in 'items', none were given. False returned.")
|
|
363
|
-
return False
|
|
364
|
-
|
|
365
|
-
items = [items] if isinstance(items, str) else items
|
|
366
|
-
|
|
367
|
-
for proc in psutil.process_iter():
|
|
368
|
-
with contextlib.suppress(psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
369
|
-
# LOGGER.info(f"{proc.name().lower() = }, {proc.cmdline() = }")
|
|
370
|
-
if contains:
|
|
371
|
-
if all(any(case(y) in case(x) for x in proc.cmdline()) for y in items):
|
|
372
|
-
return True
|
|
373
|
-
elif all(any(case(y) == case(x) for x in proc.cmdline()) for y in items):
|
|
374
|
-
return True
|
|
375
|
-
|
|
376
|
-
return False
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
def get_process_info(items: List[str] | str, contains: bool = True, case_sensitive: bool = False) -> List:
|
|
380
|
-
"""
|
|
381
|
-
Loops over all running processes and tries to match each item in 'items' to the command line
|
|
382
|
-
of the process. Any process where all 'items' can be matched will end up in the response.
|
|
383
|
-
|
|
384
|
-
Returns a list with the process info (PID, cmdline, create_time) for any processes where all 'items' match
|
|
385
|
-
the process command line. An empty list is returned when not 'all the items' match for any of the
|
|
386
|
-
processes.
|
|
387
|
-
|
|
388
|
-
Examples:
|
|
389
|
-
>>> get_process_info(items=["feesim"])
|
|
390
|
-
[
|
|
391
|
-
{
|
|
392
|
-
'pid': 10166,
|
|
393
|
-
'cmdline': [
|
|
394
|
-
'/Library/Frameworks/Python.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python',
|
|
395
|
-
'/Users/rik/git/plato-common-egse/venv38/bin/feesim',
|
|
396
|
-
'start',
|
|
397
|
-
'--zeromq'
|
|
398
|
-
],
|
|
399
|
-
'create_time': 1664898231.915995
|
|
400
|
-
}
|
|
401
|
-
]
|
|
402
|
-
|
|
403
|
-
>>> get_process_info(items=["dpu_cs", "--zeromq"])
|
|
404
|
-
[
|
|
405
|
-
{
|
|
406
|
-
'pid': 11595,
|
|
407
|
-
'cmdline': [
|
|
408
|
-
'/Library/Frameworks/Python.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python',
|
|
409
|
-
'/Users/rik/git/plato-common-egse/venv38/bin/dpu_cs',
|
|
410
|
-
'start',
|
|
411
|
-
'--zeromq'
|
|
412
|
-
],
|
|
413
|
-
'create_time': 1664898973.542281
|
|
414
|
-
}
|
|
415
|
-
]
|
|
416
|
-
|
|
417
|
-
Args:
|
|
418
|
-
items: a string or a list of strings that should match command line items
|
|
419
|
-
contains: if True, the match is done with 'in' otherwise '=='
|
|
420
|
-
case_sensitive: if True, the match shall be case-sensitive
|
|
421
|
-
|
|
422
|
-
Returns:
|
|
423
|
-
A list of process info entries.
|
|
424
|
-
|
|
425
|
-
"""
|
|
426
|
-
response = []
|
|
427
|
-
|
|
428
|
-
def lower(x: str) -> str:
|
|
429
|
-
return x.lower()
|
|
430
|
-
|
|
431
|
-
def pass_through(x: str) -> str:
|
|
432
|
-
return x
|
|
433
|
-
|
|
434
|
-
case = pass_through if case_sensitive else lower
|
|
435
|
-
|
|
436
|
-
if not items:
|
|
437
|
-
LOGGER.warning("Expected at least one item in 'items', none were given. Empty list returned.")
|
|
438
|
-
return response
|
|
439
|
-
|
|
440
|
-
items = [items] if isinstance(items, str) else items
|
|
441
|
-
|
|
442
|
-
for proc in psutil.process_iter():
|
|
443
|
-
with contextlib.suppress(psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
444
|
-
# LOGGER.info(f"{proc.name().lower() = }, {proc.cmdline() = }")
|
|
445
|
-
if contains:
|
|
446
|
-
if all(any(case(y) in case(x) for x in proc.cmdline()) for y in items):
|
|
447
|
-
response.append(proc.as_dict(attrs=['pid', 'cmdline', 'create_time']))
|
|
448
|
-
elif all(any(case(y) == case(x) for x in proc.cmdline()) for y in items):
|
|
449
|
-
response.append(proc.as_dict(attrs=['pid', 'cmdline', 'create_time']))
|
|
450
|
-
|
|
451
|
-
return response
|