diff options
Diffstat (limited to 'hscript/script.cc')
-rw-r--r-- | hscript/script.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/hscript/script.cc b/hscript/script.cc index 785e40e..ee638bb 100644 --- a/hscript/script.cc +++ b/hscript/script.cc @@ -103,6 +103,8 @@ struct Script::ScriptPrivate { /*! Disk identification keys */ std::vector< std::unique_ptr<DiskId> > diskids; + /*! Disklabel configuration keys */ + std::vector< std::unique_ptr<DiskLabel> > disklabels; /*! Target system's mountpoints. */ std::vector< std::unique_ptr<Mount> > mounts; @@ -157,6 +159,10 @@ struct Script::ScriptPrivate { std::unique_ptr<DiskId> diskid(dynamic_cast<DiskId *>(obj)); this->diskids.push_back(std::move(diskid)); return true; + } else if(key_name == "disklabel") { + std::unique_ptr<DiskLabel> l(dynamic_cast<DiskLabel *>(obj)); + this->disklabels.push_back(std::move(l)); + return true; } else if(key_name == "mount") { std::unique_ptr<Mount> mount(dynamic_cast<Mount *>(obj)); this->mounts.push_back(std::move(mount)); @@ -496,7 +502,7 @@ const Script *Script::load(std::istream &sstream, bool Script::validate() const { int failures = 0; - std::set<std::string> seen_diskids, seen_mounts; + std::set<std::string> seen_diskids, seen_labels, seen_mounts; std::map<const std::string, int> seen_iface; /* REQ: Runner.Validate.network */ @@ -698,6 +704,23 @@ bool Script::validate() const { seen_diskids.insert(diskid->device()); } + /* REQ: Runner.Validate.disklabel */ + for(auto &label : this->internal->disklabels) { + if(!label->validate(this->opts)) { + failures++; + continue; + } + + /* REQ: Runner.Validate.disklabel.Unique */ + if(seen_labels.find(label->device()) != seen_labels.end()) { + failures++; + output_error("installfile:" + std::to_string(label->lineno()), + "disklabel: device " + label->device() + + " already has a label queued"); + } + seen_labels.insert(label->device()); + } + /* REQ: Runner.Validate.mount */ for(auto &mount : this->internal->mounts) { if(!mount->validate(this->opts)) { |