Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bareos/bareos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rogge <andreas.rogge@bareos.com>2022-10-05 11:23:09 +0300
committerAndreas Rogge <andreas.rogge@bareos.com>2022-11-07 19:37:28 +0300
commit30dc42f550b6731670c669b4c7b123addad07971 (patch)
tree2b381379501a26437e711ef147685fe3bb8a5e89
parent7a8e50f3ea94bc886ba903bee32cabe9b2a0f214 (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.
-rw-r--r--core/src/stored/dev.cc25
-rw-r--r--core/src/stored/stored_conf.cc36
-rw-r--r--core/src/tests/configs/bareos-configparser-tests/bareos-sd.d/device/FileStorage.conf1
-rw-r--r--core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto1.conf1
-rw-r--r--core/src/tests/configs/sd_reservation/bareos-sd.d/device/auto2.conf5
-rw-r--r--core/src/tests/configs/sd_reservation/bareos-sd.d/device/single2.conf1
-rw-r--r--core/src/tests/configs/stored_multiplied_device/bareos-sd.d/device/FileStorage.conf9
-rw-r--r--systemtests/tests/bconsole/etc/bareos/bconsole.conf.in1
-rw-r--r--systemtests/tests/copy-remote-bscan/etc/bareos-remote/bareos-sd.d/device/FileStorage.conf2
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