-
Notifications
You must be signed in to change notification settings - Fork 0
/
Victor.py
135 lines (110 loc) · 4.6 KB
/
Victor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -*- coding: utf-8 -*-
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Created on 25 May 2018
#
# @author: rhamilton
from __future__ import division, print_function, absolute_import
import os
import sys
import time
from uuid import uuid4
from ligmos.workers import workerSetup, connSetup
from ligmos.utils import amqListeners as amql
from ligmos.utils import amq, common, classes, confparsers
from mrfreeze import publishers
def main():
"""
"""
# Define the default files we'll use/look for. These are passed to
# the worker constructor (toServeMan).
devices = './config/victor.conf'
deviceconf = classes.instrumentDeviceTarget
passes = './config/passwords.conf'
logfile = './mrfreeze_victor.log'
desc = "Victor: The Cruel Master of the Cold Stuff"
eargs = None
logenable = False
# Interval between successive runs of the polling loop (seconds)
bigsleep = 1
# config: dictionary of parsed config file
# comm: common block from config file
# args: parsed options
# runner: class that contains logic to quit nicely
config, comm, _, runner = workerSetup.toServeMan(devices,
passes,
logfile,
desc=desc,
extraargs=eargs,
conftype=deviceconf,
enableCheck=False,
logfile=logenable)
# Get this PID for diagnostics
pid = os.getpid()
# Print the preamble of this particular instance
# (helpful to find starts/restarts when scanning thru logs)
common.printPreamble(pid, config)
# Reorganize the configuration to be per-instrument so it's a little
# easier to loop over and do other stuff with
allInsts = confparsers.regroupConfig(config, groupKey='instrument',
ekeys=['devtype', 'extratag'],
delim="+")
print("Config:")
print(allInsts)
# Check to see if there are any connections/objects to establish
idbs = connSetup.connIDB(comm)
# Specify our custom listener that will really do all the work
# Since we're hardcoding for the DCTConsumer anyways, I'll take
# a bit shortcut and hardcode for the DCT influx database.
# Someone more clever than I can clean up.
db = idbs['database-primary']
amqlistener = amql.ParrotSubscriber(dictify=False)
amqtopics = amq.getAllTopics(config, comm, queuerole='client')
amqs = connSetup.connAMQ(comm, amqtopics, amqlistener=amqlistener)
# Just hardcode this for now. It's a prototype!
conn = amqs['broker-primary'][0]
queue = comm['queue-mrfreeze']
# Semi-infinite loop
while runner.halt is False:
# Check on our connections
amqs = amq.checkConnections(amqs, subscribe=True)
# Make sure we update our hardcoded reference
conn = amqs['broker-primary'][0]
# Testing!
cmd_id = str(uuid4())
cmd = 'advertise'
inst = 'all'
devicetype = 'all'
tag = None
value = None
cmdpak = publishers.constructCommand(inst, devicetype,
tag, cmd,
value=value,
cmd_id=cmd_id,
debug=True)
conn.publish(queue.cmdtopic, cmdpak)
# Consider taking a big nap
if runner.halt is False:
print("Starting a big sleep")
# Sleep for bigsleep, but in small chunks to check abort
for _ in range(bigsleep):
time.sleep(1)
if runner.halt is True:
break
# Testing!
break
# The above loop is exited when someone sends SIGTERM
print("PID %d is now out of here!" % (pid))
# Disconnect from all ActiveMQ brokers
amq.disconnectAll(amqs)
# The PID file will have already been either deleted/overwritten by
# another function/process by this point, so just give back the
# console and return STDOUT and STDERR to their system defaults
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
print("STDOUT and STDERR reset.")
if __name__ == "__main__":
main()