if (is_blacklisted(pl_name, blacklist, whitelist)) { ROS_INFO_STREAM("Plugin " << pl_name << " blacklisted"); return; } try { auto plugin = plugin_loader.createInstance(pl_name); ROS_INFO_STREAM("Plugin " << pl_name << " loaded"); for (auto &info : plugin->get_subscriptions()) { auto msgid = std::get<0>(info); auto msgname = std::get<1>(info); auto type_hash_ = std::get<2>(info); std::string log_msgname; if (is_mavlink_message_t(type_hash_)) log_msgname = utils::format("MSG-ID (%u) <%zu>", msgid, type_hash_); else log_msgname = utils::format("%s (%u) <%zu>", msgname, msgid, type_hash_); ROS_DEBUG_STREAM("Route " << log_msgname << " to " << pl_name); auto it = plugin_subscriptions.find(msgid); if (it == plugin_subscriptions.end()) { // new entry ROS_DEBUG_STREAM(log_msgname << " - new element"); plugin_subscriptions[msgid] = PluginBase::Subscriptions{{info}}; } else { // existing: check handler message type bool append_allowed = is_mavlink_message_t(type_hash_); if (!append_allowed) { append_allowed = true; for (auto &e : it->second) { auto t2 = std::get<2>(e); if (!is_mavlink_message_t(t2) && t2 != type_hash_) { ROS_ERROR_STREAM(log_msgname << " routed to different message type (hash: " << t2 << ")"); append_allowed = false; } } } if (append_allowed) { ROS_DEBUG_STREAM(log_msgname << " - emplace"); it->second.emplace_back(info); } else ROS_ERROR_STREAM(log_msgname << " handler dropped because this ID are used for another message type"); } } plugin->initialize(mav_uas); loaded_plugins.push_back(plugin); ROS_INFO_STREAM("Plugin " << pl_name << " initialized"); } catch (pluginlib::PluginlibException &ex) { ROS_ERROR_STREAM("Plugin " << pl_name << " load exception: " << ex.what()); } }
时间: 2023-06-16 10:03:15 浏览: 163
这是一段C++代码,用于加载和初始化插件,并将其与消息路由器相关联。首先,它使用“is_blacklisted”函数检查插件是否在黑名单或白名单中。如果插件在黑名单中,则不会加载。然后,它使用“plugin_loader”对象创建插件实例,并调用“get_subscriptions”函数获取插件支持的订阅消息类型。对于每个订阅类型,它将其与插件名称相关联,并将其添加到“plugin_subscriptions”映射中。如果消息ID已经存在于“plugin_subscriptions”中,则会检查处理程序的消息类型是否与现有类型匹配。如果匹配,则将处理程序添加到现有消息ID的列表中。如果不匹配,则会记录错误消息并跳过处理程序。最后,它调用“initialize”函数初始化插件,并将其添加到“loaded_plugins”列表中。
相关问题
shell每分钟执行一次,当检测到有ip,每分钟访问次数超过200,将该ip加入黑名单,并在 /tmp/blacklist
.txt 中记录该ip地址。
首先,我们需要创建一个脚本,用于检测日志中的IP地址访问次数,并在需要时将其添加到黑名单文件中。以下是一个可能的实现:
```
#!/bin/bash
# 设置阈值
THRESHOLD=200
# 日志文件路径
LOG_FILE=/var/log/access.log
# 黑名单文件路径
BLACKLIST_FILE=/tmp/blacklist.txt
# 获取当前时间
now=$(date +"%Y-%m-%d %T")
# 统计访问次数大于阈值的IP地址
ip_list=$(awk '{print $1}' ${LOG_FILE} | sort | uniq -c | awk -v threshold=$THRESHOLD '$1 > threshold {print $2}')
# 遍历IP地址列表
for ip in ${ip_list}; do
# 在黑名单文件中查找IP地址
if grep -q "${ip}" "${BLACKLIST_FILE}"; then
echo "${now}: ${ip} is already blacklisted."
else
# 将IP地址添加到黑名单文件中
echo "${ip}" >> "${BLACKLIST_FILE}"
echo "${now}: ${ip} is added to blacklist."
fi
done
```
上述脚本会读取指定的访问日志文件中的IP地址,并统计每个IP地址出现的次数。然后,它会检查访问次数是否超过了给定的阈值,并将访问次数超过阈值的IP地址加入到指定的黑名单文件中。
脚本中的阈值、日志文件路径和黑名单文件路径都可以根据实际需要进行修改。
要让这个脚本每分钟自动执行,我们需要使用 cron 工具。可以使用以下命令编辑 cron 表:
```
crontab -e
```
然后,在文件末尾添加以下行:
```
* * * * * /path/to/script.sh
```
这会让 cron 每分钟执行一次脚本。请将 `/path/to/script.sh` 替换为实际脚本文件的路径。
需要注意的是,如果您是在 Windows 环境下编写脚本,则需要将脚本保存为 UNIX 格式,并确保脚本文件的权限为可执行。这可以通过以下命令完成:
```
dos2unix /path/to/script.sh
chmod +x /path/to/script.sh
```
现在,每当脚本检测到访问次数超过200的IP地址,它会将其添加到黑名单文件中,并在 /tmp/blacklist.txt 中记录该ip地址。
编写Spark Streaming程序来模拟实时过滤黑名单,即自定义一份包含黑名单的列表,列表中每一条数据由两部分组成,前一部分为单词,后一部分表示该单词是否为黑名单,true表示是,false表示否。如(hadoop true)、(flume false)等,在定义该黑名单的基础上,创建Kafka数据源,topic为“blacklist”,然后编写生产者程序用于产生若干数据,而消费者程序则对生产者产生的数据进行黑名单过滤,并将结果存入到文本文件。
下面是一个可能的Spark Streaming程序,可以实现实时过滤黑名单:
```scala
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.kafka._
import org.apache.kafka.common.serialization.StringDeserializer
object BlacklistFilter {
def main(args: Array[String]) {
val sparkConf = new SparkConf().setAppName("BlacklistFilter")
val ssc = new StreamingContext(sparkConf, Seconds(5))
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "localhost:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "blacklist-filter-group",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics = Array("blacklist")
val messages = KafkaUtils.createDirectStream[String, String](
ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)
val blacklist = Set("hadoop", "spark", "flume")
val filteredMessages = messages.filter { case (_, value) =>
val parts = value.split(" ")
val word = parts(0)
val isBlacklisted = parts(1).toBoolean
!(isBlacklisted && blacklist.contains(word))
}
filteredMessages.map(_._2).saveAsTextFiles("output/blacklist")
ssc.start()
ssc.awaitTermination()
}
}
```
这个程序首先创建了一个 `StreamingContext`,并指定了每5秒接收一次数据。然后定义了 Kafka 的相关参数,并创建了一个 Kafka 数据源。接下来定义了黑名单列表,并在过滤函数中使用该列表过滤掉了所有黑名单中的单词。最后将过滤后的数据保存到文本文件中。
需要注意的是,本程序中使用了 Kafka 的直接消费者模式,需要确保 `auto.offset.reset` 参数设置为 `latest`,否则可能会出现消费数据重复或漏消费的情况。同时,本程序中的黑名单列表是硬编码在程序中的,实际应用中可能需要从外部数据源加载黑名单列表,以便更灵活地更新黑名单。
阅读全文