Start working on basic package framework.

This commit is contained in:
2023-10-23 22:17:05 -07:00
parent c1629dda81
commit 4f7c5519e2
12 changed files with 348 additions and 17 deletions

View File

@@ -5,37 +5,164 @@
/// \brief Packaging tools for shimmering-clarity.
///
#include <filesystem>
#include <iostream>
#include <string>
#include <scsl/Commander.h>
#include <scsl/Flag.h>
#include <scsl/Flags.h>
#include <scsl/SimpleConfig.h>
static struct {
scsl::Flags *flags;
std::string owner;
std::string distribution;
std::string component;
std::string password;
std::string username;
std::string version;
} config;
void
usage(std::ostream &outs, int exc)
{
outs << "sc3dev-packager: manage packages on gitea\n";
outs << "usage:\n";
outs << "\tsc3dev-packager [--component component] [--owner owner] \n";
outs << "\t\t[--distribution distribution] debian command packages ...\n";
outs << "\tsc3dev-packager [--owner owner] generic command packages ...\n";
outs << "\nCommands:\n";
outs << "\t- delete: remove a package\n";
outs << "\t- put: upload a package\n";
exit(exc);
}
std::string
getDefaultConfigFile()
{
auto userEnv = getenv("USER");
auto user = std::string(userEnv);
if (user == "root") {
return std::filesystem::path("/etc/sc3dev/packager.conf");
}
if (user.empty()) {
return "";
}
userEnv = getenv("HOME");
auto userHome = std::filesystem::path(userEnv);
userHome /= std::filesystem::path(".config");
userHome /= std::filesystem::path("sc3dev-packager.conf");
return userHome;
}
static bool
putDebian(std::vector<std::string> args)
{
std::cout << "[+] put Debian package\n";
for (auto &arg: args) {
std::cout << "\t[*] " << arg << "\n";
}
return false;
}
static bool
debianPackager(std::vector<std::string> args)
{
scsl::Commander commander;
commander.Register(scsl::Subcommand("put", 1, putDebian));
std::cout << "[+] Debian packager invoked\n";
for (auto &arg: args) {
std::cout << "\t[*] " << arg << "\n";
}
auto command = args[0];
args.erase(args.cbegin());
return commander.Run(command, args) == scsl::Subcommand::Status::OK;
}
int
main(int argc, char *argv[])
{
config.flags = new scsl::Flags("sc3dev-packager", "package tooling for shimmering clarity");
config.flags->Register("--component", "main", "Debian package component");
config.flags->Register("--distribution", "ubuntu", "Debian package distribution");
config.flags->Register("--owner", "sc", "package repository owner");
int retc;
scsl::Flags *flags;
std::string configFile = getDefaultConfigFile();
std::string owner;
std::string distribution;
std::string component;
std::string version;
auto status = config.flags->Parse(argc, argv);
flags = new scsl::Flags("sc3dev-packager", "package tooling for shimmering clarity");
flags->Register("--config", configFile, "path to a configuration file");
flags->Register("--component", "main", "Debian package component");
flags->Register("--distribution", "ubuntu", "Debian package distribution");
flags->Register("--owner", "sc", "package repository owner");
flags->Register("--version", scsl::FlagType::String, "version to operate on (only matters for delete)");
auto status = flags->Parse(argc, argv);
if (status != scsl::Flags::ParseStatus::OK) {
std::cerr << "failed to parse flags: "
<< scsl::Flags::ParseStatusToString(status)
<< "\n";
<< scsl::Flags::ParseStatusToString(status)
<< "\n";
exit(1);
}
scsl::Commander commander;
commander.Register(scsl::Subcommand("debian", 1, debianPackager));
flags->GetString("--config", configFile);
if (std::filesystem::exists(std::filesystem::path(configFile))) {
if (scsl::SimpleConfig::LoadGlobal(configFile) != 0) {
std::cerr << "[!] failed to read config file " << configFile << ".\n";
exit(1);
}
}
if (flags->GetString("--owner", owner)) {
scsl::SimpleConfig::PutGlobal("owner", owner);
}
if (flags->GetString("--distribution", distribution)) {
scsl::SimpleConfig::PutGlobal("distribution", distribution);
}
if (flags->GetString("--component", component)) {
scsl::SimpleConfig::PutGlobal("component", component);
}
if (flags->GetString("--version", version)) {
scsl::SimpleConfig::PutGlobal("version", version);
}
if (flags->NumArgs() < 1) {
std::cerr << "[!] not enough arguments provided.\n";
exit(1);
}
auto command = flags->Arg(0);
auto args = flags->Args();
args.erase(args.begin());
auto result = commander.Run(command, args);
delete flags;
switch (result) {
case scsl::Subcommand::Status::OK:
std::cout << "[+] OK\n";
retc = 0;
break;
case scsl::Subcommand::Status::NotEnoughArgs:
usage(std::cerr, 1);
break;
case scsl::Subcommand::Status::Failed:
std::cerr << "[!] '" << command << "' failed\n";
break;
case scsl::Subcommand::Status::CommandNotRegistered:
std::cerr << "[!] '" << command << "' not registered.\n";
usage(std::cerr, 1);
break;
default:
abort();
}
return retc;
}