summaryrefslogtreecommitdiff
path: root/hscript
diff options
context:
space:
mode:
Diffstat (limited to 'hscript')
-rw-r--r--hscript/network.cc47
-rw-r--r--hscript/network.hh7
-rw-r--r--hscript/script.cc12
3 files changed, 65 insertions, 1 deletions
diff --git a/hscript/network.cc b/hscript/network.cc
index 3816415..2f4111e 100644
--- a/hscript/network.cc
+++ b/hscript/network.cc
@@ -28,6 +28,7 @@
using namespace Horizon::Keys;
+
Key *Network::parseFromData(const std::string &data, int lineno, int *errors,
int *) {
bool value;
@@ -303,6 +304,52 @@ bool NetAddress::execute(ScriptOptions) const {
}
+Key *Nameserver::parseFromData(const std::string &data, int lineno,
+ int *errors, int *) {
+ char addr_buf[16];
+ static const std::string valid_chars("1234567890ABCDEFabcdef:.");
+
+ if(data.find_first_not_of(valid_chars) != std::string::npos) {
+ if(errors) *errors += 0;
+ output_error("installfile:" + std::to_string(lineno),
+ "nameserver: expected an IP address");
+ if(data.find_first_of("[]") != std::string::npos) {
+ output_info("installfile:" + std::to_string(lineno),
+ "nameserver: hint: you don't have to enclose IPv6 "
+ "addresses in [] brackets");
+ }
+ return nullptr;
+ }
+
+ if(data.find(':') != std::string::npos) {
+ /* IPv6 */
+ if(::inet_pton(AF_INET6, data.c_str(), &addr_buf) != 1) {
+ if(errors) *errors += 1;
+ output_error("installfile:" + std::to_string(lineno),
+ "nameserver: '" + data + "' is not a valid IPv6 "
+ "address", "hint: a ':' was found, so an IPv6 "
+ "address was expected");
+ return nullptr;
+ }
+ } else {
+ /* IPv4 */
+ if(::inet_pton(AF_INET, data.c_str(), &addr_buf) != 1) {
+ if(errors) *errors += 1;
+ output_error("installfile:" + std::to_string(lineno),
+ "nameserver: '" + data + "' is not a valid IPv4 "
+ "address");
+ return nullptr;
+ }
+ }
+
+ return new Nameserver(lineno, data);
+}
+
+bool Nameserver::execute(ScriptOptions) const {
+ return false;
+}
+
+
Key *NetSSID::parseFromData(const std::string &data, int lineno, int *errors,
int *) {
std::string iface, ssid, secstr, passphrase;
diff --git a/hscript/network.hh b/hscript/network.hh
index 411f4b3..b556ab8 100644
--- a/hscript/network.hh
+++ b/hscript/network.hh
@@ -69,7 +69,12 @@ public:
bool execute(ScriptOptions) const override;
};
-class Nameserver : public Key {
+class Nameserver : public StringKey {
+private:
+ Nameserver(int _line, const std::string &ns) : StringKey(_line, ns) {}
+public:
+ static Key *parseFromData(const std::string &, int, int *, int *);
+ bool execute(ScriptOptions) const override;
};
class NetSSID : public Key {
diff --git a/hscript/script.cc b/hscript/script.cc
index c99abe5..6ede4c4 100644
--- a/hscript/script.cc
+++ b/hscript/script.cc
@@ -98,6 +98,7 @@ struct Script::ScriptPrivate {
/*! Network addressing configuration */
std::vector< std::unique_ptr<NetAddress> > addresses;
+ std::vector< std::unique_ptr<Nameserver> > nses;
std::vector< std::unique_ptr<NetSSID> > ssids;
/*! APK repositories */
@@ -142,6 +143,10 @@ struct Script::ScriptPrivate {
std::unique_ptr<NetAddress> addr(dynamic_cast<NetAddress *>(obj));
this->addresses.push_back(std::move(addr));
return true;
+ } else if(key_name == "nameserver") {
+ std::unique_ptr<Nameserver> ns(dynamic_cast<Nameserver *>(obj));
+ this->nses.push_back(std::move(ns));
+ return true;
} else if(key_name == "netssid") {
std::unique_ptr<NetSSID> ssid(dynamic_cast<NetSSID *>(obj));
this->ssids.push_back(std::move(ssid));
@@ -730,6 +735,13 @@ bool Script::validate() const {
}
}
+ /* REQ: Runner.Validate.nameserver */
+ for(auto &ns : this->internal->nses) {
+ if(!ns->validate(this->opts)) {
+ failures++;
+ }
+ }
+
/* REQ: Runner.Validate.network.netssid */
for(auto &ssid : this->internal->ssids) {
if(!ssid->validate(this->opts)) {