Skip to content

Commit

Permalink
Update oracular apt output
Browse files Browse the repository at this point in the history
  • Loading branch information
dheyay committed Nov 6, 2024
1 parent 898f2cd commit 1374aac
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 40 deletions.
86 changes: 50 additions & 36 deletions apt-hook/json-hook.cc
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,32 @@ bool version_from_origin_and_archive_ends_with(json_object *version, std::string
return false;
}

release_info get_release_info() {
release_info info = {"", "", false};
std::ifstream machine_series_file("/etc/lsb-release");
if (machine_series_file.is_open()) {
std::string currentLine;
while(std::getline(machine_series_file, currentLine)) {
size_t position = currentLine.find("="); // Find position of equals sign as separator
std::string key = currentLine.substr(0, position);
std::string value = currentLine.substr(position + 1);

if (!value.empty() && value.front() == '"' && value.back() == '"') {
value = value.substr(1, value.length() - 2);
}

if (key=="DISTRIB_RELEASE") {
info.release = value;
} else if (key == "DISTRIB_CODENAME") {
info.series = value;
} else if (key == "DISTRIB_DESCRIPTION" && value.find("LTS") != std::string::npos) {
info.is_lts = true;
}
}
}
return info;
}

bool count_security_packages_from_apt_stats_json(json_object *stats, security_package_counts &result) {
bool has_key = false;
result.standard = 0;
Expand Down Expand Up @@ -236,18 +262,20 @@ bool collect_pro_packages_from_pre_prompt_json(json_object *pre_prompt, std::vec
#define MAX_COUNT_MESSAGE_LEN 256
std::string create_count_message(security_package_counts &counts) {
char buf[MAX_COUNT_MESSAGE_LEN] = {0};
release_info info = get_release_info();
std::string lts_text = info.is_lts ? "LTS " : "";

if (counts.esm_apps == 0) {
if (counts.esm_infra == 0) {
if (counts.standard == 0) {
return "";
} else if (counts.standard == 1) {
return std::string(gettext("1 standard LTS security update"));
return std::string(gettext("1 standard ")) + lts_text + gettext("security update");
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates")).c_str(),
counts.standard
);
return std::string(buf);
Expand All @@ -256,12 +284,12 @@ std::string create_count_message(security_package_counts &counts) {
if (counts.standard == 0) {
return std::string(gettext("1 esm-infra security update"));
} else if (counts.standard == 1) {
return std::string(gettext("1 standard LTS security update and 1 esm-infra security update"));
return std::string(gettext("1 standard ")) + lts_text + gettext("security update and 1 esm-infra security update");
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates and 1 esm-infra security update"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates and 1 esm-infra security update")).c_str(),
counts.standard
);
return std::string(buf);
Expand All @@ -279,15 +307,15 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("1 standard LTS security update and %lu esm-infra security updates"),
(std::string(gettext("1 standard ")) + lts_text + gettext("security update and %lu esm-infra security updates")).c_str(),
counts.esm_infra
);
return std::string(buf);
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates and %lu esm-infra security updates"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates and %lu esm-infra security updates")).c_str(),
counts.standard,
counts.esm_infra
);
Expand All @@ -299,12 +327,12 @@ std::string create_count_message(security_package_counts &counts) {
if (counts.standard == 0) {
return std::string(gettext("1 esm-apps security update"));
} else if (counts.standard == 1) {
return std::string(gettext("1 standard LTS security update and 1 esm-apps security update"));
return std::string(gettext("1 standard ")) + lts_text + gettext("security update and 1 esm-apps security update");
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates and 1 esm-apps security update"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates and 1 esm-apps security update")).c_str(),
counts.standard
);
return std::string(buf);
Expand All @@ -313,12 +341,12 @@ std::string create_count_message(security_package_counts &counts) {
if (counts.standard == 0) {
return std::string(gettext("1 esm-infra security update and 1 esm-apps security update"));
} else if (counts.standard == 1) {
return std::string(gettext("1 standard LTS security update, 1 esm-infra security update and 1 esm-apps security update"));
return std::string(gettext("1 standard ")) + lts_text + gettext("security update, 1 esm-infra security update and 1 esm-apps security update");
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates, 1 esm-infra security update and 1 esm-apps security update"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates, 1 esm-infra security update and 1 esm-apps security update")).c_str(),
counts.standard
);
return std::string(buf);
Expand All @@ -336,15 +364,15 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("1 standard LTS security update, %lu esm-infra security updates and 1 esm-apps security update"),
(std::string(gettext("1 standard ")) + lts_text + gettext("security update, %lu esm-infra security updates and 1 esm-apps security update")).c_str(),
counts.esm_infra
);
return std::string(buf);
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates, %lu esm-infra security updates and 1 esm-apps security update"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates, %lu esm-infra security updates and 1 esm-apps security update")).c_str(),
counts.standard,
counts.esm_infra
);
Expand All @@ -365,15 +393,15 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("1 standard LTS security update and %lu esm-apps security updates"),
(std::string(gettext("1 standard ")) + lts_text + gettext("security update and %lu esm-apps security updates")).c_str(),
counts.esm_apps
);
return std::string(buf);
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates and %lu esm-apps security updates"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates and %lu esm-apps security updates")).c_str(),
counts.standard,
counts.esm_apps
);
Expand All @@ -392,15 +420,15 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("1 standard LTS security update, 1 esm-infra security update and %lu esm-apps security updates"),
(std::string(gettext("1 standard ")) + lts_text + gettext("security update, 1 esm-infra security update and %lu esm-apps security updates")).c_str(),
counts.esm_apps
);
return std::string(buf);
} else if (counts.standard > 1) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates, 1 esm-infra security update and %lu esm-apps security updates"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates, 1 esm-infra security update and %lu esm-apps security updates")).c_str(),
counts.standard,
counts.esm_apps
);
Expand All @@ -420,7 +448,7 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("1 standard LTS security update, %lu esm-infra security updates and %lu esm-apps security updates"),
(std::string(gettext("1 standard ")) + lts_text + gettext("security update, %lu esm-infra security updates and %lu esm-apps security updates")).c_str(),
counts.esm_infra,
counts.esm_apps
);
Expand All @@ -429,7 +457,7 @@ std::string create_count_message(security_package_counts &counts) {
std::snprintf(
buf,
MAX_COUNT_MESSAGE_LEN,
gettext("%lu standard LTS security updates, %lu esm-infra security updates and %lu esm-apps security updates"),
(std::string(gettext("%lu standard ")) + lts_text + gettext("security updates, %lu esm-infra security updates and %lu esm-apps security updates")).c_str(),
counts.standard,
counts.esm_infra,
counts.esm_apps
Expand Down Expand Up @@ -478,20 +506,6 @@ ESMInfraSeries get_esm_infra_series() {
return ret;
}

std::string get_machine_series() {
std::ifstream machine_series_file("/etc/lsb-release");
std::vector<std::string> series_names = {"xenial", "bionic", "focal", "jammy", "noble", "oracular"};
if (machine_series_file.is_open()) {
std::string file_contents((std::istreambuf_iterator<char>(machine_series_file)), (std::istreambuf_iterator<char>()));
for (const auto &series_name : series_names) {
if (file_contents.find(series_name) != file_contents.npos) {
return series_name;
}
}
}
return "";
}

void print_learn_more_with_context() {
CloudID cloud_id = get_cloud_id();
ESMInfraSeries esm_infra_series = get_esm_infra_series();
Expand Down Expand Up @@ -578,9 +592,9 @@ void print_learn_more_with_context() {
}

void print_package_names(std::vector<std::string> package_names) {
std::string machine_series = get_machine_series();
release_info info = get_release_info();
std::string curr_line = " ";
if (machine_series != "" && machine_series == "oracular") {
if (info.release != "" && info.release >= "24.10") {
curr_line = " ";
}
for (std::string &name : package_names) {
Expand Down Expand Up @@ -708,10 +722,10 @@ int run()
security_package_counts counts;
success = count_security_packages_from_apt_stats_json(hook_req.params, counts);
if (success) {
release_info info = get_release_info();
std::string message = create_count_message(counts);
std::string machine_series = get_machine_series();
if (message != "") {
if (machine_series != "" && machine_series == "oracular") {
if (info.release != "" && info.release >= "24.10") {
std::cout << " " << message << std::endl;
}
else {
Expand Down
6 changes: 6 additions & 0 deletions apt-hook/json-hook.hh
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,16 @@ struct security_package_counts {
long unsigned int esm_infra;
long unsigned int esm_apps;
};
struct release_info {
std::string release; // e.g. "24.04"
std::string series; // e.g. "noble"
bool is_lts; // true for LTS releases
};

enum ESMType {APPS, INFRA};

bool read_jsonrpc_request(std::istream &in, jsonrpc_request &req);
release_info get_release_info();
bool string_ends_with(std::string str, std::string ends_with);
bool version_from_origin_and_archive_ends_with(json_object *version, std::string from_origin, std::string archive_ends_with);
bool count_security_packages_from_apt_stats_json(json_object *stats, security_package_counts &result);
Expand Down
8 changes: 4 additions & 4 deletions uaclient/apt_news.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,12 +265,12 @@ def local_apt_news(cfg: UAConfig) -> Optional[str]:
def format_news_for_apt_update(news: str) -> str:
if system.get_release_info().series == "oracular":
prefix = "\nAPT news:"
lines = [f" {line}" for line in news.split("\n")]
return f"{prefix}\n{chr(10).join(lines)}\n\n"
lines = [" " + line for line in news.split("\n")]
return "{0}\n{1}\n\n".format(prefix, "\n".join(lines))
else:
prefix = "#"
lines = [f"{prefix} {line}" for line in news.split("\n")]
return f"{prefix}\n{chr(10).join(lines)}\n{prefix}\n"
lines = [prefix + " " + line for line in news.split("\n")]
return "{0}\n{1}\n{0}\n".format(prefix, "\n".join(lines))


def update_apt_news(cfg: UAConfig):
Expand Down

0 comments on commit 1374aac

Please sign in to comment.