'sends alert to output handler
typically self.alert will be called with the decoded data and the packet/connection info dict last, as follows:
self.alert(alert_arg,alert_arg2...,alert_data=value,alert_data2=value2....,**conn/pkt.info())
example: self.alert(decoded_data,conn.info(),blob.info()) [blob info overrides conn info]
this will pass all information about the decoder, the connection, and the specific event up to the output module
if a positional arg is a dict, it updates the kwargs
if an arg is a list, it extends the arg list
else it is appended to the arg list
all arguments are optional, at the very least you want to pass the **pkt/conn.info() so all traffic info is available.
output modules handle this data as follows:
- the name of the alerting decoder is available in the "decoder" field
- all non-keyword arguments will be concatenated into the "data" field
- keyword arguments, including all provided by .info() will be used to populate matching fields
- remaining keyword arguments that do not match fields will be represented by "key=value" strings
concatenated together into the "extra" field'

def alert(self, *args, **kw):

    oargs = []
    for a in args:
        if (type(a) == dict):
            kw.update(a)
        elif (type(a) == list):
            oargs.extend(a)
        else:
            oargs.append(a)
    if ('decoder' not in kw):
        kw['decoder'] = self.name
    self.out.alert(*oargs, **kw)
