예제 #1
0
파일: __init__.py 프로젝트: ess-dmsc/nicos
    def _handle_msg(self, time, ttlop, ttl, tsop, key, op, value):
        if key.startswith('watchdog/'):
            self._handle_control_msg(key, cache_load(value), time,
                                     op != OP_TELL)
            return

        key = key[len(self._prefix):].replace('/', '_').lower()

        # do we need the key for conditions?
        if key not in self._keymap:
            return
        expired = op == OP_TELLOLD or not value
        value = None if expired else cache_load(value)
        if not expired:
            self._keydict[key] = value
        else:
            self._keydict.pop(key, None)
        time = float(time)

        if self._process_updates:
            self._process_key(time, key, value)
예제 #2
0
 def _handle_msg(self, time, ttlop, ttl, tsop, key, op, value):
     if op != OP_TELL or not key.startswith(self._prefix):
         return
     key = key[len(self._prefix):]
     time = time and float(time)
     # self.log.info('got %s=%r', key, value)
     if key in self._handler.handlers:
         try:
             value = cache_load(value)
             self._handler.handlers[key](time, value)
         except Exception:
             self.log.exception('Error in handler for: %s=%r', key, value)
예제 #3
0
    def _handle_msg(self, time, ttlop, ttl, tsop, key, op, value):
        if op not in (OP_TELL, OP_TELLOLD):
            return
        if not key.startswith(self._prefix):
            for cb in self._prefixcallbacks:
                if key.startswith(cb):
                    if value is not None:
                        value = cache_load(value)
                    time = time and float(time)
                    try:
                        self._prefixcallbacks[cb](key, value, time,
                                                  op != OP_TELL)
                    except Exception:
                        self.log.warning('error in cache callback', exc=1)
            return
        key = key[len(self._prefix):]
        time = time and float(time)

        # ignore outdated 'updates'
        db_time = self._db.get(key, (0, 0))[1]
        if db_time > time:
            self.log.debug('ignoring outdated update for %s: %gs too old', key,
                           db_time - time)
            return

        self._propagate((time, key, op, value))
        # self.log.debug('got %s=%s', key, value)
        if not value or op == OP_TELLOLD:
            with self._dblock:
                self._db.pop(key, None)
        else:
            value = cache_load(value)
            with self._dblock:
                self._db[key] = (value, time)
            if self._do_callbacks:
                if key in self._callbacks:
                    self._call_callbacks(key, value, time)
                if key.endswith('/value') and session.experiment:
                    session.experiment.data.cacheCallback(key, value, time)
예제 #4
0
 def _processQueue(self):
     while True:
         name, value, status, timestamp = self._queue.get()
         try:
             # Convert value from string to correct type
             value = cache_load(value)
             if not isinstance(value, str):
                 # Policy decision: don't send strings via f142
                 buffer = to_f142(name, value, status, timestamp)
                 self._send_to_kafka(buffer)
         except Exception as error:
             self.log.error('Could not forward data: %s', error)
         self._queue.task_done()
예제 #5
0
 def history(self, dev, key, fromtime, totime):
     """History query: opens a separate connection since it is otherwise not
     possible to determine which response lines belong to it.
     """
     if dev:
         key = ('%s/%s' % (dev, key)).lower()
     tosend = '%r-%r@%s%s%s\n###?\n' % (fromtime, totime, self._prefix, key,
                                        OP_ASK)
     ret = []
     for msgmatch in self._single_request(tosend, b'###!\n', sync=False):
         # process data
         time, value = msgmatch.group('time'), msgmatch.group('value')
         if time is None:
             break  # it's the '###' value
         if value:
             ret.append((float(time), cache_load(value)))
     return ret
예제 #6
0
 def get_explicit(self, dev, key, default=None):
     """Get a value from the cache server, bypassing the local cache.  This
     is needed if the current update time and ttl is required.
     """
     if dev:
         key = ('%s/%s' % (dev, key)).lower()
     tosend = '@%s%s%s\n' % (self._prefix, key, OP_ASK)
     for msgmatch in self._single_request(tosend):
         if msgmatch.group('tsop') is None:
             raise CacheError('Cache did not send timestamp info')
         time, ttl, value = msgmatch.group('time'), msgmatch.group('ttl'), \
             msgmatch.group('value')
         # self.log.debug('get_explicit: %.2f %.2f %r', time, ttl, value)
         if value:
             return (time and float(time), ttl
                     and float(ttl), cache_load(value))
         return (time and float(time), ttl and float(ttl), default)
     return (None, None, default)  # shouldn't happen
예제 #7
0
 def getValue(self):
     return cache_load(self.text())
