blob: cbe2cb1f4cf3d2a3ff75f13d7b39bf4129a59a44 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIBMINIFI_INCLUDE_C2_C2PAYLOAD_H_
#define LIBMINIFI_INCLUDE_C2_C2PAYLOAD_H_
#include <memory>
#include <string>
#include <map>
#include "core/state/UpdateController.h"
#include "core/state/Value.h"
namespace org {
namespace apache {
namespace nifi {
namespace minifi {
namespace c2 {
enum Operation {
ACKNOWLEDGE,
START,
STOP,
RESTART,
DESCRIBE,
HEARTBEAT,
UPDATE,
VALIDATE,
CLEAR,
TRANSFER
};
enum Direction {
TRANSMIT,
RECEIVE
};
class C2ContentResponse {
public:
C2ContentResponse(Operation op);
C2ContentResponse(const C2ContentResponse &other);
C2ContentResponse(const C2ContentResponse &&other);
C2ContentResponse & operator=(const C2ContentResponse &&other);
C2ContentResponse & operator=(const C2ContentResponse &other);
inline bool operator==(const C2ContentResponse &rhs) const {
if (op != rhs.op)
return false;
if (required != rhs.required)
return false;
if (ident != rhs.ident)
return false;
if (name != rhs.name)
return false;
if (operation_arguments != rhs.operation_arguments)
return false;
return true;
}
inline bool operator!=(const C2ContentResponse &rhs) const {
return !(*this == rhs);
}
Operation op;
// determines if the operation is required
bool required;
// identifier
std::string ident;
// delay before running
uint32_t delay;
// max time before this response will no longer be honored.
uint64_t ttl;
// name applied to commands
std::string name;
// commands that correspond with the operation.
std::map<std::string, state::response::ValueNode> operation_arguments;
// std::vector<std::string> content;
};
/**
* C2Payload is an update for the state manager.
* Note that the payload can either consist of other payloads or
* have content directly within it, represented by C2ContentResponse objects, above.
*
* Payloads can also contain raw data, which can be binary data.
*/
class C2Payload : public state::Update {
public:
virtual ~C2Payload() {
}
C2Payload(Operation op, std::string identifier, bool resp = false, bool isRaw = false);
C2Payload(Operation op, bool resp = false, bool isRaw = false);
C2Payload(Operation op, state::UpdateState state, bool resp = false, bool isRaw = false);
C2Payload(const C2Payload &other);
C2Payload(const C2Payload &&other);
void setIdentifier(const std::string &ident);
std::string getIdentifier() const;
void setLabel(const std::string label) {
label_ = label;
}
std::string getLabel() const {
return label_;
}
/**
* Gets the operation for this payload. May be nested or a single operation.
*/
Operation getOperation() const;
/**
* Validate the payload, if necessary and/or possible.
*/
virtual bool validate();
/**
* Get content responses from this payload.
*/
const std::vector<C2ContentResponse> &getContent() const;
/**
* Add a content response to this payload.
*/
void addContent(const C2ContentResponse &&content);
/**
* Determines if this object contains raw data.
*/
bool isRaw() const;
/**
* Sets raw data within this object.
*/
void setRawData(const std::string &data);
/**
* Sets raw data from a vector within this object.
*/
void setRawData(const std::vector<char> &data);
/**
* Sets raw data from a vector of uint8_t within this object.
*/
void setRawData(const std::vector<uint8_t> &data);
/**
* Returns raw data.
*/
std::vector<char> getRawData() const;
/**
* Add a nested payload.
* @param payload payload to move into this object.
*/
void addPayload(const C2Payload &&payload);
bool isContainer() const {
return is_container_;
}
void setContainer(bool is_container) {
is_container_ = is_container;
}
/**
* Get nested payloads.
*/
const std::vector<C2Payload> &getNestedPayloads() const;
C2Payload &operator=(const C2Payload &&other);
C2Payload &operator=(const C2Payload &other);
inline bool operator==(const C2Payload &rhs) const {
if (op_ != rhs.op_) {
return false;
}
if (ident_ != rhs.ident_) {
return false;
}
if (label_ != rhs.label_) {
return false;
}
if (payloads_ != rhs.payloads_) {
return false;
}
if (content_ != rhs.content_) {
return false;
}
if (raw_ != rhs.raw_) {
return false;
}
if (raw_data_ != rhs.raw_data_) {
return false;
}
return true;
}
inline bool operator!=(const C2Payload &rhs) const {
return !(*this == rhs);
}
protected:
// identifier for this payload.
std::string ident_;
std::string label_;
std::vector<C2Payload> payloads_;
std::vector<C2ContentResponse> content_;
Operation op_;
bool raw_;
std::vector<char> raw_data_;
bool isResponse;
bool is_container_;
};
} /* namesapce c2 */
} /* namespace minifi */
} /* namespace nifi */
} /* namespace apache */
} /* namespace org */
#endif /* LIBMINIFI_INCLUDE_C2_C2PAYLOAD_H_ */