mirror of
https://github.com/CHN-beta/nixos.git
synced 2026-01-12 04:19:22 +08:00
localPackages.hpcstat: bug in deserialize, read from duc directly
This commit is contained in:
@@ -11,6 +11,8 @@ namespace hpcstat::disk
|
||||
std::string Time;
|
||||
using serialize = zpp::bits::members<4>;
|
||||
};
|
||||
// 刷新 duc 数据库,并读取
|
||||
std::optional<Usage> stat();
|
||||
// 刷新 duc 数据库
|
||||
bool stat();
|
||||
// 从 duc 数据库中读取数据
|
||||
std::optional<Usage> get();
|
||||
}
|
||||
|
||||
@@ -68,6 +68,4 @@ namespace hpcstat::sql
|
||||
// 如果没有找到提交时的信息,则忽略这个任务
|
||||
std::optional<std::map<unsigned, std::tuple<std::string, std::string, std::string, std::optional<std::string>>>>
|
||||
check_job_status();
|
||||
// 获取最新的磁盘使用情况
|
||||
std::optional<std::string> get_disk();
|
||||
}
|
||||
|
||||
@@ -20,14 +20,14 @@ namespace hpcstat::disk
|
||||
{ "zhanhuahan", false }
|
||||
};
|
||||
|
||||
std::optional<Usage> stat()
|
||||
bool stat()
|
||||
{
|
||||
if (auto homedir = env::env("HOME"); !homedir)
|
||||
{ std::cerr << "HOME not set\n"; return {}; }
|
||||
{ std::cerr << "HOME not set\n"; return false; }
|
||||
else if (auto ducbindir = env::env("HPCSTAT_DUC_BINDIR"); !ducbindir)
|
||||
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return {}; }
|
||||
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return false; }
|
||||
else if (auto datadir = env::env("HPCSTAT_DATADIR"); !datadir)
|
||||
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return {}; }
|
||||
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return false; }
|
||||
else if
|
||||
(
|
||||
auto result = biu::exec<{.DirectStdout = true, .DirectStderr = true}>
|
||||
@@ -38,7 +38,18 @@ namespace hpcstat::disk
|
||||
);
|
||||
!result
|
||||
)
|
||||
{ std::cerr << "failed to index\n"; return {}; }
|
||||
{ std::cerr << "failed to index\n"; return false; }
|
||||
else return true;
|
||||
}
|
||||
|
||||
std::optional<Usage> get()
|
||||
{
|
||||
if (auto homedir = env::env("HOME"); !homedir)
|
||||
{ std::cerr << "HOME not set\n"; return {}; }
|
||||
else if (auto ducbindir = env::env("HPCSTAT_DUC_BINDIR"); !ducbindir)
|
||||
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return {}; }
|
||||
else if (auto datadir = env::env("HPCSTAT_DATADIR"); !datadir)
|
||||
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return {}; }
|
||||
else
|
||||
{
|
||||
auto get_size = [&](std::optional<std::string> path) -> std::optional<double>
|
||||
@@ -87,7 +98,7 @@ namespace hpcstat::disk
|
||||
{
|
||||
std::smatch match;
|
||||
// search string like 2024-06-08 13:45:19
|
||||
if (!std::regex_search(result.Stdout, match, std::regex(R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))")))
|
||||
if (!std::regex_search(result.Stdout, match, R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))"_re))
|
||||
{ std::cerr << "failed to parse {}\n"_f(result.Stdout); return {}; }
|
||||
return match[1];
|
||||
}
|
||||
|
||||
@@ -56,12 +56,11 @@ int main(int argc, const char** argv)
|
||||
{
|
||||
std::cout << "\33[2K\rLogged in as {} (Fingerprint: SHA256:{}{}).\n"_f
|
||||
(Keys[*fp].Username, *fp, sub_account ? " Subaccount {}"_f(*sub_account) : "");
|
||||
if (auto sql_data = sql::get_disk(); !sql_data)
|
||||
if (auto disk_stat = disk::get(); !disk_stat)
|
||||
std::cerr << "Failed to get disk usage statistic.\n";
|
||||
else
|
||||
{
|
||||
auto disk_stat = biu::deserialize<disk::Usage>(*sql_data);
|
||||
double percent = disk_stat.Total / 800 * 100;
|
||||
double percent = disk_stat->Total / 800 * 100;
|
||||
auto color = percent > 95 ? termcolor::red<char> :
|
||||
percent > 80 ? termcolor::yellow<char> : termcolor::green<char>;
|
||||
auto bgcolor = percent > 95 ? termcolor::on_red<char> :
|
||||
@@ -69,15 +68,15 @@ int main(int argc, const char** argv)
|
||||
std::cout
|
||||
<< color << "disk usage: " << termcolor::reset
|
||||
<< bgcolor << termcolor::white
|
||||
<< "{:.1f}% ({:.1f}GB / ~800GB)"_f(percent, disk_stat.Total) << termcolor::reset
|
||||
<< color << " (estimated, counted at {})\n"_f(disk_stat.Time) << termcolor::reset;
|
||||
<< "{:.1f}% ({:.1f}GB / ~800GB)"_f(percent, disk_stat->Total) << termcolor::reset
|
||||
<< color << " (estimated, counted at {})\n"_f(disk_stat->Time) << termcolor::reset;
|
||||
if (percent > 80)
|
||||
{
|
||||
std::cout << color << "Top 3 directories owned by teacher:\n";
|
||||
for (auto& [name, size] : disk_stat.Teacher | ranges::views::take(3))
|
||||
for (auto& [name, size] : disk_stat->Teacher | ranges::views::take(3))
|
||||
std::cout << " {:.1f}GB {}\n"_f(size, name);
|
||||
std::cout << color << "Top 3 directories owned by student:\n";
|
||||
for (auto& [name, size] : disk_stat.Student | ranges::views::take(3))
|
||||
for (auto& [name, size] : disk_stat->Student | ranges::views::take(3))
|
||||
std::cout << " {:.1f}GB {}\n"_f(size, name);
|
||||
std::cout << termcolor::reset;
|
||||
}
|
||||
@@ -179,16 +178,7 @@ int main(int argc, const char** argv)
|
||||
}
|
||||
else if (args[1] == "version") { std::cout << HPCSTAT_VERSION << std::endl; }
|
||||
else if (args[1] == "diskstat")
|
||||
{
|
||||
if (auto stat = disk::stat(); !stat)
|
||||
{ std::cerr << "Failed to collect disk usage statistic.\n"; return 1; }
|
||||
else
|
||||
{
|
||||
lock.lock();
|
||||
if (auto write_result = sql::writedb(sql::DiskData{.Data = biu::serialize<char>(*stat)}); !write_result)
|
||||
{ std::cerr << "Failed to write disk usage statistic to database.\n"; return 1; }
|
||||
}
|
||||
}
|
||||
{ if (!disk::stat()) { std::cerr << "Failed to collect disk usage statistic.\n"; return 1; } }
|
||||
else { std::cerr << "Unknown command.\n"; return 1; }
|
||||
}
|
||||
catch (...) { std::cerr << boost::current_exception_diagnostic_information() << std::endl; return 1; }
|
||||
|
||||
@@ -68,12 +68,6 @@ namespace hpcstat::sql
|
||||
sqlite_orm::make_column("id", &CheckJobData::Id, sqlite_orm::primary_key().autoincrement()),
|
||||
sqlite_orm::make_column("job_id", &CheckJobData::JobId),
|
||||
sqlite_orm::make_column("status", &CheckJobData::Status)
|
||||
),
|
||||
sqlite_orm::make_table
|
||||
(
|
||||
"disk",
|
||||
sqlite_orm::make_column("id", &DiskData::Id, sqlite_orm::primary_key().autoincrement()),
|
||||
sqlite_orm::make_column("data", &DiskData::Data)
|
||||
)
|
||||
));};
|
||||
if (!dbfile)
|
||||
@@ -98,7 +92,6 @@ namespace hpcstat::sql
|
||||
template bool writedb(LogoutData);
|
||||
template bool writedb(SubmitJobData);
|
||||
template bool writedb(FinishJobData);
|
||||
template bool writedb(DiskData);
|
||||
std::optional<std::set<unsigned>> finishjob_remove_existed(std::map<unsigned, std::string> jobid_submit_time)
|
||||
{
|
||||
if (auto conn = connect(); !conn) return std::nullopt;
|
||||
@@ -326,16 +319,4 @@ namespace hpcstat::sql
|
||||
return result;
|
||||
}
|
||||
}
|
||||
std::optional<std::string> get_disk()
|
||||
{
|
||||
if (auto conn = connect(); !conn) return {};
|
||||
else if
|
||||
(
|
||||
auto result =
|
||||
conn->get_all<DiskData>(sqlite_orm::order_by(&DiskData::Id).desc(), sqlite_orm::limit(1));
|
||||
result.size() != 1
|
||||
)
|
||||
return {};
|
||||
else return result[0].Data;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user