예제 #8
0
 def on_client_cache(self, data):
     (time, key, op, value) = data
     if '/' not in key:
         return
     ldevname, subkey = key.rsplit('/', 1)
     if ldevname not in self._devinfo:
         return
     if ldevname in self._control_dialogs:
         self._control_dialogs[ldevname].on_cache(subkey, value)
     devitem = self._devitems[ldevname]
     devinfo = self._devinfo[ldevname]
     if subkey == 'value':
         if time < devinfo.valtime:
             return
         if not value:
             fvalue = ''
         else:
             fvalue = cache_load(value)
             if isinstance(fvalue, list):
                 fvalue = tuple(fvalue)
         devinfo.value = fvalue
         devinfo.expired = op != OP_TELL
         devinfo.valtime = time
         fmted = devinfo.fmtValUnit()
         devitem.setText(1, fmted)
         if ldevname in self._control_dialogs:
             self._control_dialogs[ldevname].valuelabel.setText(fmted)
         devitem.setForeground(1, valueBrush[devinfo.expired,
                                             devinfo.fixed])
         if not devitem.parent().isExpanded():
             if ldevname == devitem.parent().representative:
                 devitem.parent().setText(1, fmted)
     elif subkey == 'status':
         if time < devinfo.stattime:
             return
         if not value:
             status = (UNKNOWN, '?')
         else:
             status = cache_load(value)
         devinfo.status = status
         devinfo.stattime = time
         devitem.setText(2, str(status[1]))
         if status[0] not in self.statusIcon:
             # old or wrong status constant
             return
         if self.useicons:
             devitem.setIcon(0, self.statusIcon[status[0]])
             devitem.setForeground(2, foregroundBrush[status[0]])
             devitem.setBackground(2, backgroundBrush[status[0]])
         else:
             devitem.setForeground(0, foregroundBrush[BUSY])
             devitem.setBackground(0, backgroundBrush[status[0]])
         if not devitem.parent().isExpanded():
             item = devitem.parent()
             item.setBackground(
                 0, backgroundBrush[self._getHighestStatus(item)])
         else:
             devitem.parent().setBackground(0, backgroundBrush[OK])
         if ldevname in self._control_dialogs:
             dlg = self._control_dialogs[ldevname]
             dlg.statuslabel.setText(status[1])
             dlg.statusimage.setPixmap(self.statusIcon[status[0]].pixmap(
                 16, 16))
             setForegroundBrush(dlg.statuslabel, foregroundBrush[status[0]])
             setBackgroundBrush(dlg.statuslabel, backgroundBrush[status[0]])
     elif subkey == 'fmtstr':
         if not value:
             return
         devinfo.fmtstr = cache_load(value)
         devitem.setText(1, devinfo.fmtValUnit())
     elif subkey == 'unit':
         if not value:
             value = "''"
         devinfo.unit = cache_load(value)
         devitem.setText(1, devinfo.fmtValUnit())
     elif subkey == 'fixed':
         if not value:
             value = "''"
         devinfo.fixed = bool(cache_load(value))
         devitem.setForeground(1, valueBrush[devinfo.expired,
                                             devinfo.fixed])
         if ldevname in self._control_dialogs:
             dlg = self._control_dialogs[ldevname]
             if dlg.moveBtn:
                 dlg.moveBtn.setEnabled(not devinfo.fixed)
                 dlg.moveBtn.setText(devinfo.fixed and '(fixed)' or 'Move')
     elif subkey == 'userlimits':
         if not value:
             return
         value = cache_load(value)
         if ldevname in self._control_dialogs:
             dlg = self._control_dialogs[ldevname]
             dlg.limitMin.setText(str(value[0]))
             dlg.limitMax.setText(str(value[1]))
     elif subkey == 'classes':
         if not value:
             value = "[]"
         devinfo.classes = set(cache_load(value))
     elif subkey == 'alias':
         if not value:
             return
         if ldevname in self._control_dialogs:
             dlg = self._control_dialogs[ldevname]
             dlg._reinit()
     elif subkey == 'description':
         devitem.setToolTip(0, cache_load(value or "''"))
     if subkey in self.param_display.get(ldevname, ()):
         if not devinfo.params:
             devinfo.params = self.client.getDeviceParamInfo(devinfo.name)
         value = devinfo.fmtParam(subkey, cache_load(value))
         if subkey not in self._devparamitems.setdefault(ldevname, {}):
             devitem = self._devitems[ldevname]
             self._devparamitems[ldevname][subkey] = \
                 QTreeWidgetItem(devitem, [subkey, value, ''], PARAM_TYPE)
             devitem.setExpanded(True)
         else:
             self._devparamitems[ldevname][subkey].setText(1, value)
예제 #9
0
파일: psession.py 프로젝트: ess-dmsc/nicos
 def _propagate(self, args):
     time, key, op, value = args
     if op == OP_TELL and key in self._callbacks and value:
         self._call_callbacks(key, cache_load(value), time)
예제 #10
0
 def on_client_cache(self, data):
     (_, key, _, value) = data
     if key == 'opmode/value' and value:
         self._curmode = cache_load(value)
예제 #11
0
 def on_client_cache(self, data):
     _time, key, _op, value = data
     if key == 'exp/action':
         self.curstatus.setText(cache_load(value) or 'Idle')
예제 #12
0
 def on_client_cache(self, data):
     _time, key, _op, value = data
     if key == 'psd_channel/_foildata':
         self._data = cache_load(value)
         self.do_update()