diff --git a/doc/20-library-reference.md b/doc/20-library-reference.md
index b3ed5b8de..22e695040 100644
--- a/doc/20-library-reference.md
+++ b/doc/20-library-reference.md
@@ -633,6 +633,14 @@ Signature:
Retrieves the value for the specified `key`. Returns `null` if they `key` does not exist
in the dictionary.
+### Dictionary#keys
+
+Signature:
+
+ function keys();
+
+Returns a list of keys for all items that are currently in the dictionary.
+
## Function type
### Function#call
diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp
index b10be389d..e2a3aa227 100644
--- a/lib/base/dictionary-script.cpp
+++ b/lib/base/dictionary-script.cpp
@@ -21,6 +21,9 @@
#include "base/function.hpp"
#include "base/functionwrapper.hpp"
#include "base/scriptframe.hpp"
+#include "base/array.hpp"
+#include "base/objectlock.hpp"
+#include
using namespace icinga;
@@ -66,6 +69,18 @@ static Dictionary::Ptr DictionaryClone(void)
return self->ShallowClone();
}
+static Array::Ptr DictionaryKeys(void)
+{
+ ScriptFrame *vframe = ScriptFrame::GetCurrentFrame();
+ Dictionary::Ptr self = static_cast(vframe->Self);
+ Array::Ptr keys = new Array();
+ ObjectLock olock(self);
+ BOOST_FOREACH(const Dictionary::Pair& kv, self) {
+ keys->Add(kv.first);
+ }
+ return keys;
+}
+
Object::Ptr Dictionary::GetPrototype(void)
{
static Dictionary::Ptr prototype;
@@ -78,6 +93,7 @@ Object::Ptr Dictionary::GetPrototype(void)
prototype->Set("remove", new Function(WrapFunction(DictionaryRemove)));
prototype->Set("contains", new Function(WrapFunction(DictionaryContains)));
prototype->Set("clone", new Function(WrapFunction(DictionaryClone)));
+ prototype->Set("keys", new Function(WrapFunction(DictionaryKeys)));
}
return prototype;