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());
145 std::vector<USBDevice> result;
147 struct udev *udev = udev_new();
148 if (!udev)
return result;
150 struct udev_enumerate *enumerate = udev_enumerate_new(udev);
151 if (!enumerate) { udev_unref(udev);
return result; }
153 udev_enumerate_add_match_subsystem(enumerate,
"block");
154 udev_enumerate_scan_devices(enumerate);
156 struct udev_list_entry *entries = udev_enumerate_get_list_entry(enumerate);
157 struct udev_list_entry *entry;
159 udev_list_entry_foreach(entry, entries)
161 const char *path = udev_list_entry_get_name(entry);
162 struct udev_device *dev = udev_device_new_from_syspath(udev, path);
164 const char *devtype = udev_device_get_devtype(dev);
165 if (!devtype || std::string(devtype) !=
"disk") {
166 udev_device_unref(dev);
171 struct udev_device *usb =
172 udev_device_get_parent_with_subsystem_devtype(
173 dev,
"usb",
"usb_device");
176 udev_device_unref(dev);
180 const char *size = udev_device_get_sysattr_value(dev,
"size");
181 if (!size || std::strtoull(size,
nullptr, 10) == 0) {
182 udev_device_unref(dev);
186 const char *rem = udev_device_get_sysattr_value(dev,
"removable");
187 if (!rem || std::string(rem) !=
"1") {
188 udev_device_unref(dev);
194 const char *devnode = udev_device_get_devnode(dev);
196 udev_device_unref(dev);
202 const char *vendor = udev_device_get_sysattr_value(usb,
"manufacturer");
203 const char *product = udev_device_get_sysattr_value(usb,
"product");
204 const char *serial = udev_device_get_sysattr_value(usb,
"serial");
206 if (vendor) info.
name += vendor;
208 if (!info.
name.empty()) info.
name +=
" ";
209 info.
name += product;
212 if (info.
name.empty())
215 if (serial) info.
serial = serial;
217 result.push_back(info);
219 udev_device_unref(dev);
222 udev_enumerate_unref(enumerate);
272 const std::string lang_conf = Glib::get_home_dir() +
"/.config/BastionGuard/lang.conf";
273 std::ifstream f(lang_conf);
280 while (std::getline(f, line)) {
281 if (line.empty() || line[0] ==
'#')
284 auto pos = line.find(
'=');
285 if (pos == std::string::npos)
288 std::string key = line.substr(0, pos);
289 std::string val = line.substr(pos + 1);
291 auto ltrim = [](std::string& s){
292 s.erase(0, s.find_first_not_of(
" \t\r\n"));
294 auto rtrim = [](std::string& s){
295 s.erase(s.find_last_not_of(
" \t\r\n") + 1);
297 ltrim(key); rtrim(key);
298 ltrim(val); rtrim(val);
300 if (!key.empty() && !val.empty()) {
301 setenv(key.c_str(), val.c_str(), 1);
313 std::setlocale(LC_ALL,
"");
314 bindtextdomain(
"BastionGuard",
LOCALEDIR);
315 bind_textdomain_codeset(
"BastionGuard",
"UTF-8");
316 textdomain(
"BastionGuard");
319 std::cerr <<
_(
"[Lang] Config caricata da ~/.config/BastionGuard/lang.conf") <<
"\n";
321 std::cerr <<
_(
"[Lang] Nessuna config trovata, uso locale di sistema") <<
"\n";
328 GError* dbus_error =
nullptr;
329 bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM,
nullptr, &dbus_error);
331 std::cerr <<
_(
"Errore apertura system bus: ")
332 << (dbus_error ? dbus_error->message :
_(
"errore sconosciuto"))
334 if (dbus_error) g_error_free(dbus_error);
338 GVariant* request_reply = g_dbus_connection_call_sync(
340 "org.freedesktop.DBus",
341 "/org/freedesktop/DBus",
342 "org.freedesktop.DBus",
344 g_variant_new(
"(su)",
"org.BastionGuard.USBD", 0u),
345 G_VARIANT_TYPE(
"(u)"),
346 G_DBUS_CALL_FLAGS_NONE,
351 if (!request_reply) {
352 std::cerr <<
_(
"Errore registrazione nome DBus: ")
353 << (dbus_error ? dbus_error->message :
_(
"errore sconosciuto"))
355 if (dbus_error) g_error_free(dbus_error);
361 guint32 request_result = 0;
362 g_variant_get(request_reply,
"(u)", &request_result);
363 g_variant_unref(request_reply);
364 if (request_result != 1u && request_result != 4u) {
365 std::cerr <<
_(
"Nome DBus org.BastionGuard.USBD già occupato.\n");
376 std::this_thread::sleep_for(std::chrono::seconds(1));
378 if (th.joinable()) th.join();