Lvm Network Power Switch
- CLU Actor based interface
- Supports a Dummy PDU
- Supports iBOOT g2 with python code from here
- Supports Digital Loggers Web Power with python code from here
Install CLU by using PyPI.
$ pip install sdss-clu
Clone this repository.
$ git clone https://github.com/sdss/lvmnps
$ cd lvmnps
Install RabbitMQ by using apt-get.
$ sudo apt-get install -y erlang
$ sudo apt-get install -y rabbitmq-server
$ sudo systemctl enable rabbitmq-server
$ sudo systemctl start rabbitmq-server
Install pyenv by using pyenv installer.
$ curl https://pyenv.run | bash
You should add the code below to ~/.bashrc
by using your preferred editor.
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"
pyenv
builds Python from source. So you should install build dependencies. For more information, check Common build problems.
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl
Set the python 3.9.1 virtual environment.
$ pyenv install 3.9.1
$ pyenv virtualenv 3.9.1 lvmnps-with-3.9.1
$ pyenv local lvmnps-with-3.9.1
Install poetry and dependencies. For more information, check sdss/archon.
$ pip install poetry
$ python create_setup.py
$ pip install -e .
Start lvmnps
actor.
$ lvmnps start
In another terminal, type clu
and lvmnps ping
for test.
$ clu
lvmnps ping
07:41:22.636 lvmnps >
07:41:22.645 lvmnps : {
"text": "Pong."
}
Stop lvmnps
actor.
$ lvmnps stop
switches:
name_your_switch_here: # should be a unique name
type: dummy # currently dummy, iboot, dli
num: 8 # number of ports
ports:
1:
name: "skyw.pwi" # should also be a unique name
desc: "Something that make sense"
should_be_a_unique_name:
type: dummy
ports:
1:
name: "skye.pwi"
desc: "PlaneWavemount Skye"
-
if 'name' is not defined then the port name will be 'switch name'.'port number' eg nps_dummy_1.port1 otherwise 'name' from the config file will be used.
-
STATE: 1: ON, 0: OFF, -1: UNKNOWN
"STATUS": { "nps_dummy_1.port1": { "STATE": -1, "DESCR": "was 1", "SWITCH": "nps_dummy_1", "PORT": 1 },
#> cd lvmnps
#> poetry run lvmnps -vvv -c $(pwd)/python/lvmnps/etc/lvmnps_dummy.yml start
#> poetry run clu
-
status command without parameter returns all ports of all switches.
-
the default is to return only configured ports, otherwise define 'ouo' false in the config file, see lvmnps_dummy.yml
lvmnps status 12:02:08.649 lvmnps > 12:02:08.660 lvmnps i { "STATUS": { "nps_dummy_1.port1": { "STATE": -1, "DESCR": "was 1", "SWITCH": "nps_dummy_1", "PORT": 1 }, "skye.what.ever": { "STATE": -1, "DESCR": "whatever is connected to skye", "SWITCH": "nps_dummy_1", "PORT": 2 }, "skyw.what.ever": { "STATE": -1, "DESCR": "Something @ skyw", "SWITCH": "nps_dummy_1", "PORT": 4 }, "skye.pwi": { "STATE": -1, "DESCR": "PlaneWavemount Skye", "SWITCH": "skye.nps", "PORT": 1 }, "skyw.pwi": { "STATE": -1, "DESCR": "PlaneWavemount Skyw", "SWITCH": "nps_dummy_3", "PORT": 1 } } }
-
status command with port name skyw.what.ever
lvmnps status skyw.what.ever 12:07:12.349 lvmnps > 12:07:12.377 lvmnps i { "STATUS": { "skyw.what.ever": { "STATE": -1, "DESCR": "Something @ skyw", "SWITCH": "nps_dummy_1", "PORT": 4 }
-
status command with switch name nps_dummy_1
lvmnps status nps_dummy_1 12:07:12.349 lvmnps > 12:12:21.349 lvmnps i { "STATUS": { "nps_dummy_1.port1": { "STATE": -1, "DESCR": "was 1", "SWITCH": "nps_dummy_1", "PORT": 1 }, "skye.what.ever": { "STATE": -1, "DESCR": "whatever is connected to skye", "SWITCH": "nps_dummy_1", "PORT": 2 }, "skyw.what.ever": { "STATE": -1, "DESCR": "Something @ skyw", "SWITCH": "nps_dummy_1", "PORT": 4 } } }
-
status command with switch name nps_dummy_1 and port 4 returns
lvmnps status nps_dummy_1 4 12:07:12.349 lvmnps > 12:12:21.349 lvmnps i { "STATUS": { "skyw.what.ever": { "STATE": -1, "DESCR": "Something @ skyw", "SWITCH": "nps_dummy_1", "PORT": 4 } } }
-
the commands on and off use the same addressing scheme as status
poetry run pytest
poetry run pytest -p no:logging -s -vv