Start working on basic package framework.
This commit is contained in:
161
src/packager.cc
161
src/packager.cc
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user