diff options
author | Andreas Rogge <andreas.rogge@bareos.com> | 2022-10-05 11:23:09 +0300 |
---|---|---|
committer | Andreas Rogge <andreas.rogge@bareos.com> | 2022-11-07 19:37:28 +0300 |
commit | 30dc42f550b6731670c669b4c7b123addad07971 (patch) | |
tree | 2b381379501a26437e711ef147685fe3bb8a5e89 | |
parent | 7a8e50f3ea94bc886ba903bee32cabe9b2a0f214 (diff) |
stored: move device-type guessing to configparser
Previously the device-type for a device where the type was not specified
was determined when it was first used. Now we do the check for every
device right after the configuration was loaded and fail early if
needed.
9 files changed, 56 insertions, 25 deletions
diff --git a/core/src/stored/dev.cc b/core/src/stored/dev.cc index 705755c17..d9cf8f119 100644 --- a/core/src/stored/dev.cc +++ b/core/src/stored/dev.cc @@ -142,27 +142,10 @@ Device* FactoryCreateDevice(JobControlRecord* jcr, // If no device type specified, try to guess if (device_resource->dev_type == DeviceType::B_UNKNOWN_DEV) { - struct stat statp; - // Check that device is available - if (stat(device_resource->archive_device_string, &statp) < 0) { - BErrNo be; - Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"), - device_resource->archive_device_string, be.bstrerror()); - return nullptr; - } - if (S_ISDIR(statp.st_mode)) { - device_resource->dev_type = DeviceType::B_FILE_DEV; - } else if (S_ISCHR(statp.st_mode)) { - device_resource->dev_type = DeviceType::B_TAPE_DEV; - } else if (S_ISFIFO(statp.st_mode)) { - device_resource->dev_type = DeviceType::B_FIFO_DEV; - } else if (!BitIsSet(CAP_REQMOUNT, device_resource->cap_bits)) { - Jmsg2(jcr, M_ERROR, 0, - _("%s is an unknown device type. Must be tape or directory, " - "st_mode=%04o\n"), - device_resource->archive_device_string, (statp.st_mode & ~S_IFMT)); - return nullptr; - } + Jmsg2(jcr, M_ERROR, 0, + _("device type for %s was not identified. Cannot continue.\n"), + device_resource->archive_device_string); + return nullptr; } Device* dev = nullptr; diff --git a/core/src/stored/stored_conf.cc b/core/src/stored/stored_conf.cc index c183a6fd2..d3b391517 100644 --- a/core/src/stored/stored_conf.cc +++ b/core/src/stored/stored_conf.cc @@ -548,9 +548,45 @@ static void CheckDropletDevices(ConfigurationParser& my_config) } } +static void GuessMissingDeviceTypes(ConfigurationParser& my_config) +{ + BareosResource* p = nullptr; + + while ((p = my_config.GetNextRes(R_DEVICE, p)) != nullptr) { + DeviceResource* d = dynamic_cast<DeviceResource*>(p); + if (d && d->dev_type == DeviceType::B_UNKNOWN_DEV) { + struct stat statp; + // Check that device is available + if (stat(d->archive_device_string, &statp) < 0) { + BErrNo be; + Jmsg2(nullptr, M_ERROR_TERM, 0, + _("Unable to stat path '%s' for device %s: ERR=%s\n" + "Consider setting Device Type if device is not available when " + "daemon starts.\n"), + d->archive_device_string, d->resource_name_, be.bstrerror()); + return; + } + if (S_ISDIR(statp.st_mode)) { + d->dev_type = DeviceType::B_FILE_DEV; + } else if (S_ISCHR(statp.st_mode)) { + d->dev_type = DeviceType::B_TAPE_DEV; + } else if (S_ISFIFO(statp.st_mode)) { + d->dev_type = DeviceType::B_FIFO_DEV; + } else if (!BitIsSet(CAP_REQMOUNT, d->cap_bits)) { + Jmsg2(nullptr, M_ERROR_TERM, 0, + _("%s is an unknown device type. Must be tape or directory, " + "st_mode=%04o\n"), + d->archive_device_string, (statp.st_mode & ~S_IFMT)); + return; + } + } + } +} + static void ConfigReadyCallback(ConfigurationParser& my_config) { MultiplyConfiguredDevices(my_config); + GuessMissingDeviceTypes(my_config); CheckDropletDevices(my_config); } diff --git a/core/src/tests/configs/bareos-configparser-tests/bareos-sd.d/device/FileStorage.conf b/core/src/tests/configs/bareos-configparser-tests/bareos-sd.d/device/FileStorage.conf index 88c5391b4..d967bc4d6 100644 --- a/core/src/tests/configs/bareos-configparser-tests/bareos-sd.d/device/FileStorage.conf +++ b/core/src/tests/configs/bareos-configparser-tests/bareos-sd.d/device/FileStorage.conf @@ -2,6 +2,7 @@ Device { Name = FileStorage Media Type = File Archive Device = /tmp/tests/backup-bareos-test/storage + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it diff --git a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto1.conf b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto1.conf index 97a2b3d71..323c43420 100644 --- a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto1.conf +++ b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto1.conf @@ -16,6 +16,7 @@ Device { Name = auto1dev1 Media Type = File Archive Device = ./non-existent + Device Type = NoSuchBackend LabelMedia = yes Random Access = yes Autochanger = yes diff --git a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto2.conf b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto2.conf index d5a748805..ff6296683 100644 --- a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto2.conf +++ b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto2.conf @@ -1,6 +1,7 @@ Device { Name = auto2dev0 Media Type = NotFile + Device Type = File Archive Device = . LabelMedia = yes Random Access = yes @@ -14,6 +15,7 @@ Device { Device { Name = auto2dev1 Media Type = NotFile + Device Type = File Archive Device = ./non-existent LabelMedia = yes Random Access = yes @@ -26,6 +28,7 @@ Device { Device { Name = auto2dev2 Media Type = NotFile + Device Type = File Archive Device = . LabelMedia = yes Random Access = yes @@ -38,6 +41,7 @@ Device { Device { Name = auto2dev3 Media Type = NotFile + Device Type = File Archive Device = . LabelMedia = yes Random Access = yes @@ -50,6 +54,7 @@ Device { Device { Name = auto2dev4 Media Type = NotFile + Device Type = File Archive Device = . LabelMedia = yes Random Access = yes diff --git a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/single2.conf b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/single2.conf index eab446cc2..2ec9006a7 100644 --- a/core/src/tests/configs/sd_reservation/bareos-sd.d/device/single2.conf +++ b/core/src/tests/configs/sd_reservation/bareos-sd.d/device/single2.conf @@ -2,4 +2,5 @@ Device { Name = single2 Media Type = NotFile Archive Device = . + Device Type = tape } diff --git a/core/src/tests/configs/stored_multiplied_device/bareos-sd.d/device/FileStorage.conf b/core/src/tests/configs/stored_multiplied_device/bareos-sd.d/device/FileStorage.conf index d05993e6c..41776e110 100644 --- a/core/src/tests/configs/stored_multiplied_device/bareos-sd.d/device/FileStorage.conf +++ b/core/src/tests/configs/stored_multiplied_device/bareos-sd.d/device/FileStorage.conf @@ -1,7 +1,8 @@ Device { Name = MultipliedDeviceResource Media Type = File - Archive Device = /dev/null/ + Archive Device = /dev/null + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it @@ -14,7 +15,8 @@ Device { Device { Name = AnotherMultipliedDeviceResource Media Type = File - Archive Device = /dev/null/ + Archive Device = /dev/null + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it @@ -27,7 +29,8 @@ Device { Device { Name = JustADeviceResource Media Type = File - Archive Device = /dev/null/ + Archive Device = /dev/null + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it diff --git a/systemtests/tests/bconsole/etc/bareos/bconsole.conf.in b/systemtests/tests/bconsole/etc/bareos/bconsole.conf.in index 50b647c1d..df3050688 100644 --- a/systemtests/tests/bconsole/etc/bareos/bconsole.conf.in +++ b/systemtests/tests/bconsole/etc/bareos/bconsole.conf.in @@ -1,7 +1,6 @@ # # Bareos User Agent (or Console) Configuration File # - Director { Name = @basename@-dir DIRport = @dir_port@ diff --git a/systemtests/tests/copy-remote-bscan/etc/bareos-remote/bareos-sd.d/device/FileStorage.conf b/systemtests/tests/copy-remote-bscan/etc/bareos-remote/bareos-sd.d/device/FileStorage.conf index 41d7a2ea8..c78922256 100644 --- a/systemtests/tests/copy-remote-bscan/etc/bareos-remote/bareos-sd.d/device/FileStorage.conf +++ b/systemtests/tests/copy-remote-bscan/etc/bareos-remote/bareos-sd.d/device/FileStorage.conf @@ -2,6 +2,7 @@ Device { Name = RemoteFileStorage Media Type = File Archive Device = storage-remote + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it @@ -13,6 +14,7 @@ Device { Name = RemoteFileStorage2 Media Type = File Archive Device = storage2-remote + Device Type = File LabelMedia = yes; # lets Bareos label unlabeled media Random Access = yes; AutomaticMount = yes; # when device opened, read it |