47 std::lock_guard<std::mutex> lock(
log_mutex);
53 base_dir =
"/var/log/BastionGuard";
55 base_dir = Glib::get_home_dir() +
"/.local/share/BastionGuard/logs";
57 if (!fs::exists(base_dir))
58 fs::create_directories(base_dir);
60 auto now = std::time(
nullptr);
62 localtime_r(&now, &tm);
65 std::strftime(datebuf,
sizeof(datebuf),
"%Y-%m-%d", &tm);
67 std::string log_path = base_dir +
"/usbd_" + datebuf +
".log";
68 std::ofstream f(log_path, std::ios::app);
69 if (!f.is_open())
return;
72 std::strftime(timebuf,
sizeof(timebuf),
"%H:%M:%S", &tm);
74 f <<
"[" << timebuf <<
"] " << msg << std::endl;
76 const auto sys_now = std::chrono::system_clock::now();
77 const auto limit = std::chrono::hours(24 * 7);
79 for (
const auto& entry : fs::directory_iterator(base_dir)) {
80 if (!entry.is_regular_file())
continue;
82 auto ftime = entry.last_write_time();
83 auto sys_time = std::chrono::time_point_cast<std::chrono::system_clock::duration>(
84 ftime - fs::file_time_type::clock::now() + sys_now
87 if (sys_now - sys_time > limit)
88 fs::remove(entry.path());
137 std::vector<USBDevice> result;
139 struct udev *udev = udev_new();
140 if (!udev)
return result;
142 struct udev_enumerate *enumerate = udev_enumerate_new(udev);
143 if (!enumerate) { udev_unref(udev);
return result; }
145 udev_enumerate_add_match_subsystem(enumerate,
"block");
146 udev_enumerate_scan_devices(enumerate);
148 struct udev_list_entry *entries = udev_enumerate_get_list_entry(enumerate);
149 struct udev_list_entry *entry;
151 udev_list_entry_foreach(entry, entries)
153 const char *path = udev_list_entry_get_name(entry);
154 struct udev_device *dev = udev_device_new_from_syspath(udev, path);
156 const char *devtype = udev_device_get_devtype(dev);
157 if (!devtype || std::string(devtype) !=
"disk") {
158 udev_device_unref(dev);
163 struct udev_device *usb =
164 udev_device_get_parent_with_subsystem_devtype(
165 dev,
"usb",
"usb_device");
168 udev_device_unref(dev);
172 const char *size = udev_device_get_sysattr_value(dev,
"size");
173 if (!size || std::strtoull(size,
nullptr, 10) == 0) {
174 udev_device_unref(dev);
178 const char *rem = udev_device_get_sysattr_value(dev,
"removable");
179 if (!rem || std::string(rem) !=
"1") {
180 udev_device_unref(dev);
186 const char *devnode = udev_device_get_devnode(dev);
188 udev_device_unref(dev);
194 const char *vendor = udev_device_get_sysattr_value(usb,
"manufacturer");
195 const char *product = udev_device_get_sysattr_value(usb,
"product");
196 const char *serial = udev_device_get_sysattr_value(usb,
"serial");
198 if (vendor) info.
name += vendor;
200 if (!info.
name.empty()) info.
name +=
" ";
201 info.
name += product;
204 if (info.
name.empty())
207 if (serial) info.
serial = serial;
209 result.push_back(info);
211 udev_device_unref(dev);
214 udev_enumerate_unref(enumerate);
264 const std::string lang_conf = Glib::get_home_dir() +
"/.config/BastionGuard/lang.conf";
265 std::ifstream f(lang_conf);
272 while (std::getline(f, line)) {
273 if (line.empty() || line[0] ==
'#')
276 auto pos = line.find(
'=');
277 if (pos == std::string::npos)
280 std::string key = line.substr(0, pos);
281 std::string val = line.substr(pos + 1);
283 auto ltrim = [](std::string& s){
284 s.erase(0, s.find_first_not_of(
" \t\r\n"));
286 auto rtrim = [](std::string& s){
287 s.erase(s.find_last_not_of(
" \t\r\n") + 1);
289 ltrim(key); rtrim(key);
290 ltrim(val); rtrim(val);
292 if (!key.empty() && !val.empty()) {
293 setenv(key.c_str(), val.c_str(), 1);