#include "system_quotas.h" #include "my_type.h" namespace Quotas_sys { Quotas_sys::Quotas_sys() { map_hw_or_sw["ext2"] = "hw"; map_hw_or_sw["ext3"] = "hw"; map_hw_or_sw["nfs"] = "sw"; map_hw_or_sw["NFS"] = "sw"; } void Quotas_sys::set_map_device(map_str_str &map_device) { this->map_device = &map_device; this->check_partition_mount(); } void Quotas_sys::set_map_gui(map_str_str &map_gui) { map_gui_cfg = &map_gui; } void Quotas_sys::check_partition_mount() { string key = ""; string response = Utils::file_read("/proc/mounts"); for (const auto& iter: (*map_device)) { key = iter.first; if (response.find(key) != string::npos) { disk_mount[key] = true; } } } string Quotas_sys::wrapper_hw_sw(string partition) { if ((*map_device).find(partition) != (*map_device).end()) { string fsystem = (*map_device)[partition]; if ((*map_device).find(fsystem) != (*map_device).end()) { return map_hw_or_sw[fsystem]; } } return ""; } bool Quotas_sys::check_on_quotas_system(string cmd) { string response = obj_process_call.call_all_sections(cmd); if (response.length() > 0) { return true; } else { return false; } } struct status_quotas Quotas_sys::check_on_quotas_system_2_hw(string params) { string cmd = "quotaon -ugPvp " + params; string response = obj_process_call.call_all_sections(cmd); struct status_quotas status; if (response.length() > 0 && response.find("Cannot find mountpoint for device ") == string::npos) { status.status = true; vector vec_str = Utils::split(response, '\n'); string array_str[3] = {"group", "user", "project"}; for (int index = 0; index < 3; index++) { string u_g_p = array_str[index]; for (const string& vec_u_g_p : vec_str) { if (vec_u_g_p.find(u_g_p) != string::npos && vec_u_g_p.find("accounting") != string::npos ) { if (index == 0) { status.group = true; } else if (index == 1) { status.user = true; } else if (index == 2) { status.project = true; } } else if (vec_u_g_p.find(u_g_p) != string::npos && vec_u_g_p.find("enforced") != string::npos){ if (index == 0) { status.group = false; } else if (index == 1) { status.user = false; } else if (index == 2) { status.project = false; } } } } } else { status.group = false; status.user = false; status.project = false; status.status = false; } return status; } bool Quotas_sys::wrapper_on_quotas(string partition, string flag_mode) { // Todo // Добавить выключение квот в зависимости от диска cout << partition << "" << flag_mode << endl; if (disk_mount.find(partition) == disk_mount.end()) { } else { } return true; } bool Quotas_sys::on_quota_hw(string partition, string cmd_hw, string cmd_sw) { /* Включить квоты, только для HW ext2,3,4: Если ФС, уже существует и без HW атрибут квот ext2,3,4 Раздел должен быть отмонтирован */ if (this->wrapper_hw_sw(partition) == "hw") { obj_process_system.call(cmd_hw, ""); obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); return true; } else if (this->wrapper_hw_sw(partition) == "sw") { obj_process_system.call(cmd_sw, ""); obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); return true; } else{ return false; } return false; } bool Quotas_sys::on_quota_sw(string partition, int mode) { /* Включить квоты, только для SW, другие ФС и сетевые NFS: У этого исполнения квот отсутствуют проектные квоты prjquota Раздел должен быть примонтирован */ if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { string cmd = ""; if (mode == 0) { cmd += "mount -vo remount,usrquota " + partition; cmd += "; quotacheck -ucm " + partition; cmd += "; quotaon -uv " + partition; } else if (mode == 1) { cmd += "; mount -vo remount,grpquota " + partition; cmd += "; quotacheck -gcm " + partition; cmd += "; quotaon -gv " + partition; } else if (mode == 2) { cmd += "; quotaon -ugPv " + partition; } else if (mode == 3) { cmd += "; quotaon -augPv"; } else { return false; } cmd += "; ubconfig set config SERVICESSTART+=,quotaon.service"; obj_process_system.call(cmd, ""); return true; } return false; } bool Quotas_sys::off_quota(string partition, string quota_hw, string quota_sw) { string cmd = ""; if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { if (this->wrapper_hw_sw(partition) == "hw") { cmd = quota_hw + " " + partition; obj_process_system.call(cmd, ""); return true; } else if (this->wrapper_hw_sw(partition) == "sw") { cmd = quota_sw + " " + partition; obj_process_system.call(cmd, ""); return true; } } return false; } vector Quotas_sys::pars_data(string cmd) { string start_pars = "------\n"; string response = obj_process_call.call_all_sections(cmd); size_t index_start = response.find(start_pars); string line_pars = ""; struct data_all_quotas struct_data; vector vec_struct_data; int index = 0; int old_index = index; if (index_start != string::npos) { response = response.substr(index_start+start_pars.length(), response.length()); vector vec_index_sep = Utils::find_all(response, "\n"); for (size_t i = 0; i < vec_index_sep.size(); i++) { old_index = index; index = vec_index_sep[i]; if (index-1 == old_index) { break; } line_pars = response.substr(old_index, index); struct_data = part_quotas_line(line_pars); vec_struct_data.push_back(struct_data); } } return vec_struct_data; } struct data_all_quotas Quotas_sys::part_quotas_line(string line) { struct data_all_quotas struct_data; vector vec_index_sep = Utils::find_all(line, " "); int old_index = 0; string buff = ""; int index_data = 0; for (int& index: vec_index_sep) { if ((index - old_index) >= 2) { buff = line.substr(old_index, index - old_index); cout << buff << endl; if (index_data == 0) { struct_data.username = buff; } else if (index_data == 1) { struct_data.status = buff; } else if (index_data == 2) { struct_data.block_used = buff; } else if (index_data == 3) { struct_data.block_soft = buff; } else if (index_data == 4) { struct_data.block_hard = buff; } else if (index_data == 5) { struct_data.block_grace = buff; } else if (index_data == 6) { struct_data.file_used = buff; } else if (index_data == 7) { struct_data.file_soft = buff; } else if (index_data == 8) { struct_data.file_hard = buff; } else if (index == 9) { struct_data.file_grace = buff; } index_data += 1; } old_index = index; } if (index_data != 0) {struct_data.is_validate = true; } else {struct_data.is_validate = false; } return struct_data; } }