summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hscript/meta.cc18
-rw-r--r--hscript/meta.hh10
-rw-r--r--hscript/script.cc7
-rw-r--r--hscript/script_i.hh15
-rw-r--r--hscript/script_v.cc26
5 files changed, 63 insertions, 13 deletions
diff --git a/hscript/meta.cc b/hscript/meta.cc
index fd3e69b..ab8bdb5 100644
--- a/hscript/meta.cc
+++ b/hscript/meta.cc
@@ -655,3 +655,21 @@ bool SvcEnable::execute() const {
#endif /* HAS_INSTALL_ENV */
return true; /* LCOV_EXCL_LINE */
}
+
+Key *Version::parseFromData(const std::string &data,
+ const ScriptLocation &pos, int *errors, int *,
+ const Script *script) {
+ const static std::string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.-_";
+
+ if(data.find_first_not_of(valid_chars) != std::string::npos) {
+ if(errors) *errors += 1;
+ output_error(pos, "version: invalid version", data);
+ return nullptr;
+ }
+
+ return new Version(script, pos, data);
+}
+
+bool Version::execute() const {
+ return true;
+}
diff --git a/hscript/meta.hh b/hscript/meta.hh
index b885e99..ab22f1f 100644
--- a/hscript/meta.hh
+++ b/hscript/meta.hh
@@ -128,6 +128,16 @@ public:
bool execute() const override;
};
+class Version : public StringKey {
+private:
+ Version(const Script *_s, const ScriptLocation &_p, const std::string &_v) :
+ StringKey(_s, _p, _v) {}
+public:
+ static Key *parseFromData(const std::string &, const ScriptLocation &,
+ int *, int *, const Script *);
+ bool execute() const override;
+};
+
}
}
diff --git a/hscript/script.cc b/hscript/script.cc
index a3fb512..8fc15f7 100644
--- a/hscript/script.cc
+++ b/hscript/script.cc
@@ -51,6 +51,7 @@ const std::map<std::string, key_parse_fn> valid_keys = {
{"repository", &Repository::parseFromData},
{"signingkey", &SigningKey::parseFromData},
{"svcenable", &SvcEnable::parseFromData},
+ {"version", &Version::parseFromData},
{"netconfigtype", &NetConfigType::parseFromData},
{"netaddress", &NetAddress::parseFromData},
@@ -122,6 +123,8 @@ bool Script::ScriptPrivate::store_key(const std::string &key_name, Key *obj,
return true;
} else if(key_name == "svcenable") {
return store_svcenable(obj, pos, errors, warnings, opts);
+ } else if(key_name == "version") {
+ return store_version(obj, pos, errors, warnings, opts);
} else if(key_name == "username") {
return store_username(obj, pos, errors, warnings, opts);
} else if(key_name == "useralias") {
@@ -381,6 +384,8 @@ const Keys::Key *Script::getOneValue(std::string name) const {
return this->internal->lang.get();
} else if(name == "keymap") {
return this->internal->keymap.get();
+ } else if(name == "version") {
+ return this->internal->version.get();
} else if(name == "firmware") {
#ifdef NON_LIBRE_FIRMWARE
return this->internal->firmware.get();
@@ -410,6 +415,8 @@ const std::vector<Keys::Key *> Script::getValues(std::string name) const {
for(auto &repo : this->internal->repos) values.push_back(repo.get());
} else if(name == "signing_key") {
for(auto &key : this->internal->repo_keys) values.push_back(key.get());
+ } else if(name == "svcenable") {
+ for(auto &svc : this->internal->svcs_enable) values.push_back(svc.get());
} else if(name == "username" || name == "useralias" || name == "userpw" ||
name == "usericon" || name == "usergroups") {
/* XXX */
diff --git a/hscript/script_i.hh b/hscript/script_i.hh
index 2a86d71..b219579 100644
--- a/hscript/script_i.hh
+++ b/hscript/script_i.hh
@@ -3,7 +3,7 @@
* libhscript, the HorizonScript library for
* Project Horizon
*
- * Copyright (c) 2019 Adélie Linux and contributors. All rights reserved.
+ * Copyright (c) 2019-2020 Adélie Linux and contributors. All rights reserved.
* This code is licensed under the AGPL 3.0 license, as noted in the
* LICENSE-code file in the root directory of this repository.
*
@@ -61,6 +61,8 @@ struct Script::ScriptPrivate {
std::unique_ptr<Keymap> keymap;
/*! The system timezone. */
std::unique_ptr<Timezone> tzone;
+ /*! The version of Adélie to install. */
+ std::unique_ptr<Version> version;
/*! Network addressing configuration */
std::vector< std::unique_ptr<NetAddress> > addresses;
@@ -264,6 +266,17 @@ struct Script::ScriptPrivate {
return true;
}
+ bool store_version(Key *obj, const ScriptLocation &pos, int *errors, int *,
+ const ScriptOptions &) {
+ if(version) {
+ DUPLICATE_ERROR(version, "version", version->value())
+ return false;
+ }
+ std::unique_ptr<Version> v(dynamic_cast<Version *>(obj));
+ version = std::move(v);
+ return true;
+ }
+
bool store_username(Key *obj, const ScriptLocation &pos, int *errors, int *,
const ScriptOptions &) {
if(accounts.size() >= 255) {
diff --git a/hscript/script_v.cc b/hscript/script_v.cc
index b91af8d..173bb50 100644
--- a/hscript/script_v.cc
+++ b/hscript/script_v.cc
@@ -107,11 +107,16 @@ int validate_one_account(const std::string &name, UserDetail *detail) {
*/
bool add_default_repos(std::vector<std::unique_ptr<Repository>> &repos,
const Script *s, bool firmware = false) {
+ std::string base_url = "https://distfiles.adelielinux.org/adelie/";
+ const ScriptLocation p{"internal", 0};
+ const Key *ver = s->getOneValue("version");
+ if(ver != nullptr) {
+ base_url += dynamic_cast<const StringKey *>(ver)->value() + "/";
+ } else {
+ base_url += "stable/";
+ }
Repository *sys_key = dynamic_cast<Repository *>(
- Repository::parseFromData(
- "https://distfiles.adelielinux.org/adelie/stable/system", {"", 0},
- nullptr, nullptr, s
- )
+ Repository::parseFromData(base_url + "system", p, nullptr, nullptr, s)
);
if(!sys_key) {
output_error("internal", "failed to create default system repository");
@@ -120,10 +125,7 @@ bool add_default_repos(std::vector<std::unique_ptr<Repository>> &repos,
std::unique_ptr<Repository> sys_repo(sys_key);
repos.push_back(std::move(sys_repo));
Repository *user_key = dynamic_cast<Repository *>(
- Repository::parseFromData(
- "https://distfiles.adelielinux.org/adelie/stable/user", {"", 0},
- nullptr, nullptr, s
- )
+ Repository::parseFromData(base_url + "user", p, nullptr, nullptr, s)
);
if(!user_key) {
output_error("internal", "failed to create default user repository");
@@ -138,7 +140,7 @@ bool add_default_repos(std::vector<std::unique_ptr<Repository>> &repos,
Repository *fw_key = dynamic_cast<Repository *>(
Repository::parseFromData(
"https://distfiles.apkfission.net/adelie-stable/nonfree",
- 0, nullptr, nullptr, s
+ {"internal", 0}, nullptr, nullptr, s
)
);
if(!fw_key) {
@@ -163,8 +165,8 @@ bool add_default_repo_keys(std::vector<std::unique_ptr<SigningKey>> &keys,
const Script *s, bool firmware = false) {
SigningKey *key = dynamic_cast<SigningKey *>(
SigningKey::parseFromData(
- "/etc/apk/keys/packages@adelielinux.org.pub", {"", 0},
- nullptr, nullptr, s)
+ "/etc/apk/keys/packages@adelielinux.org.pub",
+ {"internal", 0}, nullptr, nullptr, s)
);
if(!key) {
output_error("internal", "failed to create default repository signing key");
@@ -178,7 +180,7 @@ bool add_default_repo_keys(std::vector<std::unique_ptr<SigningKey>> &keys,
if(firmware) {
SigningKey *fkey = dynamic_cast<SigningKey *>(SigningKey::parseFromData(
"/etc/apk/keys/packages@pleroma.apkfission.net-5ac0b300.rsa.pub",
- {"", 0}, nullptr, nullptr, s)
+ {"internal", 0}, nullptr, nullptr, s)
);
if(!fkey) {
output_error("internal", "failed to create firmware signing key